无法在nltk中使用斯坦福POS标记器

7
我正在尝试使用NLTK中的Stanford POS标注器。我正在使用此处显示的示例:http://www.nltk.org/api/nltk.tag.html#module-nltk.tag.stanford。我能够顺利加载所有内容:
>>> import os
>>> from nltk.tag import StanfordPOSTagger
>>> os.environ['STANFORD_MODELS'] = '/path/to/stanford/folder/models')

>>> st = StanfordPOSTagger('english-bidirectional-distsim.tagger',path_to_jar='/path/to/stanford/folder/stanford-postagger.jar')

但是在第一次执行时:

>>> st.tag('What is the airspeed of an unladen swallow ?'.split())

它给我以下错误:

Loading default properties from tagger /path/to/stanford/folder/models/english-bidirectional-distsim.tagger
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    at edu.stanford.nlp.io.IOUtils.<clinit>(IOUtils.java:41)
    at edu.stanford.nlp.tagger.maxent.TaggerConfig.<init>(TaggerConfig.java:146)
    at edu.stanford.nlp.tagger.maxent.TaggerConfig.<init>(TaggerConfig.java:128)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.main(MaxentTagger.java:1836)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 4 more

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/miguelwon/anaconda/lib/python2.7/site-packages/nltk/tag/stanford.py", line 66, in tag
    return sum(self.tag_sents([tokens]), []) 
  File "/Users/miguelwon/anaconda/lib/python2.7/site-packages/nltk/tag/stanford.py", line 89, in tag_sents
    stdout=PIPE, stderr=PIPE)
  File "/Users/miguelwon/anaconda/lib/python2.7/site-packages/nltk/internals.py", line 134, in java
    raise OSError('Java command failed : ' + str(cmd))
OSError: Java command failed : [u'/usr/bin/java', '-mx1000m', '-cp', '/path/to/stanford/folder/stanford-postagger-full-2015-12-09/stanford-postagger.jar', 'edu.stanford.nlp.tagger.maxent.MaxentTagger', '-model', '/Users/miguelwon/Documents/Kaggel/RTE/stanford-postagger-full-2015-12-09/models/english-bidirectional-distsim.tagger', '-textFile', '/var/folders/vb/dy__dnps7qz35slpmfkc25g40000gn/T/tmpwieb0M', '-tokenize', 'false', '-outputFormatOptions', 'keepEmptySentences', '-encoding', 'utf8']

1
请参见 https://gist.github.com/alvations/e1df0ba227e542955a8a。 - alvas
谢谢!它起作用了。处理速度相当慢。你知道怎么能让它更快吗?对于内置的nltk pos标记器,我使用了这个链接:https://dev59.com/H2gu5IYBdhLWcg3wDTCj#33692061你知道我是否可以为Stanford POS标记器做同样的事情吗? - Miguel
请参考以下链接:https://dev59.com/1mAg5IYBdhLWcg3wq8eU#23322996 和 http://www.nltk.org/api/nltk.tag.html#nltk.tag.stanford.StanfordTagger.tag_sents - alvas
请查看此帖子上的答案:http://stackoverflow.com/questions/35676079/error-in-stanford-pos-tagger/35934695#35934695 - aahsanali
2个回答

4

自从这个解决方案出现以来,有很多变化。以下是我在遇到错误后对代码的解决方案。基本上,增加JAVA堆大小就可以解决问题。

import os
java_path = "C:\\Program Files\\Java\\jdk1.8.0_102\\bin\\java.exe"
os.environ['JAVAHOME'] = java_path

from nltk.tag.stanford import StanfordPOSTagger
path_to_model = "stanford-postagger-2015-12-09/models/english-bidirectional-distsim.tagger"
path_to_jar = "stanford-postagger-2015-12-09/stanford-postagger.jar"
tagger=StanfordPOSTagger(path_to_model, path_to_jar)
tagger.java_options='-mx4096m'          ### Setting higher memory limit for long sentences
sentence = 'This is testing'
print tagger.tag(sentence.split())

问题在于tagger.tag每次运行Java .jar时都会运行,这需要一些时间将模型加载到内存中。在https://www.nltk.org/_modules/nltk/tag/stanford.html上,我可以看到有关与标记器“服务器”通信的一些信息,但不清楚如何运行stanford postagger服务器。 - Nathan B

1

最好的做法是直接下载最新版本的斯坦福POS标注器,其中依赖问题现在已经修复(2018年3月)。

wget https://nlp.stanford.edu/software/stanford-postagger-full-2017-06-09.zip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接