簡體   English   中英

在 Python 中識別視覺上相似的字符串

[英]Identify Visually Similar Strings in Python

我正在一個 python 項目中工作,我需要在其中過濾臟話,而且我已經有了一個過濾器。 唯一的問題是,如果用戶用視覺上相似的字符(例如helloh311o )切換字符,過濾器不會選擇它。 有什么方法可以找到檢測這些單詞而無需對每個組合進行硬編碼?

l331sp33ch轉換為leetspeech並應用簡單的 levensthein 距離怎么樣? (你需要先pip install editdistance

import editdistance
try:
    from string import maketrans # python 2
except:
    maketrans = str.maketrans # python 3

t = maketrans("01345", "oleas")
editdistance.eval("h3110".translate(t), 'hello')

結果為0

也許在視覺上相似的角色和他們可以代表的東西之間建立一種關系,即

dict = {'3': 'e', '1': 'l', '0': 'o'} #etc....

然后您可以使用它來測試您的禁用詞數據庫。 例如

輸入:he11

如果任何字符在 dict 中有條目,

dict['h'] #不存在

dict['e'] #不存在

dict['1'] = 'l'

dict['1'] = 'l'

將它們放在一起形成一個單詞,然后搜索您的禁用列表。 我不知道這是否是最快的方式,但它是“一種”方式。

我有興趣看看其他人提出了什么。

*免責聲明:我已經學習了一年左右的 Perl,現在正在開始學習 Python。 當我有時間。 這是很難得的。

線性替換

你會想要一些適合創新的拼寫器的東西。 首先,將字母字符與您的禁用詞詞典進行模式匹配,使用其他字符作為通配符。 例如,您的示例將被翻譯為“h...o”,您將與您建議的禁忌詞“hello”相匹配。

接下來,您會將非字母字符與替換字典進行比較,從而允許常見的通配符代表任何內容。 例如,星號、連字符和句號可以代表任何東西; '4' 和 '@' 可以代表 'A',依此類推。 但是,您將根據禁忌詞的強度進行檢查,而不是通過生成所有可能性:翻譯是相反的。

你會有一點歧義,因為有些字符代表多個字母。 “@”可以用來代替“O”,因為你變得狡猾了。 另請注意,並非所有字母都在您常用的集合中:您需要處理瞬時符號(歐元、日元和英鎊均源自字母),以及碰巧類似於拉丁字母的外文字母。

多字符替換

這僅處理與禁忌詞長度相同的詞。 你也能處理縮寫嗎? “h-bomb”形式的組合有很多,其中禁用詞只出現在第一個字母:效果是褻瀆的,但匹配起來更困難,尤其是'b'被替換為scharfes-S (德語)、帶有希伯來語或克里爾字母的“m”和帶有任何圓形的“o”構成了整個字體。

語境

還有一個問題,有些詞在一種語境中是完全合法的,但在俚語語境中是褻瀆的。 您是否還打算匹配短語,也許解析一個句子中的觸發詞?

訓練解決方案

如果你需要一個全面的解決方案,可以考慮用你標記為“好的”和“禁忌”的短語和單詞訓練一個神經網絡,讓它運行一天。 這可以減輕您的大量適應工作,並且增強模型並不是一個困難的問題:添加新的差異化文本並從您停止的地方繼續訓練。

感謝所有發布此問題答案的人。 歡迎提供更多答案,因為它們可能會幫助其他人。 我最終離開了 David Zemens 對這個問題的評論。

我會使用字典或常見變體列表(“sh1t”等),您可以將其作為純文本文件或 json 等保存,並讀入內存。 這將允許您根據需要添加新條目,而與代碼本身無關。 如果您只關心臟話,那么該列表應該相當小以維護,並且不太可能出現新的變化。 過去我使用硬編碼的 dict 來表示統計 t 表(具有 1500 個鍵/值對),似乎您的問題不需要那么多鍵。

雖然這仍然意味着所有單詞都將被硬編碼,但它可以讓我更輕松地更新列表。

暫無
暫無

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

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