【问题标题】:How to correctly set Hunpos tagger in NLTK for POS tagging in english?如何在 NLTK 中正确设置 Hunpos 标记器以进行英文 POS 标记?
【发布时间】:2014-01-03 07:30:02
【问题描述】:

我正在尝试使用Hunpos tagger 进行 NLTK 的 POS 标记,而不是传统的 pos_tag(),但我在加载二进制文件 english.modelen_wsj.model 时遇到了一些问题。

其实我是在linux mint里面我把它们放在/usr/local/bin里面,把HUNPOS这个环境变量设置成这个路径,甚至尝试把这个路径传给@987654328中使用的参数path_to_bin @ 的 nltk/tag/hunpos.py 文件,但是当它识别到文件时,它会抛出这个错误:

>>> ht = HunposTagger('en_wsj.model','/usr/local/bin/en_wsj.model')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/nltk-2.0.4-py2.7.egg/nltk/tag/hunpos.py", line 89, in __init__
    shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE)
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 8] Exec format error

有人知道发生了什么吗?

【问题讨论】:

    标签: nltk pos-tagger


    【解决方案1】:

    我想我找到了一种方法。对于那些遇到同样问题的人,我建议您下载源代码,构建它并以不同于 NLTK 文档中描述的方式调用它。因为这对我来说不是微不足道的,所以我一步一步地把它放在这里:

    Unix 下:

    1)如果没有,请下载SubversionSVN并查看项目源代码:

    svn checkout http://hunpos.googlecode.com/svn/trunk/ hunpos-read-only
    

    这将创建一个trunk 您签出的目录。

    2) 然后,为了能够成功构建它,您可能需要ocamlbuild 来自动编译Objective Caml。 sudo apt-get install ocaml-nox 应该处理这个问题。

    3) cdtrunk 目录(你下载 Hunpos 源代码的地方)并执行

    ./build.sh build
    

    4) 此时,您的trunk 目录中应该有一个二进制文件tagger.native。将整个 trunk 目录放在您的 /usr/local/bin 中(您可能需要以超级用户身份执行此操作)。

    5) 下载en_wsj.model.gz 文件here,解压缩并将en_wsj.model 二进制文件也放入usr/local/bin

    6) 最后,在你的 python 脚本中,你可以创建一个 HunposTagger 类的实例,传递你之前创建的两个文件的路径,非常接近:

    >>> from nltk.tag.hunpos import HunposTagger
    >>> ht = HunposTagger(path_to_model='/usr/local/bin/en_wsj.model', \
                          path_to_bin=  '/usr/local/bin/trunk/tagger.native')
    >>> ht.tag('I want to go to San Francisco next year'.split())
    [('I', 'PRP'), ('want', 'VBP'), ('to', 'TO'), ('go', 'VB'), ('to', 'TO'),
     ('San', 'NNP'), ('Francisco', 'NNP'), ('next', 'JJ'), ('year', 'NN')]
    >>> ht.close()
    

    (不要忘记关闭...如果您不喜欢关闭,也可以使用with 语句)

    7) 如果还是有问题,尝试将环境变量HUNPOS 设置为/usr/local/bin/trunk。为此,您可以将以下行添加到您的 ~/.bashrc(或 MacOS 中的 ~/.bash_profile):

    export HUNPOS=/usr/local/bin/trunk
    

    然后重启你的终端。

    这对我有用,但如果有人有更好、更短或更简单的方法来设置它,我很想听听 :)

    【讨论】:

      【解决方案2】:

      如果您在 linux 上工作,您可以立即使用 hunpos 的预编译版本,而无需从源代码编译。

      $ wget https://hunpos.googlecode.com/files/hunpos-1.0-linux.tgz
      $ wget https://hunpos.googlecode.com/files/en_wsj.model.gz
      $ tar xvfz hunpos-1.0-linux.tgz
      $ gunzip en_wsj.model.gz
      $ mv en_wsj.model hunpos-1.0-linux
      $ python
      >>> from nltk.tag import HunposTagger
      >>> hpt = HunposTagger('hunpos-1.0-linux/en_wsj.model','hunpos-1.0-linux/hunpos-tag')
      >>> hpt.tag('this is a foo bar sentence'.split())
      [('this', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('foo', 'JJ'), ('bar', 'NN'), ('sentence', 'NN')]
      

      【讨论】:

      • 一般我也更喜欢预编译的版本,但是当我在 6 个月前尝试它时,要么它不起作用,要么我需要对代码进行一些小改动,我不记得是哪个其中。这就是我尝试编译标记器的原因。
      猜你喜欢
      • 2011-07-02
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多