第三课 文本

第三课 文本

  1. 拼写错误改正

错误: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的字符串,过滤后返回结果

  1. 停用词过滤

把停用词(the,an,their…)以及出现频率很低的词汇过滤掉

  1. 标准化

示例(有固定规则)

went
go
go
going
fly
fli
flies

stemming:标准化操作

Lemmazation:合并后的词依然存在于词典中

  1. 文本表示

文本的相似度

  • 欧氏距离 d = ∣ s 1 − s 2 ∣ d=|s_1-s_2| d=s1s2
  • 余弦相似度 d = s 1 ∗ s 2 / ∣ s 1 ∣ ∣ s 2 ∣ d=s_1*s_2/|s_1||s_2| d=s1s2/∣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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值