在NLTK中使用自定义标签训练Tagger

时间:2015-11-15 06:37:55

标签: nlp nltk information-extraction supervised-learning

我的文档包含Hi here's my [KEYWORD phone number], let me know when you wanna hangout: [PHONE 7802708523]. I live in a [PROP_TYPE condo] in [CITY New York]格式的标记数据。我想基于一组这些类型的标记文档训练模型,然后使用我的模型来标记新文档。在NLTK中这可能吗?我查看了chunkingNLTK-Trainer脚本,但这些脚本包含一组有限的标记和语料库,而我的数据集包含自定义标记。

2 个答案:

答案 0 :(得分:5)

正如@AleksandarSavkov已经写过的那样,这本质上是一个命名实体识别(NER)任务 - 或者更普遍的是一个分块任务,正如你已经意识到的那样。在NLTK书的chapter 7中很好地介绍了如何做到这一点。我建议您忽略有关正则表达式标记的部分,并使用第3节Developing and evaluating chunkers中的方法。它包括您可以逐字使用来创建chunker的代码示例(ConsecutiveNPChunkTagger)。您的责任是选择能够提供良好表现的功能。

您需要将数据转换为NLTK架构所期望的IOB格式;它需要部分语音标签,因此第一步应该是通过POS标签运行您的输入; nltk.pos_tag()会做一个不错的工作(一旦你剥离像[KEYWORD ...]这样的标记,并且不需要安装额外的软件。当您的语料库采用以下格式( word - POS-tag - IOB-tag )时,您就可以训练识别器了:

Hi NNP O
here RB O
's POS O
my PRP$ O
phone NN B-KEYWORD
number NN I-KEYWORD
, , O
let VB O
me PRP O
...

答案 1 :(得分:2)

您希望解决的问题最常见,Named Entity Recognition(NER)。有许多算法可以帮助您解决问题,但最重要的概念是您需要将文本数据转换为适合序列标记符的格式。以下是BIO格式的示例:

I     O
love  O
Paris B-LOC
and   O
New   B-LOC
York  I-LOC
.     O

从那里,您可以选择训练任何类型的分类器,例如Naive Bayes,SVM,MaxEnt,CRF等。目前,这种多令牌序列分类任务最常用的算法是CRF。有一些工具可以让您使用上面显示的格式从文件中训练BIO模型(尽管最初用于分块)(例如YamChaCRF++CRFSuite,{{3 }})。如果您使用的是Python,除了NLTK之外,您还可以查看Wapitiscikit-learnpython-crfsuite