Nltk: OSError:Java 命令在使用 stanford 解析器示例时失败

创建于 2015-12-25  ·  18评论  ·  资料来源: nltk/nltk

你好,

我正在尝试运行斯坦福解析器示例。 例如

from nltk.parse.stanford import * 
dep_parser=StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
[parse.tree() for parse in dep_parser.raw_parse("The quick brown fox jumps over the lazy dog.")]

执行最后一个命令会导致错误:

OSError: Java command failed : [u'/usr/bin/java', u'-mx1000m', '-cp', ....

当我在命令行上重现相同的命令时,出现错误Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

因此,在命令行_上的classpath中添加slf4j-api.jar ,解析成功。

怎样才能将slf4j-api.jar添加到nltk类路径中,从而解析成功?

谢谢!
节日快乐

最有用的评论

'stanford_dir = st._stanford_jar.rpartition('/')[0]'命令中的'st'是什么

所有18条评论

@yuvval只是确定您使用的是斯坦福解析器版本 2015-12-09? 如果是这样,则发生此错误是因为新的 StanfordNLP 使用了比以前更多的依赖项。 这类似于#1237

您必须等待一段时间才能修复 #1237 并且 NLTK 赶上 Standford 工具。

快速修复解决方案是:

  1. 使用来自http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip的先前版本 2015-04-20 并且 NLTK API 可以工作,请参阅http://stackoverflow.com /questions/13883277/stanford-parser-and-nltk/34112695#34112695
  2. 破解斯坦福解析器类路径:
from nltk.internals import find_jars_within_path
from nltk.parse.stanford import StanfordDependencyParser
dep_parser=StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
stanford_dir = st._stanford_jar.rpartition('/')[0]
# or in windows comment the line above and uncomment the one below:
#stanford_dir = st._stanford_jar.rpartition("\\")[0]
stanford_jars = find_jars_within_path(stanford_dir)
st.stanford_jar = ':'.join(stanford_jars)
[parse.tree() for parse in dep_parser.raw_parse("The quick brown fox jumps over the lazy dog.")]

谢谢! 它适用于 2015-04-20 版本。

类路径黑客也有效吗?

我没有尝试 - 我只是删除了最新版本并下载了 2015-04-20 版本。

你好! 我试图按照你的 hack 但对我来说没有 `StanfordDependencyParser`:

print(nltk.__version__)
from nltk.tag import StanfordDependencyParser

3.1
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-7-67bb74c3494a> in <module>()
----> 1 from nltk.tag import StanfordDependencyParser

ImportError: cannot import name 'StanfordDependencyParser'

知道如何解决这个问题吗? 我真的很想使用最新的斯坦福版本。

@methodds 请原谅我的错字,它是from nltk.parse.stanford import StanfordDependencyParser 。 详细解释请参见https://gist.github.com/alvations/e1df0ba227e542955a8a

谢谢你的链接。 不幸的是,我无法让环境变量在我的 linux mint 操作系统上工作。

我的bashrc看起来像这样:

export JAVA_HOME="/usr/lib/jvm/java-8-oracle/"
export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH="/home/cs/stanford_nlp/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$CLASSPATH"

export CLASSPATH="/home/cs/stanford_nlp/stanford-ner-2015-04-20/stanford-ner.jar:$CLASSPATH"

export STANFORD_MODELS="/home/cs/stanford_nlp/stanford-ner-2015-04-20/classifiers:$STANFORD_MODELS"

export STANFORD_MODELS="/home/cs/stanford_nlp/stanford-postagger-full-2015-04-20/models:$STANFORD_MODELS"

回显变量看起来是正确的:

echo $CLASSPATH
/home/cs/stanford_nlp/stanford-ner-2015-04-20/stanford-ner.jar:/home/cs/stanford_nlp/stanford-postagger-full-2015-04-20/stanford-postagger.jar

echo $STANFORD_MODELS
/home/cs/stanford_nlp/stanford-postagger-full-2015-04-20/models:/home/cs/stanford_nlp/stanford-ner-2015-04-20/classifiers

但是(即使在重新启动后)NLTK 仍然找不到标记器:

from nltk.tag.stanford import StanfordPOSTagger
st = StanfordPOSTagger('english-bidirectional-distsim.tagger')
st.tag('What is the airspeed of an unladen swallow ?'.split())

NLTK was unable to find stanford-postagger.jar! Set the CLASSPATH
environment variable.

执行source .bashrc ,它会同时工作,同时查看http://apple.stackexchange.com/questions/12993/why-doesnt-bashrc-run-automatically以了解 bashrc 的工作原理。

谢谢你的提示,但我事先做了 .bashrc 的源代码,但它没有用。 我又试了一次,不幸的是它仍然无法正常工作。

你的 Linux 发行版和版本是什么? 你能做一个lsb_release -a吗? 或者你在用 Mac 工作?

感谢您的调查。 ` lsb_release -a返回

No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 17.3 Rosa
Release:    17.3
Codename:   rosa
  • 你在哪里执行export命令? 哪个目录?
  • 你在哪里运行你的python脚本? 哪个目录?

转到要运行 Python 脚本的位置,执行以下操作: import os; print os.environ

然后转到您的主目录,启动 python 并执行相同的操作: import os; print os.environ

您是否看到 2 组环境变量不同?

我猜你想让我使用import os; print(os.environ) ,它没有显示我在.bashrc导出的环境变量。 之后,我将内容复制粘贴到.profile (在我的主文件夹中),现在它可以完美运行。 我不知道为什么= D。

很高兴.profile有效,我认为这是操作系统发行版的问题。 我不建议将环境变量存储为静态变量,就个人而言,我每次启动 python 脚本时都会重新运行它们,这样我就可以确保没有冲突。 享受 NLTK API 和斯坦福工具带来的乐趣!

谢谢 :)

'stanford_dir = st._stanford_jar.rpartition('/')[0]'命令中的'st'是什么

我和hansen7有同样的问题

对于那些一直在寻找什么是圣的少数人来说,
st = StanfordNERTagger(os.environ.get('STANFORD_MODELS'))
参考: https: //gist.github.com/manashmndl/810db10809cbc1209b34c7d25efe95d5#file -stanfordnertagger-py

此页面是否有帮助?
0 / 5 - 0 等级