天天看點

NLP學習------HanLP使用實驗

在之前的實驗中得到了不在詞向量裡的詞與分詞結果,結果有500多個詞不在詞向量裡,解決方案就是重新分詞,或再追加訓練這些詞到詞向量裡。但後者相對麻煩且目前樣本量不大。我跟據詞向量的作者[6]所使用的分詞工具來分詞,會比不同工具(jieba)的效果要好,因為都是同一模式的分詞,分出來的詞應該都會存在于大型語料庫中。實驗證明思路是對的,最後結果是隻有60幾個詞不在詞向量裡,其中大部分為名詞,還有些為因語音翻譯問題所造成的出錯連詞,所有這些詞也隻出現一次,這部分可以考慮最後删去也不會影響結果。改善未出現詞是個關鍵步驟,因為此後模型會用到詞向量,如果未出現詞過多,會影響詞向量效果。

問題:不過最後HANLP分詞影響了實驗判斷結果,準确率從93%(jieba分詞,同模型同參數)下降到90%。

實驗:使用HanLP分詞1

1,前期準備,(環境ubuntu,python3)安裝JAVA-10[3](hanlp是JAVA開發的,即使使用python調用pyhanlp需要借助java), jpype(python中虛拟java環境),hanlp(開源中文處理工具,不隻是分詞還有各種工具),hanlp的root路徑配置及data資料包放置[4]

2,主要程式[5]

w2v_model = KeyedVectors.load_word2vec_format(w2vpath, binary=False, unicode_errors='ignore') # 加載詞向量

hanlppath="-Djava.class.path=/media/glados/Learning/project/NLP/hanlp/hanlp-1.6.4.jar:/media/glados/Learning/project/NLP/hanlp/"

jp.startJVM(jp.getDefaultJVMPath(), hanlppath) # , "-Xms1g", "-Xmx1g") # 啟動JVM, Xmx1g配置設定1g記憶體

jp.JClass('com.hankcs.hanlp.HanLP$Config').ShowTermNature = False # 關閉分詞屬性顯示

HanLP = jp.JClass('com.hankcs.hanlp.HanLP') #普通分詞模式

words = str(HanLP.segment(sentence)) #分詞将結果轉為str

words = re.sub('[反斜杠[反斜杠],n]', ' ', words) # 這裡注意實際程式是單,在blog裡會出問題,是以用反斜杠替代

words = words.split()

words = del_stopword(words)

...

jp.shutdownJVM() # 最後關閉java虛拟環境

使用的是HANLP的普通分詞功能,另外需注意,hanlp.segment()不能直接輸出或指派給python,因為其是java環境中資料,是以隻有轉為str()後,再進行處理,否則會報錯#A fatal error。(另外還有其他java與python資料對應問題,在這裡沒遇到,請參考其他)

詞向量選用的是“Mixed-large綜合”[6],其包括百度wiki百科、人民日報等,總共1293214個詞。

Hanlp的中部份功能沒法使用,例如精确分詞CRF。另外,要先加載詞向量再加載java虛拟環境。#A fatal error has been detected by the Java Runtime Environment

3,實驗結果

model

num_topic

limit

F1

accuracy

precision

recall

tflsi

3

0.45

0.888888889

0.902173913

0.9

0.87804878

(模型使用的是特征為tfidf的lsi模型, 參數:num_topics=3, 判斷是否相似閥值為0.45,即大于0.45為true相似 )

同模型同參數下,jieba分詞結果

jieba分詞未出現在詞向量的約500多,有些詞出現了好幾次,而hanlp分詞隻有60幾個未出現,且多數為名詞,隻出現過一次。

4,分析

在樣本中,所有樣本分詞結果jieba比hanlp要多分出100個詞左右。是以推測因hanlp分詞細粒度大,分出詞少,導緻較少的共現詞出現(也可能是hanlp分詞精度更高,分出很多虛詞被停止詞表過濾造成),也就是說,lsi+tfidf模型對詞細粒度大、分詞少的分詞器不友好,是以最後hanlp出錯率更大。

jieba與hanlp都是很不錯的分詞器,結巴使用更友善。hanlp準确度要高一些(感覺),而且與文中提到的詞向量相比對。

(我免貴姓AI,jieba:我免/貴姓/AI,hanlp:我/免/貴姓/AI,實際:我/免貴/姓AI)

參考資料:

[[自然語言處理 中文分詞 詞性标注 命名實體識别 依存句法分析 關鍵詞提取 新詞發現 短語提取 自動摘要 文本分類 拼音簡繁]](

https://github.com/hankcs/HanLP)

文章來源于gladosAI的部落格