如何匹配可能有拼写错误的字符串?
How to match strings with possible typos?
我有多个 pdf 转换为文本文件,我想搜索文件中可能存在的特定短语。我的问题是 pdf 和文本文件之间的转换并不完美,所以有时文本中会出现错误(例如单词之间缺少空格;i、l、1 之间的混淆;等)
我想知道是否有任何通用技术可以给我一个 "soft" 搜索,例如查看两个词之间的汉明距离的东西。
if 'word' in sentence:
对
if my_search('word',sentence, tolerance):
由于您的字符串可能具有不同的长度,因此您应该使用 Levenshtein 距离而不是 Hamming 距离。我个人没用过,不过这个包可能有用:
https://pypi.python.org/pypi/python-Levenshtein
因为这是一个自然语言处理问题,我肯定会研究 NLTK。本教程似乎很合适:
http://streamhacker.com/2011/10/31/fuzzy-string-matching-python/
fuzzywuzzy 看起来可能对你有用:https://github.com/seatgeek/fuzzywuzzy
你可以使用这样的东西:
from difflib import SequenceMatcher
text = """there are
some 3rrors in my text
but I cannot find them"""
def fuzzy_search(search_key, text, strictness):
lines = text.split("\n")
for i, line in enumerate(lines):
words = line.split()
for word in words:
similarity = SequenceMatcher(None, word, search_key)
if similarity.ratio() > strictness:
return " '{}' matches: '{}' in line {}".format(search_key, word, i+1)
print fuzzy_search('errors', text, 0.8)
应该输出这个:
'errors' matches: '3rrors' in line 2
我有多个 pdf 转换为文本文件,我想搜索文件中可能存在的特定短语。我的问题是 pdf 和文本文件之间的转换并不完美,所以有时文本中会出现错误(例如单词之间缺少空格;i、l、1 之间的混淆;等)
我想知道是否有任何通用技术可以给我一个 "soft" 搜索,例如查看两个词之间的汉明距离的东西。
if 'word' in sentence:
对
if my_search('word',sentence, tolerance):
由于您的字符串可能具有不同的长度,因此您应该使用 Levenshtein 距离而不是 Hamming 距离。我个人没用过,不过这个包可能有用:
https://pypi.python.org/pypi/python-Levenshtein
因为这是一个自然语言处理问题,我肯定会研究 NLTK。本教程似乎很合适:
http://streamhacker.com/2011/10/31/fuzzy-string-matching-python/
fuzzywuzzy 看起来可能对你有用:https://github.com/seatgeek/fuzzywuzzy
你可以使用这样的东西:
from difflib import SequenceMatcher
text = """there are
some 3rrors in my text
but I cannot find them"""
def fuzzy_search(search_key, text, strictness):
lines = text.split("\n")
for i, line in enumerate(lines):
words = line.split()
for word in words:
similarity = SequenceMatcher(None, word, search_key)
if similarity.ratio() > strictness:
return " '{}' matches: '{}' in line {}".format(search_key, word, i+1)
print fuzzy_search('errors', text, 0.8)
应该输出这个:
'errors' matches: '3rrors' in line 2