簡體   English   中英

TF-IDF 和余弦相似度的模糊匹配不夠准確

[英]Fuzzy matching not accurate enough with TF-IDF and cosine similarity

我想在一長串字符串中找到相似之處。 也就是說,對於列表中的每個字符串,我都需要同一個列表中的所有相似字符串。 早些時候,我使用Fuzzywuzzy ,它通過使用fuzzy.partial_token_sort_ratio 為我想要的結果提供了良好的准確性。 唯一的問題是它花費的時間,因為列表包含大約 50k 個條目,最多 40 個字符串。 50k 字符串花費的時間長達 36 小時。

為了改善我的時間,我嘗試了Rapidfuzz庫,該庫將時間減少到 12 小時左右,提供與 Fuzzywuzzy 相同的輸出,靈感來自這里的答案。 后來我嘗試了 tf-idf 和余弦相似度,它們使用受此博客啟發的string-grouper庫提供了一些奇妙的時間改進。 仔細研究結果,string-grouper 方法錯過了像 'DARTH VADER' 和 'VADER' 這樣的匹配項,這些匹配項被模糊模糊和快速模糊捕獲。 這可以理解,因為 TF-IDF 的工作方式,它似乎完全錯過了小字符串。 是否有任何解決方法可以改善此示例中 string-grouper 的匹配或改善 Rapidfuzz 所花費的時間? 任何更快的迭代方法? 或者有其他方法可以解決問題嗎?

數據經過預處理,包含所有沒有特殊字符或數字的 CAPS 字符串。

每次迭代花費的時間約為 1 秒。 這是 Rapidfuzz 的代碼:

from rapidfuzz import process, utils, fuzz

for index,rows in df.iterrows()
    list.append(process.extract(rows['names'],df['names'],scorer=fuzz.partial_token_set_ratio,score_cutoff=80))

超快速解決方案,這里是string-grouper的代碼:

from string_grouper import match_strings
matches=match_strings(df.['names'])

這里討論了一些與fuzzywuzzy 類似的問題:( Python 中的模糊字符串匹配

此外,一般來說,是否有任何其他編程語言可以轉換,例如 R 可以加快速度? 只是好奇...謝謝你的幫助😊

您應該嘗試一下tfidf-matcher ,它不適用於我的特定用例,但它可能非常適合您。

可以在 string- ngram_size中的match_strings函數中使用min_similarity更改最小相似度,並使用min_similarity更改 n-gram 的大小。 對於特定示例,您可以使用更高的 ngram_size,但這可能會導致您再次錯過其他點擊。

tfidf matcher 對我來說非常有用。 沒有麻煩,只需調用一個函數 + 您可以設置要將單詞拆分為多少個 ngram,以及您想要的接近匹配的數量 + 匹配中的置信度值。 它也足夠快:在大約 23 萬字的數據集中查找一個字符串最多需要大約 3 秒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM