【发布时间】:2013-07-18 10:17:36
【问题描述】:
使用像 leveinstein (leveinstein or difflib) 这样的算法,很容易找到近似匹配。例如。
>>> import difflib
>>> difflib.SequenceMatcher(None,"amazing","amaging").ratio()
0.8571428571428571
可以通过根据需要确定阈值来检测模糊匹配。
当前需求:根据更大字符串中的阈值查找模糊子字符串。
例如。
large_string = "thelargemanhatanproject is a great project in themanhattincity"
query_string = "manhattan"
#result = "manhatan","manhattin" and their indexes in large_string
一种蛮力解决方法是生成所有长度为N-1到N+1(或其他匹配长度)的子串,其中N为query_string的长度,对它们一一使用levenstein,看阈值。
python中是否有更好的解决方案,最好是python 2.7中包含的模块,或者外部可用的模块。
---------------------更新和解决方案----
Python 正则表达式模块工作得很好,尽管它比用于模糊子字符串情况的内置 re 模块慢一点,由于额外的操作,这是一个明显的结果。
期望的输出是好的,并且可以很容易地定义对模糊程度的控制。
>>> import regex
>>> input = "Monalisa was painted by Leonrdo da Vinchi"
>>> regex.search(r'\b(leonardo){e<3}\s+(da)\s+(vinci){e<2}\b',input,flags=regex.IGNORECASE)
<regex.Match object; span=(23, 41), match=' Leonrdo da Vinchi', fuzzy_counts=(0, 2, 1)>
【问题讨论】:
-
regex解决方案确实适用于给定的示例。你有什么问题?
标签: python python-2.7 fuzzy-search