NLTK预训练模型的使用方法和内容

idfiyjo8  于 6个月前  发布在  其他
关注(0)|答案(7)|浏览(51)

NLTK提供了几个预训练模型,但不清楚以下几点:

  • 这些模型是基于什么训练的
  • 模型是如何进行训练的

这些预训练模型包括:

  • sent_tokenize :在_____上使用nltk.tokenize.punkt.PunktSentenceTokenizer和____设置/参数训练的Punkt句子分词器
  • pos_tag :在____上使用nltk.tag.perceptron.PerceptronTagger和____设置/参数训练的@honnibal的感知机词性标注器
  • ne_tag :在____(是否为ACE?如果是,哪个ACE?)上使用nltk.classify.maxent.MaxentClassifier和____设置/参数训练的命名实体标注器?

如果有人知道以上信息,请帮助解答这个问题。如果能将这些信息记录在某个地方,我们就可以避免另一波https://news.ycombinator.com/item?id=10173669https://explosion.ai/blog/dead-code-should-be-buried的问题;P

k4emjkb1

k4emjkb11#

pos_tag : 在《华尔街日报》的第00-18节上进行了训练。从记忆中,评估数据指的是第22-24节(WSJ的标准测试集)。
数据: https://catalog.ldc.upenn.edu/ldc2013t19
算法: https://explosion.ai/blog/part-of-speech-pos-tagger-in-python
在通用依存关系数据上进行训练可能会更好。
如果你在描述性能,可能值得在某个地方提到,使用的标注算法对于英语来说仍然是一个不错的选择,但对于俄语或阿拉伯语等语言的表现不会很好。如果神经网络具有良好的子词特征,那么对于形态丰富的语言,神经网络方法可以做得更好。

jucafojl

jucafojl2#

我注意到除了nltk.ne_chunk使用的maxent_ne_chunker之外,nltk_data还有两个其他的分块器:

了解它们是什么以及它们是否仍然与当前基于NLTK代码相关是很有益的。如果它们仍然相关,我们应该以某种方式记录它们训练了什么以及如何训练。否则,我认为最好从nltk_data中删除它们。
@jfrazee,如果您能帮助我们更多地了解这些分块器,那就太好了=)

hmtdttj4

hmtdttj43#

关于ne_chunk模型的一篇说明文章在http://mattshomepage.com/articles/2016/May/23/nltk_nec/上。
这个pickle对象是一个NEChunkParser:

>>> nltk.data.load('chunkers/maxent_ne_chunker/english_ace_binary.pickle')
<nltk.chunk.named_entity.NEChunkParser object at 0x7f92fe245290>

但是如果有人知道如何创建maxent_ne_chunker,确认了哪个语料库以及模型是如何训练的(即哪些特征/参数等),那就太好了。
另外,它是在ACE 2004上进行训练的吗?

bxfogqkk

bxfogqkk4#

@alvations
我非常惊讶,如果Treebank和MUC6分块器模型仍然有效的话,考虑到pickle与类定义之间的紧密耦合,而且当时它可能类似于Python 2.4或2.6。它们应该是HMM和MEMM类的pickle,或者是NEChunkParser,可能还包括一个特征提取器。提取器可能是一个lambda函数,也可能是contrib中某个长期废弃代码的类。如果这没有太大帮助的话,我很抱歉。
这些都是基于标准的PTB和MUC6训练部分的基本BIO风格标注器。
最初创建这些模型的难点在于正确地获取HMM和MEMM代码,以便模型能够正确地进行pickle操作。因此,假设当前的NLTK代码库生成的对象可以序列化,我认为只要宣布破产并在更新的数据集上重新训练,并保持更好的记录,就不会有太多(任何?)损失。
正如这种方式所展示的那样,序列化对象(在任何语言中)都是一种糟糕的模型序列化格式,但是,是的,我们都这样做了。

h6my8fg2

h6my8fg25#

@jfrazee 感谢回答!在Python2.7中无法对MUC6和Treebank分块器进行解包。

Python 2.7.13 (default, Dec 18 2016, 07:03:39) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> pickle.load('muc6.chunk.tagger.pickle')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1384, in load
    return Unpickler(file).load()
  File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 847, in __init__
    self.readline = file.readline
AttributeError: 'str' object has no attribute 'readline'

@stevenbird 我认为可以从nltk_data中移除它们。

3okqufwl

3okqufwl6#

#428开始,我们还应该删除hmm_treebank_pos_tagger模型。

yyhrrdl8

yyhrrdl87#

是否有人知道英语预训练的nltk分块器的信息?NLTK版本3.2.4,当然还有Python 3。

相关问题