stanfordcorenlp创建实例对象时,一直运行,不报错也不出结果

文章讲述了作者在将StanfordCoreNLP工具集成到函数中时遇到的卡顿问题,经排查发现是由于参数设置错误导致的,最终通过调整参数解决了问题,提醒读者注意初始化参数的正确性。
摘要由CSDN通过智能技术生成

前几天因为工作需要下载了Stanford Corenlp工具,然后创建相应的实例对象,对文本进行分词、注释等操作。单句测试的时候可以正常运行,很快就出结果,但是写到函数里,就是一直运行,不报错也不出结果,debug发现是卡在了创建对象那里。后来经过一番努力【疯狂搜索】,终于解决了~~~【哈哈哈哈哈哈】

问题描述

以下是我单句测试时的代码:

# Simple usage
from stanfordcorenlp import StanfordCoreNLP

nlp = StanfordCoreNLP(r'D:\stanford-corenlp-full-2016-10-31')

sentence = 'Guangdong University of Foreign Studies is located in Guangzhou.'
print('Tokenize:', nlp.word_tokenize(sentence))
print('Part of Speech:', nlp.pos_tag(sentence))
print('Named Entities:', nlp.ner(sentence))
print('Constituency Parsing:', nlp.parse(sentence))
print('Dependency Parsing:', nlp.dependency_parse(sentence))

可以成功运行得到结果:

Tokenize: ['Guangdong', 'University', 'of', 'Foreign', 'Studies', 'is', 'located', 'in', 'Guangzhou', '.']
Part of Speech: [('Guangdong', 'NNP'), ('University', 'NNP'), ('of', 'IN'), ('Foreign', 'NNP'), ('Studies', 'NNPS'), ('is', 'VBZ'), ('located', 'JJ'), ('in', 'IN'), ('Guangzhou', 'NNP'), ('.', '.')]
Named Entities: [('Guangdong', 'ORGANIZATION'), ('University', 'ORGANIZATION'), ('of', 'ORGANIZATION'), ('Foreign', 'ORGANIZATION'), ('Studies', 'ORGANIZATION'), ('is', 'O'), ('located', 'O'), ('in', 'O'), ('Guangzhou', 'LOCATION'), ('.', 'O')]
Constituency Parsing: (ROOT
  (S
    (NP
      (NP (NNP Guangdong) (NNP University))
      (PP (IN of)
        (NP (NNP Foreign) (NNPS Studies))))
    (VP (VBZ is)
      (VP (JJ located)
        (PP (IN in)
          (NP (NNP Guangzhou)))))
    (. .)))
Dependency Parsing: [('ROOT', 0, 7), ('compound', 2, 1), ('nsubjpass', 7, 2), ('case', 5, 3), ('compound', 5, 4), ('nmod', 2, 5), ('auxpass', 7, 6), ('case', 9, 8), ('nmod', 7, 9), ('punct', 7, 10)]

以及我写到函数里的代码:

class StanfordNLP:
    def __init__(self, host='http://localhost', port=9000):
        self.nlp = StanfordCoreNLP(host, port=port,
                                   timeout=30000, quiet=False, logging_level=logging.DEBUG)
        self.props = {
            'annotators': 'tokenize,ssplit,pos,lemma,ner',
            'pipelineLanguage': 'en',
            'outputFormat': 'json'
        }

运行就好长时间一直运行,不出结果也不报错,查看任务管理器,cpu利用率也极低,也就是说程序就根本没有跑起来。然后我在StanfordCoreNLP()函数的参数中加上了“quiet=False, logging_level=logging.DEBUG”,让程序输出运行、报错信息,以便找到问题进而解决。

输出的报错信息如下:

INFO:root:Using an existing server http://localhost:9000
INFO:root:Waiting until the server is available.
INFO:root:Waiting until the server is available.
INFO:root:Waiting until the server is available.
INFO:root:Waiting until the server is available.
INFO:root:Waiting until the server is available.

问题解决

以上日志信息说明:正在使用一个现有的端口号9000,一直等待,直到服务器空闲可用。一开始我以为是端口号被占用了,为此查了大量相关方面的内容,ping了本地地址http://localhost:9000,但都ping不通,然后查看系统使用的端口号,结果发现,使用的端口号中根本没有9000。这个时候,我意识到这不是端口号被占用的问题。

然后我又在网上进行了一番冲浪,发现大多数遇到跟我一样问题的都是,因为电脑内存不够,而stanfordcorenlp需要至少4g内存,java jdk是32位的要改成64位的,但是我查了我的java版本,发现就是64位的,也不是这个问题。

然后又发现有人说是下载的东西不对,要下载stanfordcorenlp的压缩包文件,还有中文模型的jar包,要下载这两个,我有确认了一下, 我这两个都下了,而且目录什么的也都配置正确。

网上能查到的问题,大概就是以上这些了,但是都没能解决我的问题。我只好再去看我的代码,比较我单句测试时的代码,和我写到函数里的代码,我发现了一个问题【重大发现!!!】:

我在单据测试中创建实例对象的代码是:

nlp = StanfordCoreNLP(r'D:\stanford-corenlp-full-2016-10-31')

但在函数里创建对象时的代码是:

self.nlp = StanfordCoreNLP(host, port=port, timeout=30000, quiet=False, logging_level=logging.DEBUG)

发现第一个参数不一样,然后我查看了StanfrdCoreNLP的源码,发现,第一个参数可以是地址path也可以是“host”,我想,既然host不行,那我改成地址,试试能不能行,代码就是:

self.nlp = StanfordCoreNLP(r'D:\stanford-corenlp-full-2016-10-31', port=port,timeout=30000, quiet=False, logging_level=logging.DEBUG)

然后运行,我就发现可以成功运行了,【真棒!!!】

然后就是对自己真无语,这么简单的问题花费了这么长时间解决,结果就是一个参数写错的问题,简直大写的无语 ╥﹏╥


最后,希望能够帮助到大家,不要犯跟我一样低级的错误~

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值