我有一個包含品牌名稱(可口可樂,百事可樂,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?我需要使用不同的算法嗎?或者,也許爲此測試指定不同的參數?我想添加一個包含我找到的所有'新'單詞的詞典,添加它們,然後我可以對每個單詞進行比較,但後來我失去了腳本的粒度。
對於錯別字,會[levenshtein距離](https://en.wikipedia.org/wiki/Levenshtein_distance)工作嗎? – Aufziehvogel
也許「低=好」?無論如何,我個人更喜歡使用Levenshtein距離進行拼寫檢查。例如,「misplaed」與「misplaced」的LD是「2」。按照字長劃分,它是2/9,這是「非常接近」。 – usr2564301
在'NGRAM'中,您希望得分接近1,這意味着這些字符串是相同的。 我總的來說,你認爲最好運行NGRAM算法,如果它沒有找到任何匹配來嘗試運行levenshtein距離或在這種情況下使用levenshtein距離? –