pyhanlp 停用詞與用戶自定義詞典功能詳解

2020-12-13 大數據資訊

hanlp的詞典模式

之前我們看了hanlp的詞性標註,現在我們就要使用自定義詞典與停用詞功能了,首先關於HanLP的詞性標註方式具體請看HanLP詞性標註集。

其核心詞典形式如下:

自定義詞典

自定義詞典有多種添加模式,首先是展示的一個小例子,展示了詞彙的動態增加與強行插入,刪除等。更複雜的內容請參考後邊的第二段代碼。

簡單的例子

from pyhanlp import *

text = "攻城獅逆襲單身狗,迎娶白富美,走上人生巔峰" # 怎麼可能噗哈哈!

print(HanLP.segment(text))

CustomDictionary = JClass("com.hankcs.hanlp.dictionary.CustomDictionary")

CustomDictionary.add("攻城獅") # 動態增加

CustomDictionary.insert("白富美", "nz 1024") # 強行插入

#CustomDictionary.remove("攻城獅"); # 刪除詞語(注釋掉試試)

CustomDictionary.add("單身狗", "nz 1024 n 1")

# 展示該單詞詞典中的詞頻統計 展示分詞

print(CustomDictionary.get("單身狗"))

print(HanLP.segment(text))

# 增加用戶詞典,對其他分詞器同樣有效

# 注意此處,CRF分詞器將單身狗分為了n 即使單身狗:"nz 1024 n 1"

CRFnewSegment = HanLP.newSegment("crf")

print(CRFnewSegment.seg(text))

[攻城獅, 逆襲, 單身狗, ,, 迎娶, 白富美, ,, 走上, 人生, 巔峰]

nz 1024 n 1

[攻城獅, 逆襲, 單身狗, ,, 迎娶, 白富美, ,, 走上, 人生, 巔峰]

[攻城, 獅逆襲, 單身狗, ,, 迎娶, 白富美, ,, 走, 上, 人生, 巔峰]

複雜的例子

""" 演示自定義詞性,以及往詞典中插入自定義詞性的詞語

!!!由於採用了反射技術,用戶需對本地環境的兼容性和穩定性負責!!!

TO-DO

如果使用了動態詞性之後任何類使用了switch(nature)語句,必須註冊每個類

"""

# 對於系統中已有的詞性,可以直接獲取

Nature = JClass("com.hankcs.hanlp.corpus.tag.Nature")

pc_nature = Nature.fromString("n")

print(pc_nature)

# 此時系統中沒有"電腦品牌"這個詞性

pc_nature = Nature.fromString("電腦品牌")

print(pc_nature)

# 我們可以動態添加一個

pc_nature = Nature.create("電腦品牌");

print(pc_nature)

# 可以將它賦予到某個詞語

LexiconUtility = JClass("com.hankcs.hanlp.utility.LexiconUtility")

LexiconUtility.setAttribute("蘋果電腦", pc_nature)

# 或者

LexiconUtility.setAttribute("蘋果電腦", "電腦品牌 1000")

# 它們將在分詞結果中生效

term_list = HanLP.segment("蘋果電腦可以運行開源阿爾法狗代碼嗎")

print(term_list)

for term in term_list:

if term.nature == pc_nature:

print("找到了 [{}] : {}\n".format(pc_nature, term.word))

# 還可以直接插入到用戶詞典

CustomDictionary = JClass("com.hankcs.hanlp.dictionary.CustomDictionary")

CustomDictionary.insert("阿爾法狗", "科技名詞 1024")

StandardTokenizer = JClass("com.hankcs.hanlp.tokenizer.StandardTokenizer")

StandardTokenizer.SEGMENT.enablePartOfSpeechTagging(True) # 依然支持隱馬詞性標註

term_list = HanLP.segment("蘋果電腦可以運行開源阿爾法狗代碼嗎")

print(term_list)

n

None

電腦品牌

[蘋果電腦/電腦品牌, 可以/v, 運行/vn, 開源/v, 阿爾法/nrf, 狗/n, 代碼/n, 嗎/y]

找到了 [電腦品牌] : 蘋果電腦

[蘋果電腦/電腦品牌, 可以/v, 運行/vn, 開源/v, 阿爾法狗/科技名詞, 代碼/n, 嗎/y]

關於自定義詞典的說明(原作者的原文)

說明

l CustomDictionary是一份全局的用戶自定義詞典,可以隨時增刪,影響全部分詞器。另外可以在任何分詞器中關閉它。通過代碼動態增刪不會保存到詞典文件。

