簡體   English   中英

在Python中識別數據庫中的相似字符串

[英]Identifying similar strings in a database in Python

我有一個數據庫表,其中包含超過一百萬個字符串。 每個字符串都是一個術語,長度可以從兩個單詞到五個或六個不等。

["big giant cars", "zebra videos", "hotels in rio de janeiro".......]

我在csv文件中也有一個包含數千個較小術語的黑名單。 我要做的是在數據庫中標識與csv文件中列入黑名單的術語相似的術語。 在這種情況下,可以將相似性解釋為對黑名單中的術語的拼寫錯誤。

我熟悉python之類的庫,例如Fuzzywuzzy ,它們可以使用Levensthein距離評估字符串相似度並返回相似度的整數表示。 本教程中的一個示例為:

fuzz.ratio("NEW YORK METS", "NEW YORK MEATS") ⇒ 96

這種方法的缺點是,它可能會錯誤地標識可能在不同上下文中表示某些含義的術語。

一個簡單的例子就是“大屁股”,一個列入黑名單的字符串,與諸如“大但”之類的更純真的字符串相混淆。

我的問題是,是否可以在python中以編程方式完成此任務,還是僅檢索所有外觀相似的關鍵字並過濾誤報會更容易?

我不確定這個問題是否有明確的答案,所以我能做的最好的事情就是解釋我將如何解決這個問題,並希望您能夠從我的討論中得到任何想法。 :-)

第一。

從不相關的角度來看,模糊字符串匹配可能還不夠。 人們將使用外觀相似的字符和非字符符號來解決任何文本匹配問題,以至於黑名單中的單詞與實際文本之間的匹配幾乎為零,但是對於其含義仍然是可讀的。 因此,也許您需要對字典和搜索文本進行一些標准化,例如將所有的“ 0”(零)轉換為“ O”(大寫O),將“> <”轉換為“ X”等。我相信這里有圖書館和/或轉換參考資料。 非拉丁符號也是一種明顯的可能性,應予以考慮。

第二。

我認為您無法一次通過就可以區分黑名單中的單詞和外觀相似的法律變體。 因此,是的,很可能您將不得不搜索可能列入黑名單的匹配項,然后檢查找到的內容是否也與某些合法單詞匹配。 這意味着您不僅需要將其列入黑名單,而且還需要將其列入白名單。 更為積極的一點是,可能不需要對列入白名單的字典進行規范化,因為正在編寫可接受文本的人們可能會以可接受的語言編寫該文本,而沒有上面概述的任何技巧。 或者,如果您感到偏執,可以將其歸一化。 :-)

第三。

但是,問題在於,將單詞/表達式與黑白列表進行匹配實際上並不能給您可靠的答案。 以您的示例為例,一個人可能會寫“大屁股”作為誠實的錯別字,這在上下文中會很明顯(反之亦然,有意寫一個“大屁股”以使白名單單詞具有更高的匹配度,即使上下文使之相當很明顯是什么意思)。 因此,您可能必須實際檢查上下文,以防黑名單和白名單有足夠的匹配項。 這是我並不十分熟悉的領域。 可能有可能為各種單詞(來自兩個詞典)建立相關性圖,以識別哪些單詞與它們結合使用的次數更多(或更少),並使用它們來檢查您的特定示例。 以這一段為例,如果將單詞“ black”與“ list”一起使用,則可以將其列入白名單,但在其他情況下則將其列入黑名單。

第四。

即使將所有這些措施一起使用,您可能還需要保留一定數量的灰色區域。 也就是說,除非在任何一個方向上都具有足夠的確定性,否則將最終決定權留給人類(篩選評論/帖子一段時間,自動將其放入審核隊列,或您的項目要求的其他任何內容)。

第五。

您可能會嘗試學習算法,從上一步中收集人工輸入,然后使用它來自動調整算法。

希望能有所幫助。 :-)

暫無
暫無

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

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