我的文档包含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脚本,但这些脚本包含一组有限的标记和语料库,而我的数据集包含自定义标记。
答案 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模型(尽管最初用于分块)(例如YamCha,CRF++,CRFSuite,{{3 }})。如果您使用的是Python,除了NLTK之外,您还可以查看Wapiti,scikit-learn和python-crfsuite。