2017-04-19 66 views
0

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

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

您可能正在寻找类似[编辑距离](https://en.wikipedia.org/wiki/Edit_distance) – languitar

+1

欢迎来到SO。你能告诉我们你到目前为止尝试过的代码吗? –

+0

“输出是按相关性排序”,您应先定义相关性 –

回答

1

为了确定相关性得分的任何串出一组给定对查询串串的,你的情况“红色赛车”,你需要一个信息检索相似性度量

Okapi BM25是这样的相似性度量。由于这个深入探究文本索引的领域,您可能需要做一些学习,然后才能自己实现它。

下面是该算法

Okapi BM25 algorithm

d的定义是文档,即,在你的情况单行。 Q是查询,其中包括所有的Q_I,并IDFinverse document frequency

这个算法背后的直觉是创造出得分每学期Q中Q_I,这是基于总出现在所有字符串上,即串存在很多获得排名较低,因为他们没有携带信息(大的英文文本通常会像be,have等字符串),并根据字符串中出现的内容进行搜索。这意味着如果一个小文本包含一个给定的词,例如火箭,经常。这个术语对于小文本来说更为重要,即使这个术语出现次数是经常出现的次数的2倍,那么它的长度也会比10倍长。


如果您想了解更多信息,可以阅读链接wiki文章,或阅读下列纸张的一个开始:Inverted files for text search engines


如果你不想自己做搜索。您可以使用图书馆,例如whoosh.因为它说,在其网站上

嗖是一种快速,多特征的全文索引和搜索库 纯Python实现

进一步使其具有

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

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


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

+0

k和b是什么意思? @mike –

+0

调整参数。答案中包含Okapi BM25 wiki文章的链接,您可以在那里找到有关'k'和'​​b'的值的信息。 – mike

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距离的标准方法)来对其进行归一化。

相关问题