在我的商业领域中,这两个词的组合:“门卫建设”应始终标记为(门卫:“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标记符的好策略是什么,但在某些与特定业务域相关的特定情况下“覆盖”它?
答案 0 :(得分:0)
首先,语法上nltk标记符是正确的:"门卫建设"是名词 - 名词的化合物。但是为了回答技术问题,BigramTagger
基于先前的上下文一次标记一个词。您的自定义标记器无法标记"门卫"当它跟随"优雅"时,它会委托默认值,并且在你进入"构建"之前最终得到("doorman", "JJ")
。
如果你确定你想要走这条路(而且我猜它可能弊大于利),我建议在标记器完成工作后通过后处理应用你的修正。您提供的示例不需要完整的标记器,您只需匹配单词序列并将替换应用于标记版本。