l 中文分詞≠詞典,詞典無法解決中文分詞,Segment提供高低優先級應對不同場景,請參考FAQ。

追加詞典

l CustomDictionary主詞典文本路徑是data/dictionary/custom/CustomDictionary.txt,用戶可以在此增加自己的詞語(不推薦);也可以單獨新建一個文本文件,通過配置文件CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 我的詞典.txt;來追加詞典(推薦)。

l 始終建議將相同詞性的詞語放到同一個詞典文件裡,便於維護和分享。

詞典格式

l 每一行代表一個單詞,格式遵從[單詞] [詞性A] [A的頻次] [詞性B] [B的頻次] ... 如果不填詞性則表示採用詞典的默認詞性。

l 詞典的默認詞性默認是名詞n,可以通過配置文件修改:全國地名大全.txt ns;如果詞典路徑後面空格緊接著詞性,則該詞典默認是該詞性。

l 在統計分詞中,並不保證自定義詞典中的詞一定被切分出來。用戶可在理解後果的情況下通過Segment#enableCustomDictionaryForcing強制生效。

l 關於用戶詞典的更多信息請參考詞典說明一章(請看本文最後)。

停用詞

關於停用詞,我同樣先給出了一個簡單的例子,你可以使用這個例子來完成你所需要的功能。要注意的一點是,因為java中的類所返回的數據類型與Python不統一,所以當你使用不同的函數的時候,一定要先檢查輸出結果在Python中的類型,不然可能會出現意想不到的問題。

假如你想了解更多,可以看第二個更複雜的例子。

簡單的例子

# 使用停用詞的簡單例子

text = "小區居民有的反對餵養流浪貓"

CRFnewSegment = HanLP.newSegment("crf")

term_list = CRFnewSegment.seg(text)

# BasicTokenizer = SafeJClass("com.hankcs.hanlp.tokenizer.BasicTokenizer")

# term_list = BasicTokenizer.segment(text)

CoreStopWordDictionary = JClass("com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary")

CoreStopWordDictionary.apply(term_list)

HanLP.Config.ShowTermNature = False

print(term_list)

print([i.word for i in term_list])

[小區, 居民, 反對, 養, 流, 浪, 貓]

['小區', '居民', '反對', '養', '流', '浪', '貓']

複雜的例子

# 停用詞

# 在import pyhanlp之前編譯自己的Java class,並放入pyhanlp/static中

import os

from pyhanlp.static import STATIC_ROOT, HANLP_JAR_PATH

java_code_path = os.path.join(STATIC_ROOT, 'MyFilter.java')

with open(java_code_path, 'w') as out:

java_code = """

import com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary;

import com.hankcs.hanlp.dictionary.stopword.Filter;

import com.hankcs.hanlp.seg.common.Term;

public class MyFilter implements Filter

{

public boolean shouldInclude(Term term)

{

if (term.nature.startsWith('m')) return true; // 數詞保留

return !CoreStopWordDictionary.contains(term.word); // 停用詞過濾

}

}

"""

out.write(java_code)

os.system('javac -cp {} {} -d {}'.format(HANLP_JAR_PATH, java_code_path, STATIC_ROOT))

# 編譯結束才可以啟動hanlp

CoreStopWordDictionary = JClass("com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary")

Filter = JClass("com.hankcs.hanlp.dictionary.stopword.Filter")

Term = JClass("com.hankcs.hanlp.seg.common.Term")

BasicTokenizer = JClass("com.hankcs.hanlp.tokenizer.BasicTokenizer")

NotionalTokenizer = JClass("com.hankcs.hanlp.tokenizer.NotionalTokenizer")

text = "小區居民有的反對餵養流浪貓,而有的居民卻贊成餵養這些小寶貝"

# 可以動態修改停用詞詞典

CoreStopWordDictionary.add("居民")

print(NotionalTokenizer.segment(text))

CoreStopWordDictionary.remove("居民")

print(NotionalTokenizer.segment(text))

# 可以對任意分詞器的結果執行過濾

term_list = BasicTokenizer.segment(text)

print(term_list)

CoreStopWordDictionary.apply(term_list)

print(term_list)

# 還可以自定義過濾邏輯

MyFilter = JClass('MyFilter')

CoreStopWordDictionary.FILTER = MyFilter()

