2016-11-20 20 views
1

我有一個包含品牌名稱(可口可樂,百事可樂,7Up等)的文本列表。我編寫了一個python腳本,對所有內容相同的單元格進行排序和計數(完全相同的文本,小寫全部文本後),並按每個文本的計數對列表重新排序,以使出現最多的文本爲首位,因爲我認爲大多數人會正確地寫出品牌名稱。 例如,如果我有以下列表:比較字符串以匹配品牌名稱並刪除拼寫錯誤

texts = ['Coca-Cola', 'Pepsi', 'Coca-Cola', 'Coca-Cola', 'Pepsi', 'Pespi', 'Pepsi', '7Up', '7up', 'Cola', 'Pepsi'] 

的第一步後,名單將是:

ordered_text = [ 
    {'text': 'Pepsi', count: 4}, 
    {'text': 'Coca-Cola', count: 3}, 
    {'text': '7Up', count: 2}, 
    {'text': 'Cola', count: 1}, 
    {'text': 'Pespi', count: 1}, 
] 

在第二步中,我使用的是ngram包,試圖接近匹配文本來糾正拼寫錯誤。 重要說明:我的關鍵要求之一是要有一個與語言無關的解決方案。

我的問題是NGRAM在長文本上效果很好,但在短文本上表現不佳。例如在運行時:

ngram.NGram.compare('Pepsi', 'Pespi') 

的結果將是:

0.2727272727272727 

這是一個非常低的「得分」,但你可以看到字符串是真的很近,並且只有1一封信是錯位的。

我能做些什麼來改善我的relust?我需要使用不同的算法嗎?或者,也許爲此測試指定不同的參數?我想添加一個包含我找到的所有'新'單詞的詞典,添加它們,然後我可以對每個單詞進行比較,但後來我失去了腳本的粒度。

+1

對於錯別字,會[levenshtein距離](https://en.wikipedia.org/wiki/Levenshtein_distance)工作嗎? – Aufziehvogel

+0

也許「低=好」?無論如何,我個人更喜歡使用Levenshtein距離進行拼寫檢查。例如,「misplaed」與「misplaced」的LD是「2」。按照字長劃分,它是2/9,這是「非常接近」。 – usr2564301

+0

在'NGRAM'中,您希望得分接近1,這意味着這些字符串是相同的。 我總的來說,你認爲最好運行NGRAM算法,如果它沒有找到任何匹配來嘗試運行levenshtein距離或在這種情況下使用levenshtein距離? –

回答

1

從你的問題來看,如果你想拼寫檢查輸入是否正確,或者你只是想對它們進行分組,那麼不是很明顯。例如,如果你的輸入看起來像['coka-cola', 'coak-cola', 'coca-coca'],你的算法應該做什麼?

  • 是否應將它們全部歸爲{'coka-cola': 3}?含義總是比較第一次出現的輸入嗎?在這種情況下,編輯距離是有意義的,你可以很容易地找到許多python實現。

  • 是否應將它們按正確的拼寫進行分組,因此{'coka-cola': 3}?在這種情況下,你需要一個好的拼寫糾正器。這裏有幾個選項,你可以看看autocorrect包,或者更多涉及的解決方案,NLTK包。另一個選擇是使用Google。我認爲Google沒有支持API來拼寫更正,因此在向Google發出請求時,您需要做一些調查以獲得建議的結果。

+0

該算法的最終結果應該是所有的文本都被類似地分組在一起,例如:[[''coka-cola':2},{''coca-coca':1}]'因爲第一個和第二個字符串是相似的,第三個不太相似。這有意義嗎? –

+0

目前尚不清楚爲什麼你認爲'可卡可樂'和'可樂可樂'最相似,而不是'可口可樂'。例如,如果您使用編輯距離,它們將全部爲最多兩次編輯,這是一個非常低的編輯閾值。 – yelsayed