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

Ham*_*uel 6 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脚本,但这些脚本有一组有限的标签和语料库,而我的数据集有自定义标签.

ale*_*xis 5

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

您需要将数据转换为NLTK架构所期望的IOB格式; 它需要部分语音标签,因此第一步应该是通过POS标签运行您的输入; nltk.pos_tag()将做一个足够好的工作(一旦你剥离标记[KEYWORD ...]),并不需要安装额外的软件.当您的语料库采用以下格式(单词 - 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
...
Run Code Online (Sandbox Code Playgroud)


Ale*_*kov 2

您要解决的问题最常见的是命名实体识别(NER)。有许多算法可以帮助您解决问题,但最重要的概念是您需要将文本数据转换为适合序列标记器的格式。以下是 BIO 格式的示例:

I     O
love  O
Paris B-LOC
and   O
New   B-LOC
York  I-LOC
.     O
Run Code Online (Sandbox Code Playgroud)

从那里,您可以选择训练任何类型的分类器,例如 Naive Bayes、SVM、MaxEnt、CRF 等。目前此类多标记序列分类任务最流行的算法是CRF有一些可用的工具可以让您使用上面显示的格式(例如YamChaCRF++CRFSuiteWapiti)从文件中训练 BIO 模型(尽管最初是为了分块)。如果您使用 Python,除了 NLTK 之外,您还可以查看scikit-learnpython-crfsuitePyStruct 。