2017-04-19 19 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距離的標準方法)來對其進行歸一化。

相關問題