【问题标题】:How to find most relevant strings in a textfile?如何在文本文件中找到最相关的字符串?
【发布时间】:2017-04-19 08:06:39
【问题描述】:

我有一个文本文件,其中有多行包含对象的详细信息。我想找到每个字符串的分数,并想检查哪个字符串与用户输入更相关。 例如。文本文件包含

 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

【问题讨论】:

  • 您可能正在搜索类似Edit Distance
  • 欢迎来到 SO。你能告诉我们你到目前为止尝试过的代码吗?
  • "输出按相关性排序",你应该先定义相关性
  • 您需要一个使用相似性度量进行搜索的文本索引。 Okapi BM25 就是这样一种相似性度量。也许有更新更好的。你得看看自己。
  • 我如何定义相关性

标签: python algorithm python-2.7 search full-text-indexing


【解决方案1】:

为了确定给定字符串集合中任何字符串与查询字符串(在您的情况下为“红色汽车”)的相关性分数,您需要一个信息检索相似性度量。。 p>

Okapi BM25 就是这样一种相似性度量。由于这对文本索引领域的研究相当深入,因此您可能需要进行一些研究,然后才能自己实施。

下面是算法的定义

D 是文档,即在您的情况下是一行。 Q为查询,由所有q_i组成,IDFinverse document frequency。 p>

该算法背后的直觉是为 Q 中的每个术语 q_i 创建一个分数,该分数基于所有字符串中的总出现次数,即出现次数多的字符串排名低,因为它们携带没有信息(在大型英文文本中,这通常是字符串,例如 be、have 等),并且基于您搜索的字符串中的出现。这意味着如果一个小文本包含给定的术语,例如火箭,经常。这个词对于小文本来说比我对长度为 10 倍的文本更重要,即使这个词出现的频率是 2 倍。


如果您想了解更多信息,可以阅读链接的 wiki 文章,或先阅读以下论文:Inverted files for text search engines


如果您不想自己进行搜索。您可以使用库,例如whoosh. 正如它在其网站上所说的那样

Whoosh 是一个快速、功能强大的全文索引和搜索库 纯Python实现

它还有一个

可插拔评分算法(包括BM25F)、文本分析、存储、 发帖格式等

这意味着您可以更改确定相关性的相似性度量,以便为您的应用程序获得所需的行为。至少在某种程度上。


在执行搜索时,您必须首先创建一个索引,这在here 中进行了描述。之后,您可以根据需要查询索引。有关该库的更多信息和帮助,请参阅文档。

【讨论】:

  • k 和 b 是什么意思? @迈克
  • 调整参数。答案包含指向 Okapi BM25 wiki 文章的链接,您可以在此处找到有关 kb 值的信息。
【解决方案2】:

对于这个特殊的问题,我会使用简单的 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 距离的标准方法)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    相关资源
    最近更新 更多