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=10173669和https://explosion.ai/blog/dead-code-should-be-buried的问题;P
7条答案
按热度按时间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
在通用依存关系数据上进行训练可能会更好。
如果你在描述性能,可能值得在某个地方提到,使用的标注算法对于英语来说仍然是一个不错的选择,但对于俄语或阿拉伯语等语言的表现不会很好。如果神经网络具有良好的子词特征,那么对于形态丰富的语言,神经网络方法可以做得更好。
jucafojl2#
我注意到除了
nltk.ne_chunk
使用的maxent_ne_chunker
之外,nltk_data
还有两个其他的分块器:了解它们是什么以及它们是否仍然与当前基于NLTK代码相关是很有益的。如果它们仍然相关,我们应该以某种方式记录它们训练了什么以及如何训练。否则,我认为最好从
nltk_data
中删除它们。@jfrazee,如果您能帮助我们更多地了解这些分块器,那就太好了=)
hmtdttj43#
关于
ne_chunk
模型的一篇说明文章在http://mattshomepage.com/articles/2016/May/23/nltk_nec/上。这个pickle对象是一个
NEChunkParser
:但是如果有人知道如何创建
maxent_ne_chunker
,确认了哪个语料库以及模型是如何训练的(即哪些特征/参数等),那就太好了。另外,它是在ACE 2004上进行训练的吗?
bxfogqkk4#
@alvations
我非常惊讶,如果Treebank和MUC6分块器模型仍然有效的话,考虑到pickle与类定义之间的紧密耦合,而且当时它可能类似于Python 2.4或2.6。它们应该是HMM和MEMM类的pickle,或者是NEChunkParser,可能还包括一个特征提取器。提取器可能是一个lambda函数,也可能是contrib中某个长期废弃代码的类。如果这没有太大帮助的话,我很抱歉。
这些都是基于标准的PTB和MUC6训练部分的基本BIO风格标注器。
最初创建这些模型的难点在于正确地获取HMM和MEMM代码,以便模型能够正确地进行pickle操作。因此,假设当前的NLTK代码库生成的对象可以序列化,我认为只要宣布破产并在更新的数据集上重新训练,并保持更好的记录,就不会有太多(任何?)损失。
正如这种方式所展示的那样,序列化对象(在任何语言中)都是一种糟糕的模型序列化格式,但是,是的,我们都这样做了。
h6my8fg25#
@jfrazee 感谢回答!在Python2.7中无法对MUC6和Treebank分块器进行解包。
@stevenbird 我认为可以从
nltk_data
中移除它们。3okqufwl6#
从#428开始,我们还应该删除
hmm_treebank_pos_tagger
模型。yyhrrdl87#
是否有人知道英语预训练的nltk分块器的信息?NLTK版本3.2.4,当然还有Python 3。