比较序列的实用程序
Distance的Python项目详细描述
这个包为计算任意序列之间的相似性提供了帮助。包括Levenshtein、Hamming、Jaccard和Sorensen Distance,以及一些奖金。所有的距离计算都是用纯python实现的,而且大多数都是用c实现的。
安装
如果您不想或不需要使用C扩展名,只需解压缩存档文件并以根用户身份运行即可:
# python setup.py install
用于工作的C扩展,需要Python源文件和C编译器(通常是Windows上的微软Visual C++ 2010,以及在MAC和Linux上的GCC)。在类似Debian的系统上,您可以使用以下命令获取所有这些信息:
# apt-get install gcc pythonX.X-dev
其中x.x是python版本的编号。
然后您应该键入:
# python setup.py install –with-c
注意使用–with-c开关。
用法
本模块的一个常见用例是比较单个单词的相似性:
>>> distance.levenshtein("lenvestein", "levenshtein") 3 >>> distance.hamming("hamming", "hamning") 1
如果您的语言中的声音和字形之间没有一对一的映射,或者您不想比较字形,而是比较音节或音素,则可以传入字符元组:
>>> t1 = ("de", "ci", "si", "ve") >>> t2 = ("de", "ri", "si", "ve") >>> distance.levenshtein(t1, t2) 1
比较字符串列表对于计算句子、段落等之间的相似性也很有用:
>>> sent1 = ['the', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog'] >>> sent2 = ['the', 'lazy', 'fox', 'jumps', 'over', 'the', 'crazy', 'dog'] >>> distance.levenshtein(sent1, sent2) 3
hamming距离和levenshtein距离可以被标准化,这样就可以有意义地比较几种距离测量的结果。Levenshtein有两种策略:要么以序列间最短比对的长度作为因子,要么以较长比对的长度作为因子。示例用法:
>>> distance.hamming("fat", "cat", normalized=True) 0.3333333333333333 >>> distance.nlevenshtein("abc", "acd", method=1) # shortest alignment 0.6666666666666666 >>> distance.nlevenshtein("abc", "acd", method=2) # longest alignment 0.5
jaccard和sorensen返回每个默认值的规范化值:
>>> distance.sorensen("decide", "resize") 0.5555555555555556 >>> distance.jaccard("decide", "resize") 0.7142857142857143
至于奖金,有一个fast_comp函数,它计算两个字符串之间的距离,最大值为2。如果字符串之间的距离大于该值,则返回-1。这个函数的使用是有限的,但另一方面它比levenshtein快得多。还有一个lcsubstrings函数,可以用来查找两个序列中最长的公共子串。
最后,提供了两个方便的迭代器ilevenshtein和ifast廑comp,它们用于从长序列列表中筛选接近参考序列的序列。它们都返回一系列元组(距离、序列)。示例:
>>> tokens = ["fo", "bar", "foob", "foo", "fooba", "foobar"] >>> sorted(distance.ifast_comp("foo", tokens)) [(0, 'foo'), (1, 'fo'), (1, 'foob'), (2, 'fooba')] >>> sorted(distance.ilevenshtein("foo", tokens, max_dist=1)) [(0, 'foo'), (1, 'fo'), (1, 'foob')]
ifast_comp效率特别高,可以处理100万个代币而没有问题。
有关更多信息,请参阅函数文档(帮助(funcname))。
玩得开心!
更改日志
2013年11月20日: *切换回使用不推荐使用的python unicode api。好消息是 C扩展与Python2.7+兼容,Unicode字符串上的距离计算现在是 快多了。 *添加了c版本的lcsubstrings。 *增加了计算归一化levenshtein距离的新方法。 *增加了一些测试。
2013年11月12日: 扩展了fast_comp(以前是quick_levenshtein)以便它可以处理转置。 固定变量椎间盘,有时会产生奇怪的结果。
2013年11月10日: 添加了quick_levenshtein和iquick_levenshtein。
2013年11月5日: 添加了Sorensen和Jaccard度量,修复了Levenshtein中的内存问题。