上节简单学习了问答系统的一般步骤,这节主要学习问答系统的数据清洗步骤,包含以下知识点:
- word segmentation 分词
- 纠错
- 停用词剔除
- 词干提取(stemming)
分词
常用工具
结巴分词\snowNLP\LTP...
分词方法1: max matching(最大匹配)
前向(后项)最大匹配 forward(backward)-max matching
从左到右,逐步去掉右部(底部)的字进行新一轮匹配,逆向匹配:从右到左,逐步去掉左部(底部)的字进行新一轮匹配
例子
假定我们的字典中的相关内容如下:
[研究 研究生 生命 命 的 起源]
句子如下:
研究生命的起源
正向最大匹配过程:
-
假设句子的最大长度为5
-
研究生命的(5) 研究生命(4) 研究生
第一个词匹配成功 -
命的起源(4) 命的起(3) 命的(2) [命 ] (1) (最大没有5所以从4开始)
第二个词匹配成功,一个单字 -
的起源(3) 的起(2) 的
第三个词匹配成功 -
起源
第四个词匹配成功
那么正向最大匹配的结果就是: 研究生 命 的 起源
最大匹配的缺点
- 不能细分词, 细分词可能会更好;
- 由于是贪心的局部最优;
- 效率低(max len设置的越长效率越低)
- 歧义(没有语义,知识单词角度)
分词考虑的层次从低到高为: 单词->句法->语义, 最大匹配只属于第一个层次.
分词方法2: incorporate semantic 语义
考虑语义的方法的步骤为:
输入-> 生成所有的分割->选择其中最好的
那么,如何选择其中最好的呢?
基于概率统计的方法(LM, HMM, CRF)
Language model - unigram model
将句子的每种分割用每个分割词的概率的乘积来评估, 选择概率最大的即可
image.png
注:一般情况下, p值都是很低的会导致精度问题, 所以用的方式来处理.
分词方法3: 维特比算法
上一节学习的流程中, 分词流程和选择最好的流程是分开的, 如果我们将分词和选择最优的步骤合并是否可以取得更好的效果?是的, 维特比算法可以. 维特比算法是nlp领域比较重要的基础算法.
维特比算法(Viterbi algorithm)是一种动态规划算法。它用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中。
术语“维特比路径”和“维特比算法”也被用于寻找观察结果最有可能解释相关的动态规划算法。例如在统计句法分析中动态规划算法可以被用于发现最可能的上下文无关的派生(解析)的字符串,有时被称为“维特比分析”。
算法例子
- 得到每个词在词典里的概率,并转化为
- 我们将一句话通过前向(后项)匹配得到虽所有的分词组合,然后通过下图标注出所有的值(),
image.png - 找到最短路径
例如,是指从节点1到8的最短路径是什么, 如下几个公式,那么这个问题就变成了一个递归的问题
伪代码是
f[1] = 0 #存储到第i个节点的最短路径长度
p[1] = 0 #存储到第i个节点前一个节点j是什么
for i = 2...8 # 遍历每个目标节点
best_score = MAX
for j in incoming links # 遍历每个节点的入度节点
score = f(j) + w(j -> i) #入度节点的最短路径加j->i的距离
if score < best_score:
swap(score, best_score)
f(i) = best_score
p[i] = j
# 最短路径f(j) 中的j定是小于i的,因为是从前到后遍历。
# 需要事先准备好每个通路的距离矩阵w(j->i)
详细请学习: https://www.zhihu.com/question/20136144
词性标注的例子:https://www.jianshu.com/p/352447418e25
公式
维特比公式来源:知乎
网友评论