自我介紹
- 做一個簡單介紹,酒架年近48 ,有20多年IT工作經歷,目前在一家500強做企業(yè)架構.因為工作需要,另外也因為興趣涉獵比較廣,為了自己學習建立了三個博客,分別是【全球IT瞭望】,【架構師酒館】和【開發(fā)者開聊】,有更多的內容分享,謝謝大家收藏。
- 企業(yè)架構師需要比較廣泛的知識面,了解一個企業(yè)的整體的業(yè)務,應用,技術,數據,治理和合規(guī)。之前4年主要負責企業(yè)整體的技術規(guī)劃,標準的建立和項目治理。最近一年主要負責數據,涉及到數據平臺,數據戰(zhàn)略,數據分析,數據建模,數據治理,還涉及到數據主權,隱私保護和數據經濟。 因為需要,比如數據資源入財務報表,另外數據如何估值和貨幣化需要財務和金融方面的知識,最近在學習財務,金融和法律。打算先備考CPA,然后CFA,如果可能也想學習法律,備戰(zhàn)律考。
- 歡迎愛學習的同學朋友關注,也歡迎大家交流。微信小號【ca_cea】
Python中隱私過濾器的實現,該過濾器通過命名實體識別(NER)刪除個人身份信息(PII)
這是我上一篇關于從文本中刪除個人信息的文章的后續(xù)內容。
GDPR是歐盟制定的《通用數據保護條例》。其目的是保護所有歐洲居民的數據。保護數據也是開發(fā)人員的內在價值。通過控制對列和行的訪問,保護行/列數據結構中的數據相對容易。但是免費文本呢?
在我上一篇文章中,我描述了一個基于正則表達式用法和禁止詞列表的解決方案。在本文中,我們添加了一個基于命名實體識別(NER)的實現。完整的實現可以在github PrivacyFilter項目中找到。
什么是命名實體識別?
根據維基百科,NER是:
命名實體識別(NER)(也稱為(命名)實體識別、實體分塊和實體提?。┦切畔⑻崛〉囊粋€子任務,旨在定位非結構化文本中提到的命名實體,并將其分類為預定義的類別,如人名、組織、位置、醫(yī)療代碼、時間表達式、數量、貨幣值、百分比等。
因此,這一切都是關于尋找和識別文本中的實體。一個實體可以是一個單詞或一系列連續(xù)的單詞。實體被分類到預定義的類別中。例如,在下面的句子中,發(fā)現了三個實體:實體人“Sebastian Thrun”、實體組織“Google”和實體日期“2007”。
Example entity recognition (source:?Spacy.io)
NER是自然語言處理(NLP)人工智能領域的一個子集。該領域包含處理和分析自然語言的算法。當NER能夠用自然語言識別實體時,如果是個人、組織、日期或地點等與隱私相關的實體,則可以從文本中刪除這些實體。
使用NER過濾PII
首先,我們需要一個NLP處理包。NLP包是按語言訓練的,因為所有語言都有自己的語法。我們正在與達奇合作,所以我們需要一個了解這一點的人。我們將使用Spacy作為我們的隱私過濾器。
在Spacy網站上可以找到一個幫助安裝Spacy的工具。在選擇Python環(huán)境和語言后,它會給出相應的命令來安裝Spacy:
Spacy install tool (source:?Spacy.io)
所選管道(效率或精度)決定了NER模型相對于尺寸和速度的精度。選擇“效率”會產生更小、更快的模型,但與“精度”相比精度更低。這取決于您的用例哪個模型更合適。為了發(fā)展,我們選擇使用效率模型。進行第一次凈入學率分析:
import spacy nlp = spacy.load("nl_core_news_sm") doc = nlp("Geert werkt sinds 2010 voor HAL.") for token in doc: print(token.text, token.pos_, token.ent_type_) ''' Output: Geert PROPN PERSON werkt VERB sinds ADP 2010 NUM DATE voor ADP HAL PROPN ORG . PUNCT '''
在第2行導入Spacy包之后,將使用Spacy.load()方法加載模型。在這種情況下,加載了Dutch的有效模型。模型由其名稱指定,該名稱與上一步中用于下載模型的名稱相同。要切換到準確的荷蘭語模型,請將“nl_core_news_sm”替換為“nl_core _news_lg”。對于上面的示例,這將產生相同的輸出。
快速、簡單的性能測試表明,加載小型模型大約需要2.0秒,加載大型模型大約需要4.5秒。分析一個句子需要5.5毫秒,而不是6.0毫秒。大型號似乎需要大約500 MB的額外內存。
詞性(POS)標簽的含義可以在這個網站上找到。例如,它們是:
Geert PROPN PERSON Proper noun, person werkt VERB Verb sinds ADP Adposition, case marking 2010 NUM DATE Numeral, date voor ADB Adposition HAL PROPN ORG Proper noun, organisation . PUNCT Punctuation
對于過濾PII,我們對POS類型NUM和PROPN感興趣。我們將用描述其實體類型的標簽來替換POS文本元素。
import spacy string = "Geert werkt sinds 2010 voor HAL." print(string) nlp = spacy.load("nl_core_news_sm") doc = nlp(string) filtered_string = "" for token in doc: if token.pos_ in ['PROPN', 'NOUN', 'NUM']: new_token = " <{}>".format(token.ent_type_) elif token.pos_ == "PUNCT": new_token = token.text else: new_token = " {}".format(token.text) filtered_string += new_token filtered_string = filtered_string[1:] print(filtered_string) ''' Output: Geert werkt sinds 2010 voor HAL. <PERSON> werkt sinds <NUMBER> voor <ORG>. '''
代碼的第一部分加載語言模型,并將輸入字符串解析為令牌列表(doc)。第8-16行中的循環(huán)通過迭代文檔中的所有標記來構建過濾后的文本。如果令牌的類型為PROPN、NOUN或NUMBER,則會用標記<…>替換,其中標記等于Spacy識別的實體類型。所有令牌都通過前綴空間連接到新字符串。前綴是必需的,因為標記化字符串已經刪除了這些前綴。如果是標點符號,則不添加前綴空格(第12-13行)。
在循環(huán)之后,由于第11行或第13行的原因,新字符串的第一個字符是一個空格,因此我們需要刪除這個空格(第17行)。這導致字符串中沒有隱私信息。
它有多好?
在上一篇文章中,我們已經建立了一個基于禁止詞列表的隱私過濾器。與NER相比,該學徒需要更多的代碼和精力。但它們的比較如何?
- NER要求語法正確的句子。在這種情況下,即使姓名拼寫錯誤,也可以很好地替換隱私信息。NER優(yōu)于禁言表。
- 無論上下文如何,禁詞過濾器都會替換禁詞。尤其是街道名稱和城市名稱的列表會導致大量不必要的刪除詞。例如,植物名稱、動物或城堡等項目等單詞作為街道名稱很常見,將從文本中刪除。這可能會刪除許多不必要的單詞,從而降低生成文本的可用性。NER的表現會更好。
- 如果文本在語法上不正確(例如,“你叫什么名字?”問題的答案“Peter”將不會被NER過濾為正確。這些句子在聊天信息和對話記錄中很常見。在這些情況下,NER方法將失敗,因為NER算法無法用一個或幾個詞來確定這些答案的性質。
因此,這完全取決于您的用例和所需的過濾級別。該組合確定最佳方法是使用禁止列表版本、NER版本還是甚至兩者的組合。后者將結合這兩種方法的優(yōu)點(但也有部分缺點)。要找到最佳方法,請使用數據的子集來篩選和測試不同的算法和/或組合,以找到最適合的算法。
將NER與禁止詞列表(FWL)進行比較的一些示例:
INPUT: Geert werkt sinds 2010 voor HAL. NER : <FILTERED> werkt sinds <FILTERED> voor <FILTERED>. FWL : <FILTERED> werkt sinds <FILTERED> voor HAL. INPUT: Heert werkt sinds 2010 voor HAL. NER : <FILTERED> werkt sinds <FILTERED> voor <FILTERED>. FWL : Heert werkt sinds <FILTERED> voor HAL. INPUT: Wat is je naam? Geert. NER : Wat is je naam? Geert. FWL : Wat is je naam? FILTERED. INPUT: Geert kijkt naar de duiven op het dak. NER : <FILTERED> kijkt naar de duiven op het dak. FWL : <FILTERED> kijkt naar de <FILTERED> op het dak.
(為了便于比較,所有標簽(如<PERSON>)都替換為通用標簽<FILTERED>)
- 第一個示例顯示tat FWL無法刪除公司名稱,因為它沒有公司名稱列表。NER算法在句子上確定了“HAL”是一個名詞,更具體地說是一個組織。
- 第二個例子表明,NER可以處理名稱中的類型錯誤,因為它查看句子的結構,而FWL不將“Heert”識別為名稱。名稱列表只包含拼寫正確的版本。
- 第三個例子表明,NER需要語法正確的句子來識別“Geert”這個名字。這可能是一次談話的記錄,也可能是聊天中的互動。它展示了NER如何在書面語言方面表現良好,但在理解口語方面存在困難。
- 在最后一個例子中,FWL刪除了“duiven”一詞,因為它不僅描述了動物(duiven在荷蘭語中是鴿子的意思),而且還是一個城市的名字。
privacy filter code on Github?包含這兩種方法,在初始化過程中可以選擇NER方法或FWL方法。我們在本文中沒有涉及正則表達式,但選擇NER方法也會執(zhí)行正則表達式(NER無法識別和替換URL等)。它還包含了一些使用和過濾的示例文本,以了解兩種方法在現實生活中的美國案例中的差異。
最后一句話
本文和前一篇文章描述了刪除文本中個人信息的兩種方法。這兩種方法都有其優(yōu)點和缺點,不可能為所有用例選擇一種方法。刪除更多的隱私信息也會導致刪除更多的非隱私信息,從而降低過濾文本的價值。NER在刪除已識別的隱私信息方面更準確,但需要格式良好的句子才能操作。為了最大限度地提高安全性,甚至可以將這兩種方法結合起來。請隨意在Github上嘗試實現。
我希望你喜歡這篇文章。想要獲得更多靈感,請查看我的其他文章
本文:【自然語言處理】用Python從文本中刪除個人信息-第二部分 | 開發(fā)者開聊文章來源:http://www.zghlxwxcb.cn/news/detail-766686.html
歡迎收藏??【全球IT瞭望】,【架構師酒館】和【開發(fā)者開聊】.文章來源地址http://www.zghlxwxcb.cn/news/detail-766686.html
到了這里,關于【自然語言處理】用Python從文本中刪除個人信息-第二部分的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!