【NLP】Python3.6.5中使用 Stanford NLP工具包進行詞性標注


1. 寫在前面

NLP漢語自然語言處理原理與實踐》(鄭捷著)是一本專業研究自然語言處理的書籍,本文作者在閱讀這本書,調試其中的程序代碼時,發現由於版本升級,導致其中的某些程序無法執行。本文針對書中第24頁“安裝StanfordNLP並編寫Python接口類”部分的程序,列出在版本升級后出現的問題,以及相應的解決方案。本文也可以單獨作為學習StanfordNLP工具包的學習文檔。

 

2. 開發環境:

l Linux Ubuntu 180464位)

l Java 1.8.0

l Python 3.6.5

l Stanford coreNLP 3.9.2

l Stanford postagger 3.9.2

StanfordNLP壓縮包下載地址:https://nlp.stanford.edu/software/

 

3. StanfordNLP的接口類(調試通過):

Stanford.py

 

# -*- coding: utf-8 -*-

import sys

import os

class StanfordCoreNLP():                      # 所有StanfordNLP的父類

    def __init__(self, jarpath):

        self.root = jarpath

        self.tempsrcpath = "tempsrc"          # 輸入臨時文件路徑

        #self.jarlist = ["ejml-0.23.jar","javax.json.jar","jollyday.jar","joda-time.jar","protobuf.jar","slf4j-api.jar","slf4j-simple.jar","stanford-corenlp-3.9.2.jar","xom.jar"]   書上給的這些jar文件,都不需要,只需要下面的一個“stanfor-postagger.jar”。

        self.jarlist = ["stanford-postagger.jar"]

        self.jarpath = ""

        self.buildjars()

 

#java -mx300m -cp "/home/test/opt/stanford/stanford-postagger-full-2018-10-16/stanford-postagger.jar" edu.stanford.nlp.tagger.maxent.MaxentTagger -model "/home/test/opt/stanford/stanford-corenlp-full-2018-10-05/models/edu/stanford/nlp/models/pos-tagger/chinese-distsim/chinese-distsim.tagger" -textFile postest.txt > result.txt

 

    def buildjars(self):                       # 根據root路徑構建所有的jar包路徑

        for jar in self.jarlist:

            self.jarpath += self.root + jar + ":" 

 

    def savefile(self,path,sent):              # 創建臨時文件存儲路徑

        fp = open(path, "wb")

        fp.write(sent.encode('utf-8'))

        fp.close()

 

    def delfile(self,path):                    # 刪除臨時文件

        os.remove(path)

 

class StanfordPOSTagger(StanfordCoreNLP):      # 詞性標注子類

    def __init__(self,jarpath,modelpath):

        StanfordCoreNLP.__init__(self,jarpath)

        self.modelpath = modelpath             # 模型文件路徑

        self.classifier = "edu.stanford.nlp.tagger.maxent.MaxentTagger"

        self.delimiter = "/"                   # 標注分隔符

        self.__buildcmd()

 

    def __buildcmd(self):                      # 構建命令行

        self.cmdline = 'java -mx1g -cp "'+self.jarpath + '" ' + self.classifier + ' -model "' + self.modelpath + '"'

        #print("self.cmdline is : " + self.cmdline)

 

    def tag(self,sent):                        # 標注句子

        self.savefile(self.tempsrcpath,sent)

        tagtxt = os.popen(self.cmdline + " -textFile " + self.tempsrcpath, 'r').read()                # 結果輸出到變量中

        self.delfile(self.tempsrcpath)

        return tagtxt

 

    def tagfile(self,inputpath,outpath):       # 標注文件

        os.system(self.cmdline + ' -textFile ' + inputpath + ' > ' + outpath)

說明:

1)、StanfordNLP存放路徑:/home/test/opt/stanford/

2)、書中所給的Jar包都不需要,只需要更換成一個Jar包:stanford-postagger.jar

3)、程序的本質是執行Java命令,讀者可以先用Java命令進行測試,Java測試成功的語句放在注釋中,方便使用。從這個語句中,我們可以看得出來,詞性標注所用的文件是stanford-postagger.jar,模型文件是chinese-distsim.tagger,它們存放在不同的路徑下。Java測試的命令也需要在“/home/test/opt/stanford/stanford-postagger-full-2018-10-16/”路徑下執行。

4)、Java測試時所用的輸入文件postest.txt,其中寫入要進行詞性標注的內容,標注結果放在輸出文件result.txt中,只需要創建一個空的輸出文件即可,這兩個文件都要放在stanford-postagger.jar所在路徑中。

4)、構建jar包路徑時,不能使用冒號“:”,要用分號“;”。

5)、Python3.6.5中,不能直接使用fp.write(sent),要改成fp.write(sent.encode('utf-8'))

 

4. 測試程序(調試通過):

stanford_test.py

 

# -*- coding: utf-8 -*-

import sys

import os

from stanford import StanfordPOSTagger

 

root = '/home/test/opt/stanford/stanford-postagger-full-2018-10-16/'

modelpath = "/home/test/opt/stanford/stanford-corenlp-full-2018-10-05/models/edu/stanford/nlp/models/pos-tagger/chinese-distsim/chinese-distsim.tagger"

st = StanfordPOSTagger(root,modelpath)

seg_sent = '在 包含 問題 的 所有 解 的 解空間 樹 中 ,按照 深度優先 搜索 的 策略 ,從 根節點 出發 深度 搜索 解空間 樹 。'

taglist = st.tag(seg_sent)

print(taglist)

 

說明:

stanford.pystanford_test.py都要存放在/home/test/opt/stanford/stanford-postagger-full-2018-10-16/中。

 

5. 程序運行結果:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM