【问题标题】:Nltk stanford pos tagger error : Java command failedNltk stanford pos tagger 错误:Java 命令失败
【发布时间】:2015-01-26 02:07:08
【问题描述】:

我正在尝试使用 nltk.tag.stanford module 标记一个句子(首先像 wiki 的示例),但我不断收到以下错误:

Traceback (most recent call last):
  File "test.py", line 28, in <module>
    print st.tag(word_tokenize('What is the airspeed of an unladen swallow ?'))
  File "/usr/local/lib/python2.7/dist-packages/nltk/tag/stanford.py", line 59, in tag
    return self.tag_sents([tokens])[0]
  File "/usr/local/lib/python2.7/dist-packages/nltk/tag/stanford.py", line 81, in tag_sents
    stdout=PIPE, stderr=PIPE)
  File "/usr/local/lib/python2.7/dist-packages/nltk/internals.py", line 160, in java
    raise OSError('Java command failed!')
OSError: Java command failed!

或关注LookupError 错误:

LookupError: 

===========================================================================
NLTK was unable to find the java file!
Use software specific configuration paramaters or set the JAVAHOME environment variable.
===========================================================================

这是示例代码:

>>> from nltk.tag.stanford import POSTagger
>>> st = POSTagger('/usr/share/stanford-postagger/models/english-bidirectional-distsim.tagger',
...                '/usr/share/stanford-postagger/stanford-postagger.jar') 
>>> st.tag('What is the airspeed of an unladen swallow ?'.split()) 

我也使用了word_tokenize 而不是split,但没有任何区别。

我也重新安装了java或者jdk!我的所有搜索都不成功!类似nltknltk.internals.config_java() 或...!

注意:我使用的是 linux (Xubuntu)!

【问题讨论】:

    标签: python nlp nltk stanford-nlp python-textprocessing


    【解决方案1】:

    如果您通读 nltk/internals.py(第 58 - 175 行)中的嵌入式文档,您应该会很容易找到答案。 NLTK 需要 Java 二进制文件的完整路径。

    如果未指定,则 nltk 将在系统中搜索 Java 二进制文件; 如果找不到,则会引发 LookupError 异常。

    根据一些研究,我认为您有几个选择:

    1) 将以下代码添加到您的项目中(不是很好的解决方案)

    import os
    java_path = "path/to/java" # replace this
    os.environ['JAVAHOME'] = java_path
    

    2) 卸载并重新安装 NLTK(最好在 virtualenv 中)(更好但仍然不是很好)

    pip uninstall nltk
    sudo -E pip install nltk
    

    3)设置java环境变量(这是IMO最务实的解决方案)

    编辑系统路径文件/etc/profile

    sudo gedit /etc/profile
    

    在末尾添加以下行

    JAVA_HOME=/usr/lib/jvm/jdk1.7.0
    PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
    export JAVA_HOME
    export JRE_HOME
    export PATH
    

    【讨论】:

    • usr/lib/jvm/ 中我有3 个目录default-javajava-1.7.0-openjdak-amd64java-7-openjdk-amd64 我可以使用其中哪一个作为路径?我使用了所有这些,但我再次收到错误并尝试所有方式,除了uninstallinstall nltk!你说我怎么卸载再安装?
    • @Kasra java-1.7.0-openjdak-amd64 我相信
    • 再次在新的.py 文件中重写代码并执行它,然后我收到此错误print(stderr.decode(sys.stdout.encoding)) TypeError: decode() argument 1 must be string, not None 你熟悉吗?它为nltk/internals.py 文件!
    • 嗯,我现在正在尝试复制该问题。同时尝试 java-7-openjdk-amd64 看看是否可行
    • 第三个解决方案中的 $HOMEJRE_HOME 变量是什么?它们以前没有定义,只是突然出现
    【解决方案2】:

    我在第一次使用 NLTK 时也遇到了这个问题。 在这个问题上花了几个小时后,我终于设法让它工作了。

    这就是我所做的:

    1. 卸载并重新安装 nltk 包
    2. 添加JAVAHOMEJAVA_HOME 环境变量变量(在我的例子中,C:\Program Files\Java\jdk1.8.0_241\bin\
    3. 将值 (C:\Program Files\Java\jdk1.8.0_241\bin\) 也添加到 Path 环境变量中。

    当然,重启你的终端。

    这在 Windows 7 64 位上对我有用。

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      相关资源
      最近更新 更多