hanlp的詞典模式java
以前咱們看了hanlp的詞性標註,如今咱們就要使用自定義詞典與停用詞功能了,首先關於HanLP的詞性標註方式具體請看HanLP詞性標註集。數組
其核心詞典形式以下:緩存
自定義詞典數據結構
自定義詞典有多種添加模式,首先是展現的一個小例子,展現了詞彙的動態增長與強行插入,刪除等。更復雜的內容請參考後邊的第二段代碼。app
簡單的例子編輯器
from pyhanlp import *函數
text = "攻城獅逆襲單身狗,迎娶白富美,走上人生巔峯" # 怎麼可能噗哈哈!性能
print(HanLP.segment(text))編碼
CustomDictionary = JClass("com.hankcs.hanlp.dictionary.CustomDictionary")spa
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]
關於自定義詞典的說明(原做者的原文)
說明
追加詞典
詞典格式
停用詞
關於停用詞,我一樣先給出了一個簡單的例子,你可使用這個例子來完成你所須要的功能。要注意的一點是,由於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)
詞頻詞典(如CoreNatureDictionary.ngram.txt)
少數詞典有本身的專用格式,好比同義詞詞典兼容《同義詞詞林擴展版》的文本格式,而轉移矩陣詞典則是一個csv表格。
下文主要介紹通用詞典,如不註明,詞典特指通用詞典。
數據結構
Trie樹(字典樹)是HanLP中使用最多的數據結構,爲此,我實現了通用的Trie樹,支持泛型、遍歷、儲存、載入。
用戶自定義詞典採用AhoCorasickDoubleArrayTrie和二分Trie樹儲存,其餘詞典採用基於雙數組Trie樹(DoubleArrayTrie)實現的AC自動機AhoCorasickDoubleArrayTrie。關於一些經常使用數據結構的性能評估,請參考wiki。
儲存形式
詞典有兩個形態:文本文件(filename.txt)和緩存文件(filename.txt.bin或filename.txt.trie.dat和filename.txt.trie.value)。
文本文件
緩存文件
修改方法
HanLP的核心詞典訓練自人民日報2014語料,語料不是完美的,總會存在一些錯誤。這些錯誤可能會致使分詞出現奇怪的結果,這時請打開調試模式排查問題:(本文做者FontTian注:在本文動筆前,原詞典一進變爲了9970萬版本的最大中文語料。可是詞典說明中原做者沒改)
HanLP.Config.enableDebug();
核心詞性詞頻詞典
核心二元文法詞典
命名實體識別詞典
文章來源 FonTIan 的博客