我正在尝试使用Hunpos tagger对NLTK进行POS标记而不是传统的pos_tag()
,但我在加载二进制文件english.model
或{{1}时遇到了一些问题}}
事实上,我在linux中,我将它们放在en_wsj.model
中,将/usr/local/bin
环境变量设置为此路径,甚至尝试将此路径传递给参数{{1}在HUNPOS
path_to_bin
文件中使用,但当它识别文件时,会抛出此错误:
__init__
有没有人知道发生了什么?
答案 0 :(得分:1)
我想我找到了办法。对于那些遇到相同问题的人,我建议您下载源代码,构建它并以与NLTK文档中描述的方式不同的方式调用它。因为这对我来说并非无足轻重,所以我一步一步地把它放在这里:
在Unix下:
1)如果您没有SVN,请下载Subversion SVN并查看项目源代码:
svn checkout http://hunpos.googlecode.com/svn/trunk/ hunpos-read-only
这将创建一个您签出的trunk
目录。
2)然后,为了能够成功构建它,您可能需要ocamlbuild
来自动编译Objective Caml。 sudo apt-get install ocaml-nox
应该处理这个问题。
3)cd
到trunk
目录(您下载了Hunpos源代码)并执行
./build.sh build
4)此时,您的tagger.native
目录中应该有一个二进制文件trunk
。将整个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
并重新启动终端。
这对我有用,但是如果某人有更好,更短或更简单的方法来设置它,请我很乐意听到:)
答案 1 :(得分:1)
有一些预编译的hunpos版本,如果您正在使用linux,可以立即使用而无需从源代码编译。
$ 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')]