自定义词性标注与后退到nltk内部pos

时间:2017-07-04 07:09:51

标签: python-3.x nltk

在我的商业领域中,这两个词的组合:“门卫建设”应始终标记为(门卫:“JJ”)(建筑:“NN”)。 nltk内部标记将其标记为:

nltk.pos_tag(["doorman", "building"]) -> [('doorman', 'NN'), ('building', 'NN')]

我的方法是创建一个 BigramTagger 并用这句话训练它:

train_sents = [
    [('doorman', 'JJ'), ('building', 'NN')]
]

并使用nltk内部标记器为所有其他情况进行退避。

default_tagger = nltk.data.load("../nltk_data/taggers/maxent_treebank_pos_tagger/english.pickle")
bigram_tagger = nltk.BigramTagger(train_sents, backoff=default_tagger)

然而,当我尝试使用它时:

bigram_tagger.tag(nltk.word_tokenize("Elegant doorman building with gym"))`

似乎没有应用BigramTaager,我得到:

[('Elegant', 'NNP'), ('doorman', 'NN'), ('building', 'NN'), ('with', 'IN'), ('gym', 'NN')]

但这似乎有效:

bigram_tagger.tag(nltk.word_tokenize("doorman building")) -> [('doorman', 'JJ'), ('building', 'NN')]

显然我错过了我应该使用这些组件的方式, 拥有nltk内部pos标记符的好策略是什么,但在某些与特定业务域相关的特定情况下“覆盖”它?

1 个答案:

答案 0 :(得分:0)

首先,语法上nltk标记符是正确的:"门卫建设"是名词 - 名词的化合物。但是为了回答技术问题,BigramTagger基于先前的上下文一次标记一个词。您的自定义标记器无法标记"门卫"当它跟随"优雅"时,它会委托默认值,并且在你进入"构建"之前最终得到("doorman", "JJ")

如果你确定你想要走这条路(而且我猜它可能弊大于利),我建议在标记器完成工作后通过后处理应用你的修正。您提供的示例不需要完整的标记器,您只需匹配单词序列并将替换应用于标记版本。