Python自然语言处理实践: 在NLTK中使用斯坦福中文分词器

斯坦福大学自然语言处理组是世界知名的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

本文链接地址:http://www.52nlp.cn/python自然语言处理实践-在nltk中使用斯坦福中文分词器

一个有趣有AI的NLP公众号

NLPJob

Python自然语言处理实践: 在NLTK中使用斯坦福中文分词器》上有92条评论

  1. stormier

    为什么没有说怎样把斯坦福分词器解压缩后的文件夹怎样集成到python中呢?每次都要进入此目录才调用吗?

    [回复]

    52nlp 回复:

    调用的时候指定路径即可,这里用相对路径比较方便而已

    [回复]

  2. wrt

    我想请教一个关于斯坦福大学LDA工具的问题,运行结果产生的两个矩阵 文档-主题和主题-单词 两个矩阵,其中主题-单词的矩阵,对于运行结果,是单词出现在主题的概率,应该是1的结果,而且某个单词在各个主题的和应该为1的吧。为什么结果不是1。文件里的summary.txt里面的数字也不明白,不是应该都是概率的吗?为什么看着就不是概率的值。

    [回复]

    52nlp 回复:

    这个工具还没有用过,抱歉

    [回复]

  3. waterdrip

    请问如何能够使得分词工具分词效果为字典中最长字符串呢,使匹配字典时切分的粒度最大。发现很多用户字典中的词都得不到预期的分词结果。

    [回复]

    52nlp 回复:

    这个应该是和你用的分词系统有关吧,用户词典一般会优先考虑

    [回复]

  4. 张颜

    赞美这个系列的作品,跟着画瓢。

    [回复]

    finallyly 回复:

    同样在跟着画瓢中。同赞美~~。

    [回复]

    52nlp 回复:

    还有很多问题,欢迎多提建议

    [回复]

  5. cgc

    怎么在windows环境下使用这种代码??提示NLTK was unable to find the java file!

    [回复]

    52nlp 回复:

    应该是windows下没有找到java运行环境的问题,windows下我没有实际的工作经验,google了一下,貌似这里有一些解决方案,你自己试着解决吧:

    http://stackoverflow.com/questions/7404720/nltk-fails-to-find-the-java-executable

    [回复]

    孙云 回复:

    你好,windows下总是报这个错误,环境变量也设置了,错误: 找不到或无法加载主类 edu.stanford.nlp.ie.crf.CRFClassifier

    [回复]

    52nlp 回复:

    各个路径都指定正确吗

  6. mark

    我下载安装添加了 stanford_segmenter.py 的版本,执行时却说找不到 module ,请问是不是漏掉或做错了什么

    from nltk.tokenize.stanford_segmenter import StanfordSegmenter
    ImportError: No module named tokenize.stanford_segmenter

    [回复]

    52nlp 回复:

    安装是否成功了?

    [回复]

    mark 回复:

    成功了,可是发现python 只能放在解压缩后的目录执行,例如: /home/nltk-develop, 移到其他路径执行还是会出现相同的错误

    [回复]

    52nlp 回复:

    sudo python setup.py install? 可执行了

    mark 回复:

    sudo python setup.py install 可以执行,
    NLTK 安装时也没有错误讯息,
    /home/nltk-develop 是nltk的目录,

    我的环境 python 只能在 nltk 的目录中执行,在其他位置都会出现错误讯息 :
    ImportError: No module named tokenize.stanford_segmenter

    至少现在执行分词能输出结果,只是指定路径比较麻烦一点

    52nlp 回复:

    有点奇怪,为什么安装成功了还找不到信息;你可以试着把这个目录加入到 python 的 sys.path中试试

  7. low哥

    执行segmenter的时候 提示出错
    Exception in thread "main" java.lang.UnsupportedClassVersionError: edu/stanford/nlp/ie/crf/CRFClassifier : Unsupported major.minor version 52.0

    请问下java版本应该用哪个版本? 多谢

    [回复]

    low哥 回复:

    哦 需要使用java 8,更新之后就ok了

    [回复]

  8. dzy

    关于nltk接口每次分词都重新加载数据问题,有人写了个非nltk的接口,是开启斯坦福分词器作为一个服务器进程,接受分词请求后返回结果。自己用时可以拿来这个模块然后subprocess运行一个os system 下开启斯坦福分词器服务器的进程的java命令,然后就可以用了。速度非常快。

    [回复]

    52nlp 回复:

    thanks

    [回复]

  9. Siutan

    我的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 回复:

    anaconda安装的方式不太清楚,抱歉

    [回复]

  10. finallyly

    博主您好,您写的这个接口能够调用斯坦福分词进行词性标注吗? 您方便给个示例吗?
    您博客里面提到的sighan评测的资源链接,我点到您博客里面的资源下载,好像已经下不了了,如果方便的话能告知一下下载路径吗?多谢博主了。

    [回复]

    finallyly 回复:

    博主你好,看着像是斯坦福的分词、词性标注、命名实体识别各是一个软件。好像并没有整合起来。想问一下,您后面博客说的mecab,也是用crf做的,这个软件包是否将分词,词性标注和命名实体识别做过整合呢

    [回复]

    52nlp 回复:

    斯坦福的CorNLP工具包做了整合,具体可以看其官方页面 http://nlp.stanford.edu/software/corenlp.shtml ; MeCab目前我这边train的一个模型可以做到分词和词性标注一体化,命名实体识别没做,可以参考系列三和四。

    [回复]

    finallyly 回复:

    多谢楼主

    52nlp 回复:

    这个不支持词性标注,斯坦福那个还有一个专门的词性工具,提供有中文的词性标注模型,可以load试一下,NLTK有专门的接口,不过我估计中文可能还是需要先分词再喂进去,不过斯坦福还有一个CoreNLP,是一个多个处理模块儿一体化的工作,我用过英文的,没试过中文,他们提供有中文处理相关的模型;下载路径我试了一下,貌似tar.gz的包没了,但是zip和rar的打包文件还可以下载。

    [回复]

  11. 蒋sir

    你好,谢谢作者的无私奉献。但是我在使用过程 报了一个这个错误:
    Can't instantiate abstract class StanfordSegmenter with abstract methods tokenize.调用代码与你的一致的。请问这个什么情况呢?

    [回复]

    52nlp 回复:

    抱歉,没遇到这个问题,不太清楚。不只是调用,请问在nltk中是否添加了这套代码?

    [回复]

    hzw 回复:

    应该是跟 NLTK 3.1 不兼容,用 3.0 就没问题。

    [回复]

  12. lzh

    楼主您好,在调用segment_file时,提示utf8字符不能解码请教如何解决

    [回复]

    52nlp 回复:

    具体报错信息是什么?贴一下

    [回复]

    lzh 回复:

    楼主您好,没能及时看到您的回复。之前的问题可能和我使用的win环境有关,在linux下运行相同的代码没有报错

    [回复]

  13. Shenghao

    楼主您好!我直接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'

    请问老师有什么解决的方法吗?我至今还没有成功的试验过哪怕任何一次,望指教!

    [回复]

  14. Gile

    楼主您好!我直接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 回复:

    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

    [回复]

  15. zenwan

    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 回复:

    windows环境下我没有试过,这个错误不太清楚,google了一下,你看看这个问题描述的方法能否解决问题:
    http://stackoverflow.com/questions/30745714/stanford-entity-recognizer-caseless-in-python-nltk

    [回复]

  16. cn

    请问老师,使用 Stanford NLP 最新的3.6版本如何利用nltk

    [回复]

    52nlp 回复:

    按上述方法使用有问题?如果版本不做大的更新的话,同样的方法应该可以继续使用。

    [回复]

发表评论

电子邮件地址不会被公开。 必填项已用*标注