本文内容为贪心学院NLP课程的个人总结。
大纲:
- 拼写错误纠正
- 词汇过滤
- 文本表示
- 文本相似度计算
拼写错误纠正(小案例)
拼写错误纠正:spell correction。根据用户的错误输入产生理应正确的输出。譬如天起(输入) --> 天气(输出),theris --> theirs,机器学系 --> 机器学习等。
方法:根据用户输入计算编辑距离。
编辑距离
编辑距离:edit distance。编辑距离的计算是指通过插入(insert)、删除(delete)和替换(操作让词2变为词1。每个操作的成本为1。
例子:
输入 | 目标 | 成本 |
---|---|---|
therr | there | 1 [替换r为e] |
their | 1 [替换r为i] | |
thesis | 3 [替换r,r为s,i,插入一个s] |
编辑距离的编程实现:计算编辑距离的编程是动态规划问题。
LeetCode:计算最小编辑距离
如何确定编辑距离最小的词?
方法1: 把词典中的所有词都循环一遍,计算与输入的编辑距离,输出编辑距离最小的词。但是时间复杂度较高,O(V),其中V是词库所有词汇的数量。
方法2:根据用户的输入,生成编辑距离为1和2的字符串,通过过滤的方式来选择输出。这里过滤的意思是指计算出现每个编辑距离为1和2字符串的概率,选择概率最大的一个来作为输出。
如何生成编辑距离为1或者2的字符串?
- 编辑距离为1:通过增、删、改的方式变动输入的一个字符。
- 编辑距离为2:在编辑距离为1的基础上再次进行增、删、改(可能会回到原先的输入)。
- 问题?时间复杂度会不会很高?
如何过滤?
使用贝叶斯公式。
简而言之,给定用户的输入,我们想要找到词典中的词汇,使得的概率最大。
是指产生用户输入内容的概率。我们可以把它视作常数项(因为不受的影响)。
是指给定一个词典中的词汇,被写成的概率,通俗理解是指给定某个词,将这个词输入成另一个词的概率。这个概率我们可以从历史数据得出(e.g. 用户日志)。
是指词汇出现的概率。我们更偏向于选择更常用的单词。因为经常出现的单词更有可能是用户所要表达的。
词汇过滤
在对文本进行处理时,我们还需要把停用词以及出现频率低的词进行过滤。
停用词
停用词(stop words) 是指对理解文本没有作用的词。英文里面的a/the/an等,中文里面的比如一方面,一旦等。中文常用停用词表:哈工大停用词表、百度停用词表等。我们可以把对特征词的筛选理解为特征筛选的过程。
但是停用词的筛选也需要考虑应用场景。通常情况下的做法是在停用词库的基础之上进行增删,来创建针对不同应用场景下的专属停用词库。
低频词
低频词(low frequency words) 是指出现频率比较低的词汇。出现频率很低的词汇通常对文本的理解、分析没有很大的重要性,所以一般都会去掉。我们甚至可以把这些词汇理解为outliers。
我们在把停用词和出现频率比较低的词汇过滤掉之后,即可得到一个词典库。
stemming/ Lemmazation
需要注意的是如果处理的是英文词汇,还需要进行stemming或者lemmazation的过程,也就是标准化的过程。例如英文动词有不同的时态,这个标准化的过程就是将这些所有意思类似的单词合并为一个(e.g. went/ gone/ going --> go)。
Stemming是通过一系列语言学家规定好的规则来对词汇进行转换,e.g. 改变后缀,因此他不能够保证还原出来的词汇是存在或者有效的原形。
Lemmazation则是能够保证还原之后的单词是有效的。
小结:
总结一下处理英文文本数据预处理的pipeline。阅读材料
- Capitalization:统一大小写
- Stopwords:删除停用词。
- Tokenization:分词。
- Stemming or Lemmazation:标准化。
- Word embedding/ Text vectors:将词汇用向量表示。
文本表示
词汇表示
对于词汇的表示,我们使用独热编码的形式:one-hot representation/ encoding。向量的长度等于词典的大小。
例子:
词典:[我们,去,爬山,今天,你们,昨天,跑步]
我们: --> 7维向量
爬山: --> 7维向量
跑步: --> 7维向量
昨天: --> 7维向量
句子(文本)表示
布尔表示
布尔表示:boolean representation。向量的长度等于词典的大小。
例子:
词典:[我们,又,去,爬山,今天,你们,昨天,跑步]
我们/今天/去/爬山:
--> 8维向量
你们/昨天/跑步:
--> 8维向量
你们/又/去/爬山/又/去/跑步
--> 8维向量
需要注意的是最后一句话中尽管出现了两次“又”和“去”,但我们在向量中仍记为1。因为这是boolean representation:1 or 0。
计数表示
计数表示:count representation。向量的长度等于词典的大小。计数表示和布尔表示的唯一不同之处在于它会反映出每个单词出现的频率。
例子:
你们/又/去/爬山/又/去/跑步
--> 8维向量
缺点: 并不是出现的词汇越多越重要,并不是出现的词汇越少就越不重要。
Tf-idf 表示
Tf-idf表示:tf-idf representation, abbreviation for Term Frequency-Inverse Document Frequency。
Term Frequency
我们假设单词的出现频率越高意味着在给定文本中具有更高的重要性,但是如果我们语料库中的文档大小不同怎么办?在这种情况下,较大的文档自然会比较小的文档出现更多的单词。因此,更好的表示形式是用文档的大小来对出现词汇的频率做标准化,称为术语频率。
tf(w) = doc.count(w)/total words in doc
w表示某个句子中出现的词汇。
Inverse Document Frequency
在计算术语频率时,每个术语被认为同等重要,并有机会参与到向量表示。但是,某些词在文档中非常普遍,对于文本内容的分析贡献很小。这样的单词的词频(例如“ the”,“ a”,“ in”,“ of”等)可能会使更有意义的单词的权重降低。因此,为减少这种影响,我们额外增加使用一项Inverse Document Frequency。
idf(w) = log(total number of documents/number of documents containing word w)
w表示某个句子中出现的词汇。
Tf-idf(w) = tf(w) idf(w)
注意:一个词汇在文本中越重要,那么它应当有越高的tf-idf值。 例子
计算文本相似度
文本相似度的计算十分简单,通过将句子向量化之后,我们可以使用欧式距离或者余弦距离来计算,通过比较计算出来的值,值越小文本相似度越高。由于余弦距离考虑了方向,所以一般情况下余弦距离更具有说服力也更加准确。
欧式距离:
余弦距离:
来源:CSDN
作者:weixin_45969256
链接:https://blog.csdn.net/weixin_45969256/article/details/103463614