Python:difflib.get_close_匹配比较修改的文本但返回原始文本
我从文本中提取了一个单词列表,但在文本预处理过程中,为了便于比较,我将所有单词都小写 我的问题是如何使列表中提取的单词与原始文本中完全相同 我尝试先标记原始文本,然后在这个标记化列表中找到与我从文本中提取的单词列表最接近的匹配项。我使用以下各项查找最接近的匹配项:Python:difflib.get_close_匹配比较修改的文本但返回原始文本,python,nlp,data-analysis,data-cleaning,difflib,Python,Nlp,Data Analysis,Data Cleaning,Difflib,我从文本中提取了一个单词列表,但在文本预处理过程中,为了便于比较,我将所有单词都小写 我的问题是如何使列表中提取的单词与原始文本中完全相同 我尝试先标记原始文本,然后在这个标记化列表中找到与我从文本中提取的单词列表最接近的匹配项。我使用以下各项查找最接近的匹配项: nltk.edit_距离 difflib.get\u close\u匹配 但他们都没有按我的要求工作。他们以某种方式提取相似的单词,但与原文中出现的不完全相同。我认为问题在于这些方法对待小写和大写单词的方式不同 提取的单词可以是单格,
difflib.get\u close\u matches('rfid警报',原始文本\u unigram\u令牌\u列表)
它的输出是[profile Caller],而不是[RFID警报]。这是因为python区分大小写。我认为它发现原始文本unigram令牌列表中的bigram与[rfid alert]的不同字符数最少,是[profile Caller],因此它返回了[profile Caller]
因此,我的问题是:是否有任何现成的方法或任何解决办法,我可以做返回原始形式的ngram,因为它出现在文本中准确?例如,我想获得[RFID alert]而不是上面示例中的[profile Caller],以此类推
谢谢你的帮助。提前感谢。类似于,您可以获取和修改的源代码,并根据需要进行调整
我所作的修改:
cutoff
默认值提高到0.99(理论上它甚至可以是1.0,但为了确保数值误差不会影响结果,我传递了一个较小的数字)
s.set_seq1(x.lower())
-以便在小写字符串之间进行比较(但返回原始x
)
修改函数的完整代码:
from difflib import SequenceMatcher, _nlargest # necessary imports of functions used by modified get_close_matches
def get_close_matches_lower(word, possibilities, n=3, cutoff=0.99):
if not n > 0:
raise ValueError("n must be > 0: %r" % (n,))
if not 0.0 <= cutoff <= 1.0:
raise ValueError("cutoff must be in [0.0, 1.0]: %r" % (cutoff,))
result = []
s = SequenceMatcher()
s.set_seq2(word)
for x in possibilities:
s.set_seq1(x.lower()) # lower-case for comparison
if s.real_quick_ratio() >= cutoff and \
s.quick_ratio() >= cutoff and \
s.ratio() >= cutoff:
result.append((s.ratio(), x))
# Move the best scorers to head of list
result = _nlargest(n, result)
# Strip scores for the best n matches
return [x for score, x in result]
印刷:
['RFID alert']
你能提供一些例子(数据)吗?很抱歉没有给出一个例子。我更新了我的问题,加入了一个明确的例子。如果上面的例子不够清楚,你可以告诉我提供更多的例子。多谢各位@sophrosI非常感谢您对函数进行了如此大的修改。当我测试这个函数时,它确实非常适合我。但是我认为由于我的文本中存在一些文本清理问题,有时我需要将截止值改为0.6而不是0.99,以避免函数返回空列表的情况,而且它做得非常好,并且获得了匹配。再次感谢你@sophros@Bahgat-很高兴听到,也很乐意帮忙。请您在我的答案旁边单击灰色的勾号,将问题标记为已回答,好吗?非常感谢。谢谢你提醒我。当然,我现在做了。再次非常感谢你的大力帮助@索弗罗斯
['RFID alert']