本篇分享的依然是關於hanlp的分詞使用,文章內容分享自 gladosAI 的博客,本篇文章中提出了一個問題,hanlp分詞影響了實驗判斷結果。爲什麼會如此,不妨一塊兒學習一下 gladosAI 的這篇文章。java
學習內容python
在以前的實驗中獲得了不在詞向量裏的詞與分詞結果,結果有500多個詞不在詞向量裏,解決方案就是從新分詞,或再追加訓練這些詞到詞向量裏。但後者相對麻煩且目前樣本量不大。我跟據詞向量的做者[6]所使用的分詞工具來分詞,會比不一樣工具(jieba)的效果要好,由於都是同一模式的分詞,分出來的詞應該都會存在於大型語料庫中。實驗證實思路是對的,最後結果是隻有60幾個詞不在詞向量裏,其中大部分爲名詞,還有些爲因語音翻譯問題所形成的出錯連詞,全部這些詞也只出現一次,這部分能夠考慮最後刪去也不會影響結果。改善未出現詞是個關鍵步驟,由於此後模型會用到詞向量,若是未出現詞過多,會影響詞向量效果。ubuntu
問題:不過最後HANLP分詞影響了實驗判斷結果,準確率從93%(jieba分詞,同模型同參數)降低到90%。工具
實驗:使用HanLP分詞學習
1,前期準備,(環境ubuntu,python3)安裝JAVA-10[3](hanlp是JAVA開發的,即便使用python調用pyhanlp須要藉助java), jpype(python中虛擬java環境),hanlp(開源中文處理工具,不僅是分詞還有各類工具),hanlp的root路徑配置及data數據包放置[4]spa
2,主要程序[5]翻譯
w2v_model = KeyedVectors.load_word2vec_format(w2vpath, binary=False, unicode_errors='ignore') # 加載詞向量3d
hanlppath=\"-Djava.class.path=/media/glados/Learning/project/NLP/hanlp/hanlp-1.6.4.jar:/media/glados/Learning/project/NLP/hanlp/"code
jp.startJVM(jp.getDefaultJVMPath(), hanlppath) # , "-Xms1g", "-Xmx1g") # 啓動JVM, Xmx1g分配1g內存orm
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,實驗結果
(模型使用的是特徵爲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)