我一直在Python上玩NLTK,但由于缺少任何等于或大于0.3的MEGAM库版本的Windows 64位可执行文件,因此无法使用MEGAM Max Ent算法(需要为NLTK包括-nobias选项以作品,在第0.3节中进行了介绍)。
http://www.cs.utah.edu/~hal/megam/
作者建议编译自己的可执行文件,尽管让O'Caml在Win64上运行只是另一场噩梦。
那里有人有Windows编译的MEGAM可执行文件的版本0.4或更高版本吗?我将永远感激不已!
最佳答案
经过在Windows 7上的一些工作,我能够使Python NLTK MegaM库工作,该解决方案相当简单(事后看来)。下面将详细介绍我的方法,并包括链接。希望您觉得它们有用。
高水平:
安装OCaml编译器(特殊版本:OCamlPro)
下载MagaM的源代码
下载并安装GNU32Make实用程序
在2个地方编辑MegaM MakeFile
运行Gnu32Make生成magam.exe文件
以编程方式将megam.exe文件的位置指示为
Python NLTK
运行nltk.MaxentClassifier.train命令
链接:
MEGAM SITE:
Windows OCamlPro Download
GNU32 Make for Windows
血腥细节
鉴于缺乏文档,此过程有一些特点可以轻易解决。我想提请注意我发现的一些问题...
Windows OCamPro
获得适用于Windows的OCaml Pro版本非常重要,它是一个独立的实体,没有任何其他依赖项。我列出的版本就是这样,它将安装到您选择的单个目录中。将bin目录的路径添加到Windows的系统路径非常重要。
巨型
Windows是此库的一个挑战,因为它与开发人员一起使用了一些SNAFU,因此您不得不下载源代码并自行编译。这并不像初看起来那样困难。通常,将.Targz文件解压缩到目录中并将其解压缩2X以获得源目录是相当简单的。要实现的最重要的2个目标是(a)正确编辑Makefile和(b)将包含生成的megam.exe文件的目录的路径添加到Windows系统路径。
GNU32Win
这是一个简单的过程,只需确保在安装后将Gnu32Make exe文件的路径添加到Windows系统路径即可。
巨型MakeFile
在未存档MagaM文件的目录中,将存在一个MakeFile,其中有两行必须正确编辑才能确保正确的构建。
第一:
(将注释行中的粗体标志与未注释行中的粗体标志交换)
WITHSTR = str.cma -cclib -lstr
WITHSTR = str.cma -cclib -lcamlstr
第二:
(用系统上的等效路径替换第一行的路径)
注意:该路径必须指向系统上OcamlPro安装的“ \ lib \ caml”目录。
WITHCLIBS = -I /usr/lib/ocaml/3.09.2/caml
WITHCLIBS = -I E:\ OCamlPro \ OCPWin64 \ lib \ caml
在megam目录中运行make
在此阶段,您应该能够打开Windows CMD shell,将cd插入修改了makefile的目录中,然后运行make来编译并生成可执行文件megam.exe。
您应该看到类似于以下内容的输出:
制作ocamldep * .mli * .ml> .depend ocamlc -g -custom -o megam str.cma
-cclib -lcamlstr bigarray.cma -cclib -lbigarray unix.cma -cclib -lunix -IE:\ OCamlPro \ OCPWin64 \ lib \ caml fastdot_c.c fastdot.cmo intHashtbl.cmo arry.cmo util.cmo数据.cmo bitvec.cmo cg.cmo wsemlm.cmo
bfgs.cmo pa.cmo perceptron.cmo radapt.cmo kernelmap.cmo abffs.cmo
main.cmo
以编程方式将Megam.exe文件的位置指示给Pythons NLTK
我遇到的最后一个难题是如何准确地向Pythonn NLTK指示magam.exe文件的位置。在调用代码中,我将指示该内容的语句放在了我调用MaxentClassifier本身的行之前,并且效果很好,请参见下文。
注意:我的开发工作站花了很长时间,所以请耐心等待。
nltk.config_megam('E:\megam\megam.exe')
self.classifier = nltk.MaxentClassifier.train(train_set, algorithm='megam', trace=0)