我有一个文本文件,其中有多行包含对象的详细信息。我想找到每个字符串的分数,并希望检查哪个字符串与用户输入更相关。 例如。文本文件包含
This is not a blue car
Blue or black car is here
This is red car
Red car is here
用户输入红色汽车。
如何找到最相关的字符串? 因此输出按相关性排序,看起来像这样
This is red car
Red car is here
This is not a blue car
Blue or black car is here
答案 0 :(得分:1)
为了根据查询字符串确定给定字符串集中的任何字符串的相关性得分,在您的案例中,您需要信息检索相似性度量强>
Okapi BM25 是一种相似度量。由于这深入研究文本索引领域,您可能需要先进行一些学习,然后才能自己实现。
以下是算法的定义
D 是文档,即在您的情况下是单行。 Q 是查询,其中包含所有 q_i , IDF 是 inverse document frequency 。
此算法背后的直觉是为Q中的每个术语 q_i 创建一个分数,该分数基于所有字符串中的总出现次数,即具有高出现次数的字符串得分较低,因为它们携带没有信息(在大型英文文本中,这通常是字符串,如be,have等),并且基于您搜索的字符串中的出现。这意味着如果一个小文本包含一个给定的术语,例如火箭,经常。这个术语对于小文本来说比对于长度为10倍的文本更重要,即使该术语出现的次数是2倍。
如果您想了解更多信息,可以阅读链接的维基文章,或阅读以下文章:Inverted files for text search engines。
如果您不想自己进行搜索。您可以使用库,例如whoosh.正如其网站上所述
Whoosh是一个快速,功能强大的全文索引和搜索库 用纯Python实现
还有一个
可插拔评分算法(包括BM25F),文本分析,存储, 发布格式等
这意味着您可以更改相似性度量,该度量确定相关性以获得您的应用程序所需的行为。至少在某种程度上。
在执行搜索时,您必须先创建一个索引,这个描述为here。之后,您可以根据需要查询索引。有关库的更多信息和帮助,请参阅文档。
答案 1 :(得分:0)
对于这个特殊问题,我会使用简单的Levenshtein距离。我最近将它用于这种应用程序(将类似的查询分组在一起)并且运行良好:
def normalized_edit_similarity(a, b):
return 1.0 - editdistance.eval(a, b)/(1.0 * max(len(a), len(b)))
我使用了https://pypi.python.org/pypi/editdistance包。注意:editdistance.eval
是普通的Levenshtein距离,所以我将其除以较长的弦的长度(标准化Levenshtein距离的标准方法)来标准化。