所以到目前为止,我一直在尝试几个库,但找不到适合代表我想要实现的目标的东西。我有两篇文本,其中一篇可能包含也可能不包含在另一篇文本中 - 但不是以精确的方式,逐字或逐个符号。因此,使用
in
是不行的。
为了说明这一点,请考虑短语“非常相似”和“v3ry slmilar”。使用 difflib 或 spaCy 等标准库,我可以轻松获得这两个短语的相似度分数(例如,大约 5/6)。然而,当第二个短语被扩展时,比如“v3ry slmilar in context”,复杂性就出现了。在这种情况下,我仍然想保持类似的分数,本质上是衡量第一个文本在第二个文本中的比例表示。最后的文本可能会长很多,尤其是第二个。
虽然我尝试过的库在某种程度上提供了我正在寻找的内容,但它们不太符合对嵌入在更大上下文中的文本进行按比例评分的特定需求(或者我错过了它,这也可能是)。我想知道已知库中是否有任何库或特定函数可能没有被我注意到,这可以解决这个特定问题。
我想使用
thefuzz
,但文档相当短,我不确定该方法的差异以及哪种(可能)可以满足我的需要。
如有任何建议或指导,我们将不胜感激。预先感谢您的帮助!
如果所需的相似性仅限于特定字符,并且您只关心真或假结果,则可以使用某种规范化形式来匹配两个字符串。
创建一个字典将字符串翻译成一些更简单的形式,例如:
simplifier = {'1':'i', '3':'e', '4':'A', '5':'s', '6':'b', '7':'t', '0':'o', '!':'i', '@':'a', '$':'s', 'd':'b', 'c':'o', 'l':'i', 'j':'i', 'm':'n', 'p':'b', 'q':'b', 'u':'n', 'w':'n', 'C':'O', 'F':'E', 'G':'O', 'J':'I', 'M':'N', 'V':'N', 'W':'N','P':'D'}
在 python 中,您需要从中创建一个转换表(将字符转换为其 ASCII 代码):
simplifying_table = {ord(k): ord(v) for k,v in simplifier.items()}
您可以将空白映射到
None
来删除它们:
simplifying_table[ord(' ')] = None
然后简化两个字符串:
s1 = 'very similar'
s2 = 'v3ry slmilar in context'
ss1 = s1.translate(simplifying_table)
ss2 = s2.translate(simplifying_table)
然后使用
in
运算符检查ss1
是否存在于ss2
中:
if ss1 in ss2:
do something