你好,
我正在尝试运行斯坦福解析器示例。 例如
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类路径中,从而解析成功?
谢谢!
节日快乐
@yuvval只是确定您使用的是斯坦福解析器版本 2015-12-09? 如果是这样,则发生此错误是因为新的 StanfordNLP 使用了比以前更多的依赖项。 这类似于#1237
您必须等待一段时间才能修复 #1237 并且 NLTK 赶上 Standford 工具。
快速修复解决方案是:
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 脚本的位置,执行以下操作: 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
最有用的评论
'stanford_dir = st._stanford_jar.rpartition('/')[0]'命令中的'st'是什么