斯坦福大学自然语言处理组是世界知名的NLP研究小组,他们提供了一系列开源的Java文本分析工具,包括分词器(Word Segmenter),词性标注工具(Part-Of-Speech Tagger),命名实体识别工具(Named Entity Recognizer),句法分析器(Parser)等,可喜的事,他们还为这些工具训练了相应的中文模型,支持中文文本处理。在使用NLTK的过程中,发现当前版本的NLTK已经提供了相应的斯坦福文本处理工具接口,包括词性标注,命名实体识别和句法分析器的接口,不过可惜的是,没有提供分词器的接口。在google无果和阅读了相应的代码后,我决定照猫画虎为NLTK写一个斯坦福中文分词器接口,这样可以方便的在Python中调用斯坦福文本处理工具。
首先需要做一些准备工作,第一步当然是安装NLTK,这个可以参考我们在gensim的相关文章中的介绍《如何计算两个文档的相似度》,不过这里建议check github上最新的NLTK源代码并用“python setup.py install”的方式安装这个版本:https://github.com/nltk/nltk。这个版本新增了对于斯坦福句法分析器的接口,一些老的版本并没有,这个之后我们也许还会用来介绍。而我们也是在这个版本中添加的斯坦福分词器接口,其他版本也许会存在一些小问题。其次是安装Java运行环境,以Ubuntu 12.04为例,安装Java运行环境仅需要两步:
sudo apt-get install default-jre
sudo apt-get install default-jdk
最后,当然是最重要的,你需要下载斯坦福分词器的相应文件,包括源代码,模型文件,词典文件等。注意斯坦福分词器并不仅仅支持中文分词,还支持阿拉伯语的分词,需要下载的zip打包文件是这个: Download Stanford Word Segmenter version 2014-08-27,下载后解压。
准备工作就绪后,我们首先考虑的是在nltk源代码里的什么地方来添加这个接口文件。在nltk源代码包下,斯坦福词性标注器和命名实体识别工具的接口文件是这个:nltk/tag/stanford.py ,而句法分析器的接口文件是这个:nltk/parse/stanford.py , 虽然在nltk/tokenize/目录下有一个stanford.py文件,但是仅仅提供了一个针对英文的tokenizer工具PTBTokenizer的接口,没有针对斯坦福分词器的接口,于是我决定在nltk/tokenize下添加一个stanford_segmenter.py文件,作为nltk斯坦福中文分词器的接口文件。NLTK中的这些接口利用了Linux 下的管道(PIPE)机制和subprocess模块,这里直接贴源代码了,感兴趣的同学可以自行阅读:
#!/usr/bin/env python # -*- coding: utf-8 -*- # Natural Language Toolkit: Interface to the Stanford Chinese Segmenter # # Copyright (C) 2001-2014 NLTK Project # Author: 52nlp <52nlpcn@gmail.com> # # URL: <http://nltk.org/> # For license information, see LICENSE.TXT from __future__ import unicode_literals, print_function import tempfile import os import json from subprocess import PIPE from nltk import compat from nltk.internals import find_jar, config_java, java, _java_options from nltk.tokenize.api import TokenizerI class StanfordSegmenter(TokenizerI): r""" Interface to the Stanford Segmenter >>> from nltk.tokenize.stanford_segmenter import StanfordSegmenter >>> segmenter = StanfordSegmenter(path_to_jar="stanford-segmenter-3.4.1.jar", path_to_sihan_corpora_dict="./data", path_to_model="./data/pku.gz", path_to_dict="./data/dict-chris6.ser.gz") >>> sentence = u"这是斯坦福中文分词器测试" >>> segmenter.segment(sentence) >>> u'\u8fd9 \u662f \u65af\u5766\u798f \u4e2d\u6587 \u5206\u8bcd\u5668 \u6d4b\u8bd5\n' >>> segmenter.segment_file("test.simp.utf8") >>> u'\u9762\u5bf9 \u65b0 \u4e16\u7eaa \uff0c \u4e16\u754c \u5404\u56fd ... """ _JAR = 'stanford-segmenter.jar' def __init__(self, path_to_jar=None, path_to_sihan_corpora_dict=None, path_to_model=None, path_to_dict=None, encoding='UTF-8', options=None, verbose=False, java_options='-mx2g'): self._stanford_jar = find_jar( self._JAR, path_to_jar, env_vars=('STANFORD_SEGMENTER',), searchpath=(), verbose=verbose ) self._sihan_corpora_dict = path_to_sihan_corpora_dict self._model = path_to_model self._dict = path_to_dict self._encoding = encoding self.java_options = java_options options = {} if options is None else options self._options_cmd = ','.join('{0}={1}'.format(key, json.dumps(val)) for key, val in options.items()) def segment_file(self, input_file_path): """ """ cmd = [ 'edu.stanford.nlp.ie.crf.CRFClassifier', '-sighanCorporaDict', self._sihan_corpora_dict, '-textFile', input_file_path, '-sighanPostProcessing', 'true', '-keepAllWhitespaces', 'false', '-loadClassifier', self._model, '-serDictionary', self._dict ] stdout = self._execute(cmd) return stdout def segment(self, tokens): return self.segment_sents([tokens]) def segment_sents(self, sentences): """ """ encoding = self._encoding # Create a temporary input file _input_fh, self._input_file_path = tempfile.mkstemp(text=True) # Write the actural sentences to the temporary input file _input_fh = os.fdopen(_input_fh, 'wb') _input = '\n'.join((' '.join(x) for x in sentences)) if isinstance(_input, compat.text_type) and encoding: _input = _input.encode(encoding) _input_fh.write(_input) _input_fh.close() cmd = [ 'edu.stanford.nlp.ie.crf.CRFClassifier', '-sighanCorporaDict', self._sihan_corpora_dict, '-textFile', self._input_file_path, '-sighanPostProcessing', 'true', '-keepAllWhitespaces', 'false', '-loadClassifier', self._model, '-serDictionary', self._dict ] stdout = self._execute(cmd) # Delete the temporary file os.unlink(self._input_file_path) return stdout def _execute(self, cmd, verbose=False): encoding = self._encoding cmd.extend(['-inputEncoding', encoding]) _options_cmd = self._options_cmd if _options_cmd: cmd.extend(['-options', self._options_cmd]) default_options = ' '.join(_java_options) # Configure java. config_java(options=self.java_options, verbose=verbose) stdout, _stderr = java(cmd,classpath=self._stanford_jar, stdout=PIPE, stderr=PIPE) stdout = stdout.decode(encoding) # Return java configurations to their default values. config_java(options=default_options, verbose=False) return stdout def setup_module(module): from nose import SkipTest try: StanfordSegmenter() except LookupError: raise SkipTest('doctests from nltk.tokenize.stanford_segmenter are skipped because the stanford segmenter jar doesn\'t exist') |
Update: 自NLTK 3.2版本起,这个接口已经被正式加进去了,所以大家可以直接下载安装官方版本,以下这段话可以忽略: https://github.com/nltk/nltk/blob/develop/nltk/tokenize/stanford_segmenter.py
我在github上fork了一个最新的NLTK版本,然后在这个版本中添加了stanford_segmenter.py,感兴趣的同学可以自行下载这个代码,放到nltk/tokenize/目录下,然后重新安装NLTK:sudo python setpy.py install. 或者直接clone我们的这个nltk版本,安装后就可以使用斯坦福中文分词器了。
现在就可以在Python NLTK中调用这个斯坦福中文分词接口了。为了方便起见,建议首先进入到解压后的斯坦福分词工具目录下:cd stanford-segmenter-2014-08-27,然后在这个目录下启用ipython,当然默认python解释器也可:
# 初始化斯坦福中文分词器
In [1]: from nltk.tokenize.stanford_segmenter import StanfordSegmenter
# 注意分词模型,词典等资源在data目录下,使用的是相对路径,
# 在stanford-segmenter-2014-08-27的目录下执行有效
# 注意,斯坦福中文分词器提供了两个中文分词模型:
# ctb.gz是基于宾州中文树库训练的模型
# pku.gz是基于北大在2005backoof上提供的人名日报语料库
# 这里选用了pku.gz,方便最后的测试
In [2]: segmenter = StanfordSegmenter(path_to_jar="stanford-segmenter-3.4.1.jar", path_to_sihan_corpora_dict="./data", path_to_model="./data/pku.gz", path_to_dict="./data/dict-chris6.ser.gz")
# 测试一个中文句子,注意u
In [3]: sentence = u"这是斯坦福中文分词器测试"
# 调用segment方法来切分中文句子,这里隐藏了一个问题,我们最后来说明
In [4]: segmenter.segment(sentence)
Out[4]: u'\u8fd9 \u662f \u65af\u5766\u798f \u4e2d\u6587 \u5206\u8bcd\u5668 \u6d4b\u8bd5\n'
# 由于分词后显示的是unicode编码,我们把这个结果输出到文件中
In [5]: outfile = open('outfile', 'w')
In [6]: result = segmenter.segment(sentence)
# 注意写入到文件的时候要encode 为 UTF-8编码
In [7]: outfile.write(result.encode('UTF-8'))
In [8]: outfile.close()
打开这个outfile文件:
这 是 斯坦福 中文 分词器 测试
这里同时提供了一个segment_file的调用方法,方便直接对文件进行切分,让我们来测试《中文分词入门之资源》中介绍的backoff2005的测试集pku_test.utf8,来看看斯坦福分词器的效果:
In [9]: result = segmenter.segment_file('pku_test.utf8')
In [10]: outfile = open('pku_outfile', 'w')
In [11]: outfile.write(result.encode('UTF-8'))
In [12]: outfile.close()
打开结果文件pku_outfile:
共同 创造 美好 的 新 世纪 ——二○○一年 新年 贺词
( 二○○○年 十二月 三十一日 ) ( 附 图片 1 张 )
女士 们 , 先生 们 , 同志 们 , 朋友 们 :
2001年 新年 钟声 即将 敲响 。 人类 社会 前进 的 航船 就要 驶入 21 世纪 的 新 航程 。 中国 人民 进入 了 向 现代化 建设 第三 步 战略 目标 迈进 的 新 征程 。
在 这个 激动人心 的 时刻 , 我 很 高兴 通过 中国 国际 广播 电台 、 中央 人民 广播 电台 和 中央 电视台 , 向 全国 各族 人民 , 向 香港 特别 行政区 同胞 、 澳门 特别 行政区 同胞 和 台湾 同胞 、 海外 侨胞 , 向 世界 各国 的 朋友 们 , 致以 新 世纪 第一 个 新年 的 祝贺 !
....
我们用backoff2005的测试脚本来测试一下斯坦福中文分词器在这份测试语料上的效果:
./icwb2-data/scripts/score ./icwb2-data/gold/pku_training_words.utf8 ./icwb2-data/gold/pku_test_gold.utf8 pku_outfile > stanford_pku_test.score
结果如下:
=== SUMMARY:
=== TOTAL INSERTIONS: 1479
=== TOTAL DELETIONS: 1974
=== TOTAL SUBSTITUTIONS: 3638
=== TOTAL NCHANGE: 7091
=== TOTAL TRUE WORD COUNT: 104372
=== TOTAL TEST WORD COUNT: 103877
=== TOTAL TRUE WORDS RECALL: 0.946
=== TOTAL TEST WORDS PRECISION: 0.951
=== F MEASURE: 0.948
=== OOV Rate: 0.058
=== OOV Recall Rate: 0.769
=== IV Recall Rate: 0.957
### pku_outfile 1479 1974 3638 7091 104372 103877 0.946 0.951 0.948 0.058 0.769 0.957
准确率是95.1%, 召回率是94.6%, F值是94.8%, 相当不错。感兴趣的同学可以测试一下其他测试集,或者用宾州中文树库的模型来测试一下结果。
最后我们再说明一下这个接口存在的问题,因为使用了Linux PIPE模式来调用斯坦福中文分词器,相当于在Python中执行相应的Java命令,导致每次在执行分词时会加载一遍分词所需的模型和词典,这个对文件操作时(segment_file)没有多大的问题,但是在对句子执行分词(segment)的时候会存在很大的问题,每次都加载数据,在实际产品中基本是不可用的。虽然发现斯坦福分词器提供了一个 --readStdin 的读入标准输入的参数,也尝试通过python subprocess中先load 文件,再用的communicate方法来读入标准输入,但是仍然没有解决问题,发现还是一次执行,一次结束。这个问题困扰了我很久,google了很多资料也没有解决问题,欢迎懂行的同学告知或者来解决这个问题,再此先谢过了。That's all!
注:原创文章,转载请注明出处“我爱自然语言处理”:www.52nlp.cn
本文链接地址:https://www.52nlp.cn/python自然语言处理实践-在nltk中使用斯坦福中文分词器
为什么没有说怎样把斯坦福分词器解压缩后的文件夹怎样集成到python中呢?每次都要进入此目录才调用吗?
[回复]
52nlp 回复:
3 10 月, 2014 at 18:44
调用的时候指定路径即可,这里用相对路径比较方便而已
[回复]
我想请教一个关于斯坦福大学LDA工具的问题,运行结果产生的两个矩阵 文档-主题和主题-单词 两个矩阵,其中主题-单词的矩阵,对于运行结果,是单词出现在主题的概率,应该是1的结果,而且某个单词在各个主题的和应该为1的吧。为什么结果不是1。文件里的summary.txt里面的数字也不明白,不是应该都是概率的吗?为什么看着就不是概率的值。
[回复]
52nlp 回复:
19 10 月, 2014 at 16:36
这个工具还没有用过,抱歉
[回复]
请问如何能够使得分词工具分词效果为字典中最长字符串呢,使匹配字典时切分的粒度最大。发现很多用户字典中的词都得不到预期的分词结果。
[回复]
52nlp 回复:
25 10 月, 2014 at 15:57
这个应该是和你用的分词系统有关吧,用户词典一般会优先考虑
[回复]
赞美这个系列的作品,跟着画瓢。
[回复]
finallyly 回复:
28 8 月, 2015 at 09:30
同样在跟着画瓢中。同赞美~~。
[回复]
52nlp 回复:
28 8 月, 2015 at 11:20
还有很多问题,欢迎多提建议
[回复]
怎么在windows环境下使用这种代码??提示NLTK was unable to find the java file!
[回复]
52nlp 回复:
5 12 月, 2014 at 17:15
应该是windows下没有找到java运行环境的问题,windows下我没有实际的工作经验,google了一下,貌似这里有一些解决方案,你自己试着解决吧:
http://stackoverflow.com/questions/7404720/nltk-fails-to-find-the-java-executable
[回复]
孙云 回复:
25 4 月, 2016 at 17:41
你好,windows下总是报这个错误,环境变量也设置了,错误: 找不到或无法加载主类 edu.stanford.nlp.ie.crf.CRFClassifier
[回复]
52nlp 回复:
28 4 月, 2016 at 20:03
各个路径都指定正确吗
有什么办法可以继续在segment以后的数据上run stanford NER ? 这个ntlk 有类似的plugin吗?
[回复]
52nlp 回复:
9 1 月, 2015 at 12:43
可以看看这篇文章 http://textminingonline.com/how-to-use-stanford-named-entity-recognizer-ner-in-python-nltk-and-other-programming-languages
不过我没有试过中文的NER,印象斯坦福有训练好的中文模型可用,调用的时候加载中文模型应该就ok了
[回复]
可以对java分词做一个封装,做成类似daemon的架构
[回复]
52nlp 回复:
26 1 月, 2015 at 12:42
thanks
[回复]
我下载安装添加了 stanford_segmenter.py 的版本,执行时却说找不到 module ,请问是不是漏掉或做错了什么
from nltk.tokenize.stanford_segmenter import StanfordSegmenter
ImportError: No module named tokenize.stanford_segmenter
[回复]
52nlp 回复:
27 1 月, 2015 at 12:03
安装是否成功了?
[回复]
mark 回复:
27 1 月, 2015 at 14:21
成功了,可是发现python 只能放在解压缩后的目录执行,例如: /home/nltk-develop, 移到其他路径执行还是会出现相同的错误
[回复]
52nlp 回复:
27 1 月, 2015 at 15:03
sudo python setup.py install? 可执行了
mark 回复:
27 1 月, 2015 at 15:36
sudo python setup.py install 可以执行,
NLTK 安装时也没有错误讯息,
/home/nltk-develop 是nltk的目录,
我的环境 python 只能在 nltk 的目录中执行,在其他位置都会出现错误讯息 :
ImportError: No module named tokenize.stanford_segmenter
至少现在执行分词能输出结果,只是指定路径比较麻烦一点
52nlp 回复:
27 1 月, 2015 at 17:35
有点奇怪,为什么安装成功了还找不到信息;你可以试着把这个目录加入到 python 的 sys.path中试试
执行segmenter的时候 提示出错
Exception in thread "main" java.lang.UnsupportedClassVersionError: edu/stanford/nlp/ie/crf/CRFClassifier : Unsupported major.minor version 52.0
请问下java版本应该用哪个版本? 多谢
[回复]
low哥 回复:
15 2 月, 2015 at 16:42
哦 需要使用java 8,更新之后就ok了
[回复]
正在学习,问问 lz 这个问题有解决方案了吗?
[回复]
学习中,先看了
[回复]
perfect
[回复]
关于nltk接口每次分词都重新加载数据问题,有人写了个非nltk的接口,是开启斯坦福分词器作为一个服务器进程,接受分词请求后返回结果。自己用时可以拿来这个模块然后subprocess运行一个os system 下开启斯坦福分词器服务器的进程的java命令,然后就可以用了。速度非常快。
[回复]
52nlp 回复:
9 6 月, 2015 at 17:44
thanks
[回复]
我的NLTK 是用anaconda安装的,路径也在anaconda的文件夹内。我将stanford_segmenter.py 拷贝到tokenize文件夹内后,再次运行sudo python setup.py install之后便发现原来的stanford_segmenter.py 文件消失了。
测试from nltk.tokenize.stanford_segmenter import StanfordSegmenter
错误提示:ImportError: No module named tokenize.stanford_segmenter
[回复]
52nlp 回复:
25 8 月, 2015 at 21:44
anaconda安装的方式不太清楚,抱歉
[回复]
博主您好,您写的这个接口能够调用斯坦福分词进行词性标注吗? 您方便给个示例吗?
您博客里面提到的sighan评测的资源链接,我点到您博客里面的资源下载,好像已经下不了了,如果方便的话能告知一下下载路径吗?多谢博主了。
[回复]
finallyly 回复:
28 8 月, 2015 at 09:39
博主你好,看着像是斯坦福的分词、词性标注、命名实体识别各是一个软件。好像并没有整合起来。想问一下,您后面博客说的mecab,也是用crf做的,这个软件包是否将分词,词性标注和命名实体识别做过整合呢
[回复]
52nlp 回复:
28 8 月, 2015 at 11:19
斯坦福的CorNLP工具包做了整合,具体可以看其官方页面 http://nlp.stanford.edu/software/corenlp.shtml ; MeCab目前我这边train的一个模型可以做到分词和词性标注一体化,命名实体识别没做,可以参考系列三和四。
[回复]
finallyly 回复:
28 8 月, 2015 at 16:11
多谢楼主
52nlp 回复:
28 8 月, 2015 at 11:16
这个不支持词性标注,斯坦福那个还有一个专门的词性工具,提供有中文的词性标注模型,可以load试一下,NLTK有专门的接口,不过我估计中文可能还是需要先分词再喂进去,不过斯坦福还有一个CoreNLP,是一个多个处理模块儿一体化的工作,我用过英文的,没试过中文,他们提供有中文处理相关的模型;下载路径我试了一下,貌似tar.gz的包没了,但是zip和rar的打包文件还可以下载。
[回复]
你好,谢谢作者的无私奉献。但是我在使用过程 报了一个这个错误:
Can't instantiate abstract class StanfordSegmenter with abstract methods tokenize.调用代码与你的一致的。请问这个什么情况呢?
[回复]
52nlp 回复:
30 1 月, 2016 at 21:16
抱歉,没遇到这个问题,不太清楚。不只是调用,请问在nltk中是否添加了这套代码?
[回复]
hzw 回复:
2 2 月, 2016 at 17:34
应该是跟 NLTK 3.1 不兼容,用 3.0 就没问题。
[回复]
楼主您好,在调用segment_file时,提示utf8字符不能解码请教如何解决
[回复]
52nlp 回复:
26 5 月, 2016 at 14:24
具体报错信息是什么?贴一下
[回复]
lzh 回复:
31 5 月, 2016 at 12:12
楼主您好,没能及时看到您的回复。之前的问题可能和我使用的win环境有关,在linux下运行相同的代码没有报错
[回复]
楼主您好!我直接clone您的nltk,在sudo python setup.py install步骤时出现以下报错:
Traceback (most recent call last):
File "setup.py", line 37, in
del sdist.finders[:]
AttributeError: module 'setuptools.command.sdist' has no attribute 'finders'
自作主张删掉这一行后,可以成功安装。
但在ipython中执行from nltk.tokenize.stanford_segmenter import StanfordSegmenter时,却出现如下报错:
AttributeError Traceback (most recent call last)
in ()
----> 1 from nltk.tokenize.stanford_segmenter import StanfordSegmenter
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/__init__.py in ()
115 ###########################################################
116
--> 117 from nltk.align import *
118 from nltk.chunk import *
119 from nltk.classify import *
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/align/__init__.py in ()
13
14 from nltk.align.api import AlignedSent, Alignment
---> 15 from nltk.align.ibm1 import IBMModel1
16 from nltk.align.ibm2 import IBMModel2
17 from nltk.align.ibm3 import IBMModel3
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/align/ibm1.py in ()
16 from collections import defaultdict
17 from nltk.align import AlignedSent
---> 18 from nltk.corpus import comtrans
19
20 class IBMModel1(object):
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/corpus/__init__.py in ()
62 import re
63
---> 64 from nltk.tokenize import RegexpTokenizer
65 from nltk.corpus.util import LazyCorpusLoader
66 from nltk.corpus.reader import *
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/tokenize/__init__.py in ()
63 from nltk.tokenize.simple import (SpaceTokenizer, TabTokenizer, LineTokenizer,
64 line_tokenize)
---> 65 from nltk.tokenize.regexp import (RegexpTokenizer, WhitespaceTokenizer,
66 BlanklineTokenizer, WordPunctTokenizer,
67 wordpunct_tokenize, regexp_tokenize,
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/tokenize/regexp.py in ()
199 return tokenizer.tokenize(text)
200
--> 201 blankline_tokenize = BlanklineTokenizer().tokenize
202 wordpunct_tokenize = WordPunctTokenizer().tokenize
203
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/tokenize/regexp.py in __init__(self)
170 """
171 def __init__(self):
--> 172 RegexpTokenizer.__init__(self, r'\s*\n\s*\n\s*', gaps=True)
173
174 class WordPunctTokenizer(RegexpTokenizer):
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/tokenize/regexp.py in __init__(self, pattern, gaps, discard_empty, flags)
117 # re.split will change.
118 try:
--> 119 self._regexp = compile_regexp_to_noncapturing(pattern, flags)
120 except re.error as e:
121 raise ValueError('Error in regular expression %r: %s' %
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/__init__.py in compile_regexp_to_noncapturing(pattern, flags)
52 return parsed_pattern
53
---> 54 return sre_compile.compile(convert_regexp_to_noncapturing_parsed(sre_parse.parse(pattern)), flags=flags)
55
56
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/__init__.py in convert_regexp_to_noncapturing_parsed(parsed_pattern)
48 res_data.append((key, value))
49 parsed_pattern.data = res_data
---> 50 parsed_pattern.pattern.groups = 1
51 parsed_pattern.pattern.groupdict = {}
52 return parsed_pattern
AttributeError: can't set attribute
在此之后,我又尝试了同时运行最新版的nltk和Stanford_Segmenter,但也是在from nltk.tokenize.stanford_segmenter import StanfordSegmenter这个命令的时候出现了如下的报错:
ImportError Traceback (most recent call last)
in ()
----> 1 from nltk.tokenize.stanford_segmenter import StanfordSegmenter
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.2.1-py3.5.egg/nltk/__init__.py in ()
112 # Import top-level functionality into top-level namespace
113
--> 114 from nltk.collocations import *
115 from nltk.decorators import decorator, memoize
116 from nltk.featstruct import *
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.2.1-py3.5.egg/nltk/collocations.py in ()
37 from nltk.probability import FreqDist
38 from nltk.util import ngrams
---> 39 from nltk.metrics import ContingencyMeasures, BigramAssocMeasures, TrigramAssocMeasures
40 from nltk.metrics.spearman import ranks_from_scores, spearman_correlation
41
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.2.1-py3.5.egg/nltk/metrics/__init__.py in ()
28 from nltk.metrics.spearman import (spearman_correlation, ranks_from_sequence,
29 ranks_from_scores)
---> 30 from nltk.metrics.aline import alignment
ImportError: cannot import name 'alignment'
请问老师有什么解决的方法吗?我至今还没有成功的试验过哪怕任何一次,望指教!
[回复]
楼主您好!我直接clone您的nltk,在sudo python setup.py install步骤时出现以下报错:
Traceback (most recent call last):
File "setup.py", line 37, in
del sdist.finders[:]
AttributeError: module 'setuptools.command.sdist' has no attribute 'finders'
自作主张删掉这一行后,可以成功安装。
但在ipython中执行from nltk.tokenize.stanford_segmenter import StanfordSegmenter时,却出现如下报错:
AttributeError Traceback (most recent call last)
in ()
----> 1 from nltk.tokenize.stanford_segmenter import StanfordSegmenter
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/__init__.py in ()
115 ###########################################################
116
--> 117 from nltk.align import *
118 from nltk.chunk import *
119 from nltk.classify import *
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/align/__init__.py in ()
13
14 from nltk.align.api import AlignedSent, Alignment
---> 15 from nltk.align.ibm1 import IBMModel1
16 from nltk.align.ibm2 import IBMModel2
17 from nltk.align.ibm3 import IBMModel3
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/align/ibm1.py in ()
16 from collections import defaultdict
17 from nltk.align import AlignedSent
---> 18 from nltk.corpus import comtrans
19
20 class IBMModel1(object):
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/corpus/__init__.py in ()
62 import re
63
---> 64 from nltk.tokenize import RegexpTokenizer
65 from nltk.corpus.util import LazyCorpusLoader
66 from nltk.corpus.reader import *
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/tokenize/__init__.py in ()
63 from nltk.tokenize.simple import (SpaceTokenizer, TabTokenizer, LineTokenizer,
64 line_tokenize)
---> 65 from nltk.tokenize.regexp import (RegexpTokenizer, WhitespaceTokenizer,
66 BlanklineTokenizer, WordPunctTokenizer,
67 wordpunct_tokenize, regexp_tokenize,
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/tokenize/regexp.py in ()
199 return tokenizer.tokenize(text)
200
--> 201 blankline_tokenize = BlanklineTokenizer().tokenize
202 wordpunct_tokenize = WordPunctTokenizer().tokenize
203
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/tokenize/regexp.py in __init__(self)
170 """
171 def __init__(self):
--> 172 RegexpTokenizer.__init__(self, r'\s*\n\s*\n\s*', gaps=True)
173
174 class WordPunctTokenizer(RegexpTokenizer):
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/tokenize/regexp.py in __init__(self, pattern, gaps, discard_empty, flags)
117 # re.split will change.
118 try:
--> 119 self._regexp = compile_regexp_to_noncapturing(pattern, flags)
120 except re.error as e:
121 raise ValueError('Error in regular expression %r: %s' %
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/__init__.py in compile_regexp_to_noncapturing(pattern, flags)
52 return parsed_pattern
53
---> 54 return sre_compile.compile(convert_regexp_to_noncapturing_parsed(sre_parse.parse(pattern)), flags=flags)
55
56
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.0.0-py3.5.egg/nltk/__init__.py in convert_regexp_to_noncapturing_parsed(parsed_pattern)
48 res_data.append((key, value))
49 parsed_pattern.data = res_data
---> 50 parsed_pattern.pattern.groups = 1
51 parsed_pattern.pattern.groupdict = {}
52 return parsed_pattern
AttributeError: can't set attribute
在此之后,我又尝试了同时运行最新版的nltk和Stanford_Segmenter,但也是在from nltk.tokenize.stanford_segmenter import StanfordSegmenter这个命令的时候出现了如下的报错:
ImportError Traceback (most recent call last)
in ()
----> 1 from nltk.tokenize.stanford_segmenter import StanfordSegmenter
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.2.1-py3.5.egg/nltk/__init__.py in ()
112 # Import top-level functionality into top-level namespace
113
--> 114 from nltk.collocations import *
115 from nltk.decorators import decorator, memoize
116 from nltk.featstruct import *
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.2.1-py3.5.egg/nltk/collocations.py in ()
37 from nltk.probability import FreqDist
38 from nltk.util import ngrams
---> 39 from nltk.metrics import ContingencyMeasures, BigramAssocMeasures, TrigramAssocMeasures
40 from nltk.metrics.spearman import ranks_from_scores, spearman_correlation
41
/Users/Shenghao/anaconda/lib/python3.5/site-packages/nltk-3.2.1-py3.5.egg/nltk/metrics/__init__.py in ()
28 from nltk.metrics.spearman import (spearman_correlation, ranks_from_sequence,
29 ranks_from_scores)
---> 30 from nltk.metrics.aline import alignment
ImportError: cannot import name 'alignment'
请问老师有什么解决的方法吗?我至今还没有成功的试验过哪怕任何一次,望指教!
[回复]
52nlp 回复:
30 5 月, 2016 at 15:28
Google了一下,貌似和你的setuptools版本比较新有关,可以看看你的setuptools的版本是否>=10.0。这个帖子里貌似有一个解决方案,回退到9.x版本,可以试试,你直接删除那一行的方式应该有问题。
https://github.com/nltk/nltk/issues/824
pip install setuptools==9.1
# this will automatically uninstall newer/older setuptools versions first
pip install -U nltk
[回复]
D:\Python34\python.exe E:/workSpaces/pycharm/nlpdemo/stanfordNLP.py
错误: 找不到或无法加载主类 edu.stanford.nlp.ie.crf.CRFClassifier
Traceback (most recent call last):
File "E:/workSpaces/pycharm/nlpdemo/stanfordNLP.py", line 36, in
print(segmenter.segment(sentence))
File "D:\Python34\lib\site-packages\nltk\tokenize\stanford_segmenter.py", line 96, in segment
return self.segment_sents([tokens])
File "D:\Python34\lib\site-packages\nltk\tokenize\stanford_segmenter.py", line 123, in segment_sents
stdout = self._execute(cmd)
File "D:\Python34\lib\site-packages\nltk\tokenize\stanford_segmenter.py", line 143, in _execute
cmd,classpath=self._stanford_jar, stdout=PIPE, stderr=PIPE)
File "D:\Python34\lib\site-packages\nltk\internals.py", line 134, in java
raise OSError('Java command failed : ' + str(cmd))
OSError: Java command failed : ['D:\\Java\\jdk1.8.0_91\\bin\\java.exe', '-mx2g', '-cp', 'D:\\stafordNLP\\stanford-segmenter-2015-12-09\\stanford-segmenter-3.6.0.jar:D:\\stafordNLP\\stanford-ner-2015-12-09\\lib\\slf4j-api.jar', 'edu.stanford.nlp.ie.crf.CRFClassifier', '-sighanCorporaDict', 'D:\\\\stafordNLP\\\\stanford-segmenter-2015-12-09\\\\data', '-textFile', 'd:\\Users\\WANG~1.ZHE\\AppData\\Local\\Temp\\tmpscum24rj', '-sighanPostProcessing', 'true', '-keepAllWhitespaces', 'false', '-loadClassifier', 'D:\\stafordNLP\\stanford-segmenter-2015-12-09\\data\\data\\pku.gz', '-serDictionary', 'D:\\stafordNLP\\stanford-segmenter-2015-12-09\\data\\dict-chris6.ser.gz', '-inputEncoding', 'UTF-8']
Process finished with exit code 1
[回复]
52nlp 回复:
25 7 月, 2016 at 17:33
windows环境下我没有试过,这个错误不太清楚,google了一下,你看看这个问题描述的方法能否解决问题:
http://stackoverflow.com/questions/30745714/stanford-entity-recognizer-caseless-in-python-nltk
[回复]
请问老师,使用 Stanford NLP 最新的3.6版本如何利用nltk
[回复]
52nlp 回复:
27 7 月, 2016 at 17:15
按上述方法使用有问题?如果版本不做大的更新的话,同样的方法应该可以继续使用。
[回复]