2016-03-02 30 views
0

我有一個包含超過一百萬個字符串的數據庫表。每個字符串是一個術語,其長度可以從兩個單詞到五個或六個不等。在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中是否可以通過編程來實現這一點,還是僅僅檢索所有類似外觀的關鍵字並過濾出誤報會更容易?

回答

1

我不確定這個問題有任何明確的答案,所以我能做的最好的就是解釋我將如何處理這個問題,並希望你能從我的隨機文件中得到任何想法。 :-)

首先。

在一個不相關的角度上,模糊字符串匹配可能不夠。人們將使用類似外觀的字符和非字符符號來解決任何文本匹配問題,直到黑名單詞和實際文本之間的匹配幾乎爲零,但它仍然是可讀的。所以也許你會需要一些你的字典和搜索文本的規範化,比如將所有'0'(零)轉換爲'O'(大寫O),'> <'等'X'等。我相信有庫和/或轉換引用的目的。非拉丁符號也是一個明顯的可能性,應該加以考慮。

二。

我不認爲你能夠通過一次傳遞區分黑名單和類似外觀的合法變體。所以是的,很可能你必須搜索可能的黑名單,然後檢查你發現的是否與某些法律詞語相符。這意味着您不僅需要列入黑名單的字典,還需要列入白名單的字典。更積極的一點是,可能不需要對白名單詞典進行規範化處理,因爲編寫可接受文本的人可能會用可接受的語言編寫而不需要上面列出的任何技巧。或者如果你感到偏執,你可以規範化。 :-)

三。

然而,問題是匹配單詞/表達式對黑白名單實際上並沒有給你一個可靠的答案。使用你的例子,一個人可能會把「大屁股」寫成一個誠實的錯字,這將在上下文中顯而易見(反之亦然,寫一個「大但有意」的名詞來對抗白名單單詞的更高匹配,即使上下文使得它相當明顯的真正含義是什麼)。所以你可能不得不實際檢查上下文以防與黑名單和白名單有足夠的匹配。這是我並不熟悉的領域。可以爲各種詞彙(來自兩個詞典)建立相關性映射,以確定哪些詞彙經常與它們結合使用(或更少),並用它們來檢查您的具體示例。以此段落爲例,如果「黑名單」與「名單」一起使用,但在其他一些情況下列入黑名單,則可以列入白名單。

四,

即使將所有這些措施一起應用,您可能想留下一定數量的灰色區域。也就是說,除非在任何一個方向都有足夠的確定性,否則留下人的最終決定(篩選評論/帖子一段時間,自動將它們放入適當的隊列中,或者其他任何項目指定的內容)。

五。

您可能會嘗試着學習算法,收集上一步的人工輸入,並隨着時間的推移使用它來自動微調算法。

希望有所幫助。 :-)

+0

是的,我想通過機器學習會走的路,但我一直在摸索着想弄明白。我開始了一個關於交叉驗證的問題,詢問同一個問題,看起來它會很困難。 http://stats.stackexchange.com/questions/199311/clustering-a-database-of-strings-based-on-their-similarity-to-a-seperate-set-of/199423?noredirect=1#comment378505_199423 – GreenGodot