NLP处理流程
分词
前向最大匹配(Forward max matching)
例子:我们经常有意见分歧
1.先设定一个max_len=5,并且有一个词典。
2.取出前max_len个词“我们经常有”,在词典中寻找该词,若无,则去匹配"我们经常",…,知道匹配到“我们”。
3.接着按照max_len取出"经常有意见",同样的是5个词,重复上面操作,找到词典中有的词"意见"。
…
4.直到分完这个句子。
代码实现:
def forward_max_match(input_word,dic_words=dic_words,window_size=5):
"""前向最大匹配"""
result=[]
index=0
text_size=len(input_word)
while text_size>index:
for size in range(window_size+index,index,-1):
piece=input_word[index:size]
if piece in dic_words:
index=size-1
break
index+=1
result.append(piece)
return result
forward_max_match("北京的天气真好啊")
后向最大匹配(Backward max matching)
后向最大匹配则是从后往前的
def backward_max_match(input_word,dic_words=dic_words,window_size=5):
"""后向最大匹配"""
result=[]
index=len(input_word)
window_size=min(index,window_size)
while index>0:
for size in range(index-window_size,index):
piece=input_word[size:index]
if piece in dic_words:
index=size+1
break
index-=1
result.append(piece)
return result
backward_max_match("北京的天气真好啊")
前向最大匹配和后向最大匹配的缺点
这两个方法只关注到了单词形式上的意思,并没有考虑到句子以及语义。
一个好的分词 不仅要考虑单词、更要在句子甚至语义
考虑语义的分词
首先先将一个句子,分割成所有可能的形式,然后利用语言模型输出概率最高的分词结果。(注:这种方法其实存在一个效率问题,分成了2个步骤,可以使用维比特算法优化,以后再补充)
纠错
如果是输入的文本有错,就需要就行纠错操作。
例子:
假设输入了一个__therr__,而词典中有there、their、thesis、theirs和the,由此计算编辑距离。编辑距离是将有误的单词转化成正确的单词所需要的步骤,(插入、替换、删除都算一个编辑距离),图中这5个单词的编辑距离为1,1,3,2,2
而如果将所有的词典全都遍历一遍,计算量太高,
因此可以将有误的单词,首先生成编辑距离为1,2的字符串,再进行过滤操作,选择最好的一个单词。
如何过滤和选择?
预备知识:贝叶斯公式
p ( x , y ) = p ( x ∣ y ) p ( y ) = p ( y ∣ x ) p ( x ) p(x,y)=p(x|y)p(y)=p(y|x)p(x) p(x,y)=p(x∣y)p(y)=p(y∣x)p(x)
p ( x , y ) = p ( y ∣ x ) p ( x ) p ( y ) p(x,y)=\displaystyle\frac{p(y|x)p(x)}{p(y)} p(x,y)=p(y)p(y∣x)p(x)
图中, p ( s ) p(s) p(s)是一个常量, p ( s ∣ c ) p(s|c) p(s∣c)是在过往的历史中,输错的形式出现的概率, p ( c ) p(c) p(c)是词库中单词出现的概率(Unigram的概率)
词向量表示
假设又一个大词典,词典中有
[我们,又,去,爬山,今天,你们,昨天,跑步]
One-hot编码
每个单词的编码:(8维=词典的维度)
我们:(1,0,0,0,0,0,0,0)
爬山:(0,0,0,1,0,0,0,0)
跑步:(0,0,0,0,0,0,0,1)
昨天:(0,0,0,0,0,0,1,0)
One-hot编码(boolean)
每个句子的表示:(8维=词典的维度)
(S1)我们 今天 去 爬山:(1,0,1,1,1,0,0,0)
(S2)你们 昨天 跑步:(0,0,0,0,0,1,1,1)
(S3)你们 又 去 爬山 又 去 跑步:(0,1,1,1,0,1,0,1)
One-hot编码(count)
(S1)我们 今天 去 爬山:(1,0,1,1,1,0,0,0)
(S2)你们 昨天 跑步:(0,0,0,0,0,1,1,1)
(S3)你们 又 去 爬山 又 去 跑步:(0,2,2,1,0,1,0,1)
词义相似度计算
欧式距离
d ( x , y ) = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + ⋯ + ( x n − y n ) 2 = ∑ i = 1 n ( x i − y i ) 2 d(x, y)=\sqrt{\left(x_{1}-y_{1}\right)^{2}+\left(x_{2}-y_{2}\right)^{2}+\cdots+\left(x_{n}-y_{n}\right)^{2}}=\sqrt{\sum_{i=1}^{n}\left(x_{i}-y_{i}\right)^{2}} d(x,y)=(x1−y1)