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

Posted

技术标签:

【中文标题】在 NLTK 中使用自定义标签训练标注器【英文标题】:Training Tagger with Custom Tags in NLTK 【发布时间】:2016-02-16 11:22:56 【问题描述】:

我有一个带有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 中可能吗?我查看了chunking 和NLTK-Trainer 脚本,但它们的标签和语料库是有限的,而我的数据集有自定义标签。

【问题讨论】:

BIO 块标签似乎是正确的方向,请参阅 lingpipe-blog.com/2009/10/14/… 。取决于您如何对输入进行编码,您可能需要一个细粒度分类器在分块后标记识别 PHONEKEYWORD 您能再提供几个例子吗?都是电话号码吗?也许添加[标签:信息提取]? 没有,数据五花八门,包括电话号码、地址、姓名、日期等。对于BIO块标签,有没有一些代码示例我可以看看? 【参考方案1】:

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

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

从那里,您可以选择训练任何类型的分类器,例如朴素贝叶斯、SVM、MaxEnt、CRF 等。目前此类多令牌序列分类任务最流行的算法是CRF。有一些可用的工具可以让您使用上述格式(例如YamCha、CRF++、CRFSuite、Wapiti)从文件中训练 BIO 模型(尽管最初用于分块)。如果您使用 Python,除了 NLTK 之外,您还可以查看 scikit-learn、python-crfsuite 和 PyStruct。

【讨论】:

NLTK 工具箱使用三列格式:word POS-tag BIO-tag。向处理管道添加 POS 标记步骤不会有什么坏处。【参考方案2】:

正如@AleksandarSavkov 已经写的那样,这本质上是一个命名实体识别 (NER) 任务——或者更普遍地说是一个分块任务,正如您已经意识到的那样。 NLTK 书的chapter 7 很好地介绍了如何做到这一点。我建议您忽略有关正则表达式标记的部分并使用第 3 部分中的方法,Developing and evaluating chunkers。它包括代码示例,您可以逐字使用来创建分块器(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
...

【讨论】:

谢谢,在通过 POS 标记器运行我的输入后,我不清楚该步骤。如何插入我自己的自定义标签?也许我误解了你剥离 KEYWORD 之类的标记的意思 我才看到你的评论……这个回复几乎和你的评论一样晚了,对不起!我所说的“剥离标记”的意思是 POS 标记器与标记化的纯文本一起工作。您需要从语料库中删除块标签,使用 NLTK 标记和标记文本,然后再次插入块(您也可以使用 IOB 格式,因为这就是您最终需要的)。如果您仍然不知道该怎么做,我可以编辑我的答案来解释更多。 谢谢,有帮助。所以最终的输出将是word POS-tag Custom-tag 的列表,对吧? 你明白了。使用以 IOB 格式表示的“自定义标签”。我的回答中的示例显示了一些带有自定义标记 KEYWORD 的示例文本,已翻译成这种格式。

以上是关于在 NLTK 中使用自定义标签训练标注器的主要内容,如果未能解决你的问题,请参考以下文章

iOS个人中心渐变动画微信对话框标签选择器自定义导航栏短信验证输入框等源码

数据挖掘中分类、预测、聚类的定义和区别。

Xamarin Forms Shell 如何使用自定义渲染器自定义选项卡

NLTK RegEx Chunker 未使用通配符捕获已定义的语法模式

在 NLTK 和 Python 中创建自定义分类语料库

Google 跟踪代码管理器自定义变量返回未定义