print(NotionalTokenizer.segment("數字123的保留")) # 「的」位於stopwords.txt所以被過濾,數字得到保留

[小區/n, 反對/v, 餵養/v, 流浪貓/nz, 贊成/v, 餵養/v, 小寶貝/nz]

[小區/n, 居民/n, 反對/v, 餵養/v, 流浪貓/nz, 居民/n, 贊成/v, 餵養/v, 小寶貝/nz]

[小區/n, 居民/n, 有/vyou, 的/ude1, 反對/v, 餵養/v, 流浪貓/nz, ,/w, 而/cc, 有的/rz, 居民/n, 卻/d, 贊成/v, 餵養/v, 這些/rz, 小寶貝/nz]

[小區/n, 居民/n, 反對/v, 餵養/v, 流浪貓/nz, 居民/n, 贊成/v, 餵養/v, 小寶貝/nz]

[數字/n, 123/m, 保留/v]

詞典說明(原作者原文)

本章詳細介紹HanLP中的詞典格式,滿足用戶自定義的需要。HanLP中有許多詞典,它們的格式都是相似的,形式都是文本文檔,隨時可以修改。

基本格式

詞典分為詞頻詞性詞典和詞頻詞典。

詞頻詞性詞典(如CoreNatureDictionary.txt)

l 每一行代表一個單詞,格式遵從[單詞] [詞性A] [A的頻次] [詞性B] [B的頻次] ...。

l 支持省略詞性和頻次,直接一行一個單詞。

l .txt詞典文件的分隔符為空格或制表符,所以不支持含有空格的詞語。如果需要支持空格,請使用英文逗號,分割的純文本.csv文件。在使用Excel等富文本編輯器時,則請注意保存為純文本形式。

詞頻詞典(如CoreNatureDictionary.ngram.txt)

l 每一行代表一個單詞或條目,格式遵從[單詞] [單詞的頻次]。

l 每一行的分隔符為空格或制表符。

少數詞典有自己的專用格式,比如同義詞詞典兼容《同義詞詞林擴展版》的文本格式,而轉移矩陣詞典則是一個csv表格。

下文主要介紹通用詞典,如不註明,詞典特指通用詞典。

數據結構

Trie樹(字典樹)是HanLP中使用最多的數據結構,為此,我實現了通用的Trie樹,支持泛型、遍歷、儲存、載入。

用戶自定義詞典採用AhoCorasickDoubleArrayTrie和二分Trie樹儲存,其他詞典採用基於雙數組Trie樹(DoubleArrayTrie)實現的AC自動機AhoCorasickDoubleArrayTrie。關於一些常用數據結構的性能評估,請參考wiki。

儲存形式

詞典有兩個形態:文本文件(filename.txt)和緩存文件(filename.txt.bin或filename.txt.trie.dat和filename.txt.trie.value)。

文本文件

l 採用明文儲存,UTF-8編碼,CRLF換行符。

緩存文件

l 就是一些二進位文件,通常在文本文件的文件名後面加上.bin表示。有時候是.trie.dat和.trie.value。後者是歷史遺留產物,分別代表trie樹的數組和值。

l 如果你修改了任何詞典,只有刪除緩存才能生效。

修改方法

HanLP的核心詞典訓練自人民日報2014語料,語料不是完美的,總會存在一些錯誤。這些錯誤可能會導致分詞出現奇怪的結果,這時請打開調試模式排查問題:(本文作者FontTian註:在本文動筆前,原詞典一進變為了9970萬版本的最大中文語料。但是詞典說明中原作者沒改)

HanLP.Config.enableDebug();

核心詞性詞頻詞典

l 比如你在data/dictionary/CoreNatureDictionary.txt中發現了一個不是詞的詞,或者詞性標註得明顯不對,那麼你可以修改它,然後刪除緩存文件使其生效。

l 目前CoreNatureDictionary.ngram.txt的緩存依賴於CoreNatureDictionary.txt的緩存,修改了後者之後必須同步刪除前者的緩存,否則可能出錯

核心二元文法詞典

l 二元文法詞典data/dictionary/CoreNatureDictionary.ngram.txt儲存的是兩個詞的接續,如果你發現不可能存在這種接續時,刪掉即可。

l 你也可以添加你認為合理的接續,但是這兩個詞必須同時在核心詞典中才會生效。

命名實體識別詞典

l 基於角色標註的命名實體識別比較依賴詞典,所以詞典的質量大幅影響識別質量。

