zoukankan      html  css  js  c++  java
  • 【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. 程序运行结果:

     

     

     

  • 相关阅读:
    ModuleNotFoundError: No module named '_ctypes' make: *** [install] 错误 1
    Python安装常见问题:ModuleNotFoundError: No module named '_ctypes' 解决办法
    No module named 'requests'
    python 安装bs4
    python 判断字符串中是否包含数字
    python lambda与zip 组合使用
    Python 从两个List构造Dict
    针对led显示图案的设计工具,画出图案后,可以导出点阵的16进制数组
    支付宝接口:系统有点忙,一会再试试
    urllib.error.URLError: urlopen error SSL: CERTIFICATE_VERIFY_FAILED certificate verify failed
  • 原文地址:https://www.cnblogs.com/Jane460334861/p/10015203.html
Copyright © 2011-2022 走看看