環境
window7 64位
JDK1.8
Python3.5
stanfordcorenlp的使用
進行中文詞語詞幹化的工作,聽說coreNLP這個工具不錯。
coreNLP是斯坦福大學開發的一套關于自然語言處理的工具(toolbox),使用簡單功能強大,有:命名實體識别、詞性标注、 詞語詞幹化、語句文法樹的構造還有指代關系等功能,使用起來比較友善。
PART1:安裝Stanford NLP
1) 安裝Stanford nlp自然語言處理包:pip install stanfordcorenlp
2) 下載下傳Stanford CoreNLP檔案:http://stanfordnlp.github.io/CoreNLP/download.html
3) 下載下傳中文模型jar包:http://nlp.stanford.edu/software/stanford-chinese-corenlp-208-02-27-models.jar
4) 把解壓後的Stanford CoreNLP檔案夾(個人習慣,這裡我重命名為stanford_nlp)和下載下傳的Stanford-chinese-corenlp-2018-02-27-models.jar放在同一目錄下(注意:一定要在同一目錄下,否則執行會報錯)
5) 在Python中引用模型,執行下面語句:
from stanfordcorenlp import StanfordCoreNLP
nlp=StanfordCoreNLP(r'D:\stanford_nlp',)
PART2:安裝過程問題
然而,很多朋友在上面的執行過程中,總遇到下面的問題(可能原因:coreNLP是使用Java編寫的,運作環境需要在JDK1.8,1.7貌似都不支援,需要引進 .jar 包)我當時也是特别郁悶,網上對于這個問題的解答比較少,這裡依據我的血淚史給大家做個分享,希望對大家有所幫助:
開始安裝 java 的 JDK 了,我安裝的是:jdk-8u171-windows-x64(點選打開連結)
1)輕按兩下安裝包,進入安裝模式,運作->下一步(N);
2)接着點選下一步或者,可以更改希望Java安裝的路徑;
3)接着點選下一步或者,可以更改希望Java安裝的路徑
4)安裝完成後,關閉頁面;
5)安裝完成後我們就可以配置java的環境變量了。(最關鍵的部分)
Step1:進入“計算機”的“屬性”選項,選擇“進階系統設定”,如下圖所示:
Step2:點選“進階系統設定”後,會看到如下圖所示的對話框,選擇“環境變量”:
Step3:點選“環境變量”之後,會看到如下圖所示的對話框:
Step4:接下來就是具體的配置過程了:
Step4.1:選擇上圖所示的“建立”:
“變量名”:Java_Home
“變量值”: D:\jdk1.8.1_171
注:“變量值”這一欄主要填寫的是你安裝 java 的路徑,這裡根據個人的情況可能會有所不同。
Step4.2:上步結束之後,選中環境變量中的“path”,如下圖所示:
選中之後編輯:
在“變量值”一欄的最前面添加如下的 code:
%Java_Home%\bin;%Java_Home%\jre\bin;
注意:上面的代碼最好一個字元不要差,因為Java_Home 已經限制了你的JDK 的路徑了,Java的每個版本的JDK 應該都是由這些東西構成的。
Step4.3: 上一步确定之後,再 “ 建立 ” :
“變量名”:ClassPath
“變量值”:.;%Java_Home%\bin;%Java_Home%\lib\dt.jar;%Java_Home%\lib\tools.jar
注:上面的代碼最好也是一個字元不變的貼上去,“變量值”最前面的 .; 不要漏掉。
做完上面的三個步驟之後,環境變量的配置已經完成了。
Step5: 檢查環境變量搭好了:調出“cmd”檢查:
Step5.1:輸入:“java”,你應該看到下面的東西:
Step5.2: 輸入: “javac” ,你應該看到下面的東西:
Step5.3:輸入:“java -version”,你應該看到下面的東西:
至此,我們的配置就全部完成了。
PART3:可以開始用安裝好的stanfordcorenlp進行詞性标注了。
這裡,我們拿一段文本來試運作:
from stanfordcorenlp import StanfordCoreNLP
nlp=StanfordCoreNLP(r'D:\stanford_nlp',)
fin=open('news.txt','r',encoding='utf8')
fner=open('ner.txt','w',encoding='utf8')
ftag=open('pos_tag.txt','w',encoding='utf8')
for line in fin:
line=line.strip()
if len(line)<1:
continue
fner.write(" ".join([each[0]+"/"+each[1] for each in nlp.ner(line) if len(each)==2 ])+"\n")
ftag.write(" ".join([each[0]+"/"+each[1] for each in nlp.pos_tag(line) if len(each)==2 ]) +"\n")
fner.close()
ftag.close()