第三课 文本
- 拼写错误改正
错误:1. 错别字 2. 语法
求解编辑距离:(动态规划)
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
解题思路(参照72. 编辑距离 - 力扣(LeetCode))
我们有word1和word2,我们定义dp[i][j]的含义为:word1的前i个字符和word2的前j个字符的编辑距离。意思就是word1的前i个字符,变成word2的前j个字符,最少需要这么多步。
例如word1 = "horse", word2 = "ros",那么dp[3][2]=X就表示"hor"和“ro”的编辑距离,即把"hor"变成“ro”最少需要X步。
如果下标为零则表示空串,比如:dp[0][2]就表示空串""和“ro”的编辑距离
定理一:如果其中一个字符串是空串,那么编辑距离是另一个字符串的长度。比如空串“”和“ro”的编辑距离是2(做两次“插入”操作)。再比如"hor"和空串“”的编辑距离是3(做三次“删除”操作)。
定理二:当i>0,j>0时(即两个串都不空时)dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+int(word1[i]!=word2[j]))。
啥意思呢?举个例子,word1 = "abcde", word2 = "fgh",我们现在算这俩字符串的编辑距离,就是找从word1,最少多少步,能变成word2?那就有三种方式:
知道"abcd"变成"fgh"多少步(假设X步),那么从"abcde"到"fgh"就是"abcde"->"abcd"->"fgh"。(一次删除,加X步,总共X+1步)
知道"abcde"变成“fg”多少步(假设Y步),那么从"abcde"到"fgh"就是"abcde"->"fg"->"fgh"。(先Y步,再一次添加,加X步,总共Y+1步)
知道"abcd"变成“fg”多少步(假设Z步),那么从"abcde"到"fgh"就是"abcde"->"fge"->"fgh"。(先不管最后一个字符,把前面的先变好,用了Z步,然后把最后一个字符给替换了。这里如果最后一个字符碰巧就一样,那就不用替换,省了一步)
以上三种方式算出来选最少的,就是答案。所以我们再看看定理二:
dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+int(word1[i]!=word2[j]))
dp[i-1][j]:情况一
dp[i][j-1]+1:情况二
dp[i-1][j-1]+int(word1[i]!=word2[j]):情况三
实现代码
import numpy as np
def edt_distance(word1, word2):
n = len(word1)
m = len(word2)
if n * m == 0:
return n + m
dp = np.zeros([n+1, m+1], dtype=int)
for i in range(n+1):
dp[i][0] = i
for j in range(m+1):
dp[0][j] = j
for i in range(1, n+1):
for j in range(1, m+1):
left = dp[i-1][j] + 1
down = dp[i][j-1] + 1
left_down = dp[i-1][j-1] + int(word1[i-1] != word2[j-1])
dp[i][j] = min(left, down, left_down)
return dp[n][m]
if __name__ == '__main__':
word1 = "intention"
word2 = "execution"
print(edt_distance(word1,word2))
错别字纠正:生成编辑距离为1,2的字符串,过滤后返回结果
- 停用词过滤
把停用词(the,an,their…)以及出现频率很低的词汇过滤掉
- 标准化
示例(有固定规则)
stemming:标准化操作
Lemmazation:合并后的词依然存在于词典中
- 文本表示
文本的相似度
- 欧氏距离 d = ∣ s 1 − s 2 ∣ d=|s_1-s_2| d=∣s1−s2∣
- 余弦相似度 d = s 1 ∗ s 2 / ∣ s 1 ∣ ∣ s 2 ∣ d=s_1*s_2/|s_1||s_2| d=s1∗s2/∣s1∣∣s2∣
示例 [我们,去,爬山,今天,你们,昨天,跑步]
one-hot表示方法:
- boolean
你们又去爬山又去跑步 的表示为(0,1,1,1,0,1,0,1)
- count
你们又去爬山又去跑步 的表示为(0,2,2,1,0,1,0,1)
(以上两种方法的缺陷是单词的重要性无法体现)
- tfidf
t f i d f ( w ) = t f ( d , w ) ∗ i d f ( w ) i d f ( w ) = l o g N N ( w ) tfidf(w)=tf(d,w)*idf(w)\\ idf(w)=log\frac{N}{N(w)} tfidf(w)=tf(d,w)∗idf(w)idf(w)=logN(w)N
t f ( d , w ) tf(d,w) tf(d,w)为文档 d d d中 w w w的词频, N N N为语料库中的文档总数, N ( w ) N(w) N(w)为词语 w w w出现在多少个文档,出现的越少,权重越高
one-hot表示方法的缺陷有:
- 向量长度等于词典长度,太大,同时稀疏度也太大
- 没有考虑单词间的相似度
词向量:
示例 我们 [0.1,0.2,0.4,0.2] 爬山 [0.2,0.3,0.7,0.1]
通过深度学习模型(例Glone,CBOW,RNN/LSTM,MF,Gaussion, Embedding等)对语料库进行训练得到,需要指定词向量的维度
由词向量得到句向量
- 平均法则
- RNN/LSTM
- Bert