pyhanlp 停用詞與使用者自定義詞典功能詳解
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 這些詞典的格式與原理都是類似的,請閱讀相應的文章或程式碼修改它。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2220287/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- pyhanlp使用者自定義詞典新增例項說明HanLP
- MapReduce實現與自定義詞典檔案基於hanLP的中文分詞詳解HanLP中文分詞
- Hanlp配置自定義詞典遇到的問題與解決方法HanLP
- pyhanlp 中文詞性標註與分詞簡介HanLP詞性標註分詞
- 自然語言處理工具pyhanlp分詞與詞性標註自然語言處理HanLP分詞詞性標註
- 1.2.3 使用者詞典
- es 自定義分詞外掛分詞
- elasticsearch之ik分詞器和自定義詞庫實現Elasticsearch分詞
- day88-ElasticSearch-分詞- 自定義擴充套件詞庫Elasticsearch分詞套件
- HanLP-實詞分詞器詳解HanLP分詞
- 使用PHP實現詞法分析與自定義語言PHP詞法分析
- HanLP-停用詞表的使用示例HanLP
- python使用jieba實現中文文件分詞和去停用詞PythonJieba分詞
- 小程式搜尋自定義關鍵詞功能關閉意欲何為?
- mac詞典怎麼用?Macbook自帶詞典使用技巧Mac
- 最全中文停用詞表整理(1893個)
- Hanlp分詞之CRF中文詞法分析詳解HanLP分詞CRF詞法分析
- HanLP二元核心詞典詳細解析HanLP
- Elasticsearch 近義詞詞庫配置Elasticsearch
- 自然語言處理工具hanlp自定義詞彙新增圖解自然語言處理HanLP圖解
- 有道詞典Flutter架構與應用Flutter架構
- Android自定義View–仿QQ音樂歌詞AndroidView
- ElasticSearch7.3學習(十五)----中文分詞器(IK Analyzer)及自定義詞庫Elasticsearch中文分詞
- 歐陸詞典 Eudic
- 英語詞典翻譯查詢工具:Eudic歐路詞典 for MacMac
- HanLP程式碼與詞典分離方案與流程HanLP
- ES 實現實時從Mysql資料庫中讀取熱詞,停用詞MySql資料庫
- 黃反詞介面 詞典自動化校驗
- 搜尋引擎核心技術與演算法 —— 詞項詞典與倒排索引優化演算法索引優化
- Pyhanlp自然語言處理中的新詞識別HanLP自然語言處理
- Android自定義View--仿QQ音樂歌詞AndroidView
- Kibana的Dev Tools中建立自定義分詞器dev分詞
- 如何在java中去除中文文字的停用詞Java
- 搜尋引擎核心技術與演算法 —— 詞項詞典與倒排索引最佳化演算法索引
- Eudic歐路詞典 for MacMac
- 韋氏詞典新增詞彙:加密貨幣和ICO加密
- 有道雲詞典--翻譯/螢幕取詞翻譯
- 使用Docker快速安裝部署ES和Kibana並配置IK中文分詞器以及自定義分詞擴充詞庫Docker中文分詞