如何利用jieba分词加知识图谱的方式来做问答系统

解决思路:

1. 首先利用结巴分词对用户的输入做名词实体挖掘处理,目的是为了挖掘出客户想要寻找的那个对象。

在试验的过程中你可能会发现jieba并不能很好的分辨出你想要的对象,这时你需要定义自己的名词实体。

如上图所示,第一列是你想新增的实体名词,第是词频,第3列是词性,n表示名词

jieba.load_userdict("add_dict.txt")
print(jieba.analyse.extract_tags(sentence1, topK=1, withWeight=True, allowPOS=('n')))
import jieba
jieba.load_userdict("add_dict.txt")
sentence1 = 'e生宝的购买流程是什么样的。'
print(jieba.analyse.extract_tags(sentence1, topK=1, withWeight=True, allowPOS=('n')))

通过上面的方式就可以识别出你关注的实体名词了。

但是上面的方式有个问题,如果句子出现其他名词,它的评分要高于你想要的名词,这种情况可能会出现误选。

还有种方式是,利用jieba的分词功能,将句子做分词处理,得到词数组。提前准备要自己的名词实体库,存放在字典A中。

遍历词数组中的词,若存在字典A中就是目标词。

 

2. 将剩余句子中的词和实体的属性做相识度匹配,匹配到的属性就是返回给用户的答案了。

 

思考问题:

1. jieba分词使用的原理是什么?

2. jieba名词实体识别的原理是什么?

jieba分词的原理

1.使用trie树,也就是前缀树,这个前缀树在jieba代码中的实现是通过字典实现的。这个字典的key是词,value是这个词出现的对应的频率。如果说对‘实体’这个词,这个字典中存放的键值对就有{‘实’: V}, {‘实体’: V}, {‘体’: V}, 这种形式的字典,你可以称它为前缀树也可以称他为前缀字典。

2. 关于分词的预测模型,从jieba中的开关的命名方式(HMM=True)中可以看出它是想用HMM隐马尔科夫算法来做分词的。

for idx in xrange(N - 1, -1, -1):
    route[idx] = max((log(self.FREQ.get(sentence[idx:x + 1]) or 1) -
                      logtotal + route[x + 1][0], x) for x in DAG[idx])

但是通过上面部分的源码(0.39版本)可以知道,jieba其实利用的是朴素贝叶斯的思想,字符串中的字符之间的关系是相互独立,不互相影响的。'X电饭煲'在字典中存在下面的键值对,{‘电’:30},{‘电饭’:20},{‘电饭煲’:10},{‘饭’:30},{‘煲’:30},总词频是1000。那么对应的频率分别是:电:0.03,电饭:0.02,电饭煲:0.01,饭0.03,煲:0.03.

那么存在下面3中分词方式:{电}{饭}{煲}=0.03*0.03*0.03,{电饭}{煲}=0.02*0.03,{电饭煲}=0.01,可以选概率最大的方式最为分词方式。

jieba名词提取的原理

实现步骤:

1. 对短句进行分词

2. 获取到每个分词的词性

3. 计算每个词的重要性,按重要性排序,选取排在前面的k个

for k in freq:
    kw = k.word if allowPOS and withFlag else k
    freq[k] *= self.idf_freq.get(kw, self.median_idf) / total

由上面的代码可以知道jieba中有个字典结构的对象存放了词的重要性,而对于新词的重要性,采用取中位数的方式给它赋值。

重要性的评价指标是使用tf-idf来评判的。重要性指标存放在idf.txt文件中。

 

再次思考:改进方式可以是什么呢?条件随机场的方式来效果会更好。

首先了解下什么是条件随机场crf。

想搞清楚什么是条件随机场必须先知道两个概念。第一个是随机场,第二个是马尔科夫随机场。

举词性标注的例子。假如我们有一个十个词形成的句子需要做词性标注。这十个词每个词的词性可以在我们已知的词性集合(名词,动词……)中去选择。当我们为每个词选择完词性后,这就形成了一个随机场。

了解了随机场,我们再来看看马尔科夫随机场。马尔科夫随机场是随机场的特例,它假设随机场中某一个位置的赋值仅仅与和它相邻的位置的赋值有关,和与其不相邻的位置的赋值无关。比如第三个词的词性除了与自己本身的位置有关外,还只与第二个词和第四个词的词性有关。

理解了马尔科夫随机场,再理解 CRF 就容易了。CRF 是马尔科夫随机场的特例,它假设马尔科夫随机场中只有 X 和 Y 两种变量,X 一般是给定的,而 Y 一般是在给定 X 的条件下我们的输出。这样马尔科夫随机场就特化成了条件随机场。

下面通过一个例子来了解下crf。

这个例子是通过利用crf模型来做名词实体识别的任务。

链接:https://pan.baidu.com/s/1mkGX-0qp9bEMGnzWxhbYMA 
提取码:eeyz

任务的关键点在于数据清理部分。

数据清理的主要目标是为了将词对应的BIO模型,即名词的开头为B其余部分是I,其它的非名词部分用O表示。并且相对于隐马尔科夫的模型的单特征而言,条件随机场是多特征的。在例子中,特征包括,当前字,前位字,后卫字,当前字和前位字组合,当前字和后位字组合。预测的算法依然是基于vertbi算法,将概率最大的隐状态作为预测结果。

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值