文本标记化
-
将字符序列转换为标记(token)序列的过程
-
从输入字符流中生成标记的过程叫作标记化(tokenization),在这个过程中,词法分析器还会对标记进行分类
“they lay back on the San Francisco grass and looked at the stars and their”
-
类型:词汇表中的一个词(13种类型)
-
标记:文本中的词(15个标记,包括例如and的重复和San Francisco被分为两个标记)
词干提取和词形还原
词干提取和词形还原的目的就是将长相不同,但是含义相同的词统一起来,这样方便 后续的处理和分析
词干提取
词干提取是去除单词的前后缀得到词根的过程
大家常见的前后词缀有「名词的复数」、「进行式」、「过去分词」…
词形还原
词形还原是基于词典,将单词的复杂形态转变成最基础的形态。
词形还原不是简单地将前后缀去掉,而是会根据词典将单词进行转换。比如「drove」会转换为「drive」
中文分词
正向最大匹配
逆向最大匹配
双向最大匹配
结巴分词
最短编辑距离
如何计算两个字符串的相似度? 应用场景:拼写纠正、计算生物学(比较基因序列的相似度)、机器翻译、信息抽取、语音识别
两个字符串之间的最短编辑距离,是指从一个字符串转换为另一个字符串的最少编辑操作的次数
- 插入Insertion
- 删除Deletion
- 替换Substitution
如何找到最短编辑距离
搜索从起始字符串道最终字符串的路径(编辑序列)
- Initial State
- Operators
- 插入
- 删除
- 替代
- Goal State:无论操作路径是什么,最终状态都必须相同
- Path Cost:我们想要最小化编辑次数(我们不记录路径,只需要找到最短的路径)
定义最短编辑距离
- 两个字符串:
- 长度为n的X
- 长度为m的Y
- 定义D(i, j)
- 表示X的前i个字符和Y的前j个字符的最短编辑距离
- 因此X和Y的最短编辑距离为D(n, m)
算法设计
D ( i , j ) = m i n { D ( i − 1 , j ) + 1 D ( i , j − 1 ) + 1 D ( i − 1 , j − 1 ) + { 0 i f s o u r c e [ i ] = t a r g e t [ j ] 2 i f s o u r c e [ i ] ≠ t a r g e t [ j ] D(i,j)=min \begin{cases} D(i-1,j)+1\\ D(i,j-1)+1\\ D(i-1,j-1)+ \begin{cases} 0&if source[i]=target[j]\\ 2&if source[i]\neq target[j] \end{cases} \end{cases} D(i,j)=min⎩ ⎨ ⎧D(i−1,j)+1D(i,j−1)+1D(i−1,j−1)+{02ifsource[i]=target[j]ifsource[i]=target[j]
编辑距离的计算可以通过动态规划算法来实现。具体步骤如下:
- 创建一个二维数组,其行数和列数分别为两个字符串的长度加1
- 初始化第一行和第一列,使其逐步增加,表示将一个字符串变为空字符串的编辑操作次数
- 遍历数组的其余部分,计算每个位置的编辑距离
- 如果当前字符相同,编辑距离与上一个位置相同
- 否则,取上、左、左上三个位置的最小值,然后加1,表示当前位置的编辑距离
- 最终,右下角的元素即为两个字符串的最短编辑距离
示例:假设我们要计算字符串"kitten"和"sitting"之间的最短编辑距离。
- k i t t e n
- 0 1 2 3 4 5 6
s 1 1 2 3 4 5 6
i 2 2 1 2 3 4 5
t 3 3 2 1 2 3 4
t 4 4 3 2 1 2 3
i 5 5 4 3 2 2 3
n 6 6 5 4 3 3 2
g 7 7 6 5 4 4 3
最终的编辑距离为3,需要3次编辑操作(删除’k’,替换’e’为’s’,添加’g’)将"kitten"转换为"sitting"。