引入
衡量两个序列的相似度,可以用马氏距离,欧氏距离等距离公式来度量。
但对两个字符串,比如kitten
与sitting
的相似度是多少?
如果是两个等长字符串,也可以用one-hot对每个字母编码,然后用马氏、欧式距离也可以计算。但对不等长的两个字符串,怎么计算相似度呢?
更一般的说法,如何计算两个不等长数组的相似度呢?
莱文斯坦(Levenshtein)距离
莱文斯坦距离就用是来解决这个问题的。先看它的公式:
其中a
,b
是两个数组(字符串),i/j是数组下标。莱文斯坦距离
的含义,是求将a
变成b
(或将b
变成a
),所需要做的最少次数的变换。
举个例子,字符串”kitten”与”sitting”的莱文斯坦距离
是3, 应为将一个字符串变为另一个字符串,最小需要做三次变换:
- kitten → sitten (字符k变为s)
- sitten → sittin (字符e变成i)
- sittin → sitting (在末尾插入字符g)
python实现
莱文斯坦距离
的python模块在这里https://github.com/ztane/python-Levenshtein/,它同时支持python2和python3。
(1)安装Levenshtein模块
(2)计算两个字符串的相似度
(3)计算两个字符串list的相似度
我在github这里(https://github.com/ybdesire/machinelearning/blob/master/ml_related_alg/levenshtein_distance.ipynb)给出了完整示例代码。
安装:
-
安装pip,参考博客:
1http:
/
/
www.cnblogs.com
/
qiernonstop
/
p
/
3449141.html
-
下载python-Levenshtein,并解压文件:
1https:
/
/
pypi.python.org
/
packages
/
source
/
p
/
python
-
Levenshtein
/
python
-
Levenshtein
-
0.12
.
0.tar
.gz
-
下载VCForPython并安装:
1链接: http:
/
/
pan.baidu.com
/
s
/
1bngDiWZ
密码: xi2
-
使用命令行pip进入python-Levenshtein文件夹,执行:
1python setup.py instal
-
测试是否安装成功:
12import
Levenshtein
print
Levenshtein.distance(
"abc"
,
"ac"
)
我的安装过程:
到 https://github.com/ztane/python-Levenshtein/ 下载源码,进入目录执行 py setup.py install 指令
(如果安装时提示缺少vc9的库,去提示的网址下载就行)