l 這些詞典的格式與原理都是類似的,請閱讀相應的文章或代碼修改它。

相關焦點

  • 彩雲小譯用戶自定義語庫上線,讓你擁有自己的專屬翻譯
    這個時候就輪到彩雲小譯出場了,彩雲小譯新功能用戶自定義術語庫上線,讓你擁有一款可以量身定製的翻譯軟體,翻譯結果隨時修改,大大提高閱讀的便捷性和可讀性。 作為全球第一款神經網絡中英同傳 App ,彩雲小譯中英 / 中日互譯翻譯質量已超越谷歌,翻譯準確度媲美雅思 7.0 / 託福 IBT 100 的人類譯者。
  • 別出「心義」的《俄語語言心理詳解詞典》
    中的「女人」一詞,常有「力量小的」「任性的」「反覆多變的」等隱含意義。相比傳統詞典,《俄語語言心理詳解詞典》的編纂主要依據詞彙的心理語言學意義,而非傳統的詞典學意義。詞彙的詞典學意義是詞典編纂者根據還原論原則創立的,而詞彙的心理語言學意義反映的則是母語者的心理聯想。
  • 原文閱讀好幫手 海詞詞典更給力
    海詞在線詞典開年之後動作頻頻,先後更新了品牌功能背單詞、海詞英語並上線測試英語角。上周海詞在線翻譯詞典又將PC客戶端詞典-海詞典典升級至V2.3.5。更新後的版本強化了對pdf的支持,讓用戶在閱讀英語原文資料的同時方便快捷的學習生詞。新版海詞典典對PDf同樣支持取詞和劃詞兩種查詢模式,方便用戶根據自己的喜好來選擇。
  • 用戶添加釋義和報錯功能 有道詞典更新
    有道詞典是網易有道出品的一款很小很強大的翻譯軟體,通過獨創的網絡釋義功能,輕鬆囊括網際網路上的流行詞彙與海量例句,支持中英日韓法多語種翻譯,目前已經有超過8000萬用戶使用。  點擊此處下載有道詞典  多語種網絡詞典  新增網頁翻譯功能,在翻譯框內輸入網址點擊翻譯,即可得到翻譯後的該網址頁面。  具有多國語言發音功能,日韓法語全部標準朗讀。  輕鬆囊括網際網路最新流行的詞彙。  中英日韓法五國語言輕鬆查詢。
  • 漢語言處理工具pyhanlp的簡繁轉換
    說明:·HanLP能夠識別簡繁分歧詞,比如印表機=印表機。許多簡繁轉換工具不能區分「以後」「皇后」中的兩個「後」字,HanLP可以。算法詳解:·《漢字轉拼音與簡繁轉換的Java實現》——請查閱此文1. from pyhanlp import *2. # 繁簡轉化3. print(HanLP.convertToTraditionalChinese
  • 日語查詞尷尬怎麼破?有道詞典獨家推出日語手寫功能
    這一情況現在或許能得到一定緩解,日前,有道詞典發布了其新版7.2.0,獨家推出手寫查詞功能,從輸入便捷性、詞彙豐富性、交互友好性等方面打造了一個對日語用戶十分友好的免費APP產品。對於日語初學者來說,查詞是個繞不過去的尷尬難題,因為既不會寫也不會念的原因,初學者在使用手機詞典進行日語查詞時往往一籌莫展。
  • 日語查詞尷尬怎麼破 有道詞典獨家推出日語手寫功能
    這一情況現在或許能得到一定緩解,日前,有道詞典發布了其新版7.2.0,獨家推出手寫查詞功能,從輸入便捷性、詞彙豐富性、交互友好性等方面打造了一個對日語用戶十分友好的免費APP產品。對於日語初學者來說,查詞是個繞不過去的尷尬難題,因為既不會寫也不會念的原因,初學者在使用手機詞典進行日語查詞時往往一籌莫展。
  • OneNote重磅功能:自定義標籤
    IT之家12月18日消息 微軟OneNote官方博客今天宣布,在未來幾周內為用戶提供自定義標籤功能。藉助此功能,用戶可以為代碼命名並選擇圖標來創建自定義代碼,該代碼將跨設備同步並顯示在應用搜索結果中。向頁面添加自定義標籤,並以任何方式保持井井有條,幫助你實現更多目標。
  • 美國韋氏詞典將修改「種族主義」一詞定義
    海外網6月10日消息,在美國抗議示威活動持續蔓延之時,一位22歲的大學畢業生致信出版著名韋氏詞典系列的梅裡厄姆·韋伯斯特公司,要求對方修改「種族主義」(racism)一詞的定義。在經過幾番交流後,公司最終同意了這一要求。綜合美國有線電視新聞網(CNN)、《紐約郵報》等美媒報導,這位名叫甘迺迪·米查姆的密蘇裡州女子在弗洛伊德案後聯繫了出版公司。
  • 有道詞典筆只會英語查詞?糖貓詞典筆還有這些功能
    詞典筆作為一款可實現自助查詞、翻譯、學口語的學習神器,近年來逐漸走入校園生活中,其核心價值在於:進入手機受限制的場景提供快速查詞體驗。下面實測一下由搜狗出品的糖貓詞典筆和網易的有道詞典筆。有道詞典筆主打「一掃即查,快速高效」的省時便捷查詞功能,支持單詞、整句、換行的中英文互譯等功能,似乎能夠滿足大部分人的學習需求了。但是,對於需求下沉的功能就略顯不夠了。
  • 谷歌升級拼音輸入法 用戶可自定義標點符號
    谷歌升級拼音輸入法 用戶可自定義標點符號 2007-08-15
  • 搜狗英文搜索上線權威詞典功能 幫你掃除英語閱讀中的生詞障礙
    近日,搜狗英文搜索全新升級,新增權威詞典功能,能夠滿足用戶在檢索及查詢英語詞彙上的需求。此功能的上線,意味著作為全球首個跨語言搜尋引擎,搜狗英文搜索將進一步幫助國人打破語言壁壘,無障礙讀懂全球英文信息,即便是某個具體的英文詞彙,也能讓用戶便捷獲取權威全面的釋義、用法等信息。
  • 微軟學習工具月活用戶超千萬 沉浸式閱讀器添牛津圖解詞典等功能
    微軟近期宣布Microsoft Learnings Tools月活躍用戶超過1000萬,並詳細介紹了這些免費工具集的新功能。
  • 有道詞典Mac 2.0強力發布 全面優化用戶體驗
    有道一直致力於為各個平臺提供最好的詞典服務,針對Mac App Store用戶需求,特別推出了有道詞典Mac版,自2012年發布以來,得到了廣大用戶的充分認可,成為Mac App Store中優秀的詞典軟體,在同類軟體中評價卓越。
  • 整合劃詞翻譯功能 谷歌金山詞霸 v1.8
    據悉,谷歌金山詞霸能實現句子翻譯和全文翻譯、網頁翻譯兩大重要功能,這在以往金山詞霸的版本中是不具備的。金山認為,該功能的推出意味著翻譯軟體的兼容問題得到了最終解決。谷歌金山詞霸1.8的劃詞翻譯功能由谷歌中國提供翻譯引擎,是谷歌中國團隊開發,是谷歌雲計算本地化的體現,在線實現了海量詞條,支持7種語言的互譯,且正在開發更多語言版本。
  • 《現代漢語詞典》App上線
    8月22日,《現代漢語詞典》APP在第26屆北京國際圖書博覽會上隆重發布。《現代漢語詞典》APP的出版歷經了兩年的研發時間,也是商務印書館對數字出版動態和移動互聯用戶市場認真分析後的成果。  和紙質詞典不同,《現代漢語詞典》APP不僅呈現拼音、部首等紙書檢索方式,還新增手寫輸入查詢、語音輸入查詢、攝像頭組詞查詢等數位化檢索方式。檢索結果除了所查字詞外,還同時呈現同音字、同部首字,以及同音詞、順序詞、居中詞、倒序詞、相關詞等。同時,APP實現了全文任意字詞「即點即查」。
  • 網易有道詞典筆2.0軟體升級 重磅上線多行掃描翻譯功能
    網易有道詞典筆2.0於今年8月6日完成發布,以遠超行業的高效、高準確度與專注的查詞特點,成為備受行業與用戶青睞的一款智能學習硬體,將用戶的查詞學習帶入智能硬體時代。  短短一個月時間,網易有道詞典筆二代實現了重大功能升級,至此詞典筆二代實現了支持單詞、整句、換行的中英文互譯功能, 此外,本次軟體系統升級也搭載了更豐富與優質的詞庫內容,新增了託福、雅思等專業考試詞典。
  • SQLServer:用戶自定義數據類型用法
    今天給大家梳理一下SQLServer:用戶自定義數據類型用法,希望對大家能有所幫助!