GoLang PoS Tagger脚本占用的时间超过了它应该在终端没有输出

gra*_*nja 0 nlp go part-of-speech

这个脚本在play.golang.org中没有错误地编译:http://play.golang.org/p/Hlr-IAc_1f

但是当我在我的机器上运行时,比我预期的要长得多,终端中没有任何事情发生.

我想要构建的是PartOfSpeech Tagger.

我认为最长的部分是将lexicon.txt加载到地图中,然后将每个单词与每个单词进行比较,以查看它是否已经在词典中被标记.词典只包含动词.但不是每个词都需要检查,看它是否是一个动词.

更大的问题是我不知道如何判断一个单词是否是一个动词,其中包含副词,形容词等简单的启发式动词.

Aar*_*onD 7

(引用):

我不知道如何判断一个单词是否是一个带有副词,形容词等简单启发式的动词.

我不能说你的Go实现中的任何问题,但我将解决一般的更大的POS标记问题.听起来你正在尝试构建一个基于规则的unigram标记器.详细说明这些条款:

  • "unigram"意味着你要分别考虑句子中的每个单词.请注意,unigram标记器本质上是有限的,因为它不能消除可以采用多个POS标记的单词的歧义.例如,你应该将'fish'标记为名词还是动词?'last'是动词还是副词?
  • "基于规则"意味着它的确切含义:一组规则来确定每个单词的标签.基于规则的标记以不同的方式受到限制 - 它需要大量的开发工作来组装一个规则集,该规则集将处理公共语言中合理的歧义部分.如果您使用的语言不是我们没有良好的培训资源,那么这项工作可能是合适的,但在大多数常见语言中,我们现在有足够的标记文本来培训高精度标记模型.

对于格式正确的新闻专线文本,POS标签的最新技术准确度超过97%(不太正式的类型的准确性自然更低).基于规则的标记器可能会执行得更糟(您必须确定满足您的要求所需的准确性级别).如果您想继续沿着基于规则的路径,我建议您阅读本教程.该代码基于Haskell,但它将帮助您了解基于规则的标记中的概念和问题.

也就是说,我强烈建议您查看其他标记方法.我提到了unigram标记的弱点.相关的方法是'bigram',这意味着我们在标记单词n,'trigram'(通常是前2个单词,或前一个单词,当前单词和后面的单词)时考虑前一个单词; 更一般地说,'n-gram'指的是考虑n个单词的序列(通常是我们当前正在标记的单词周围的滑动窗口).这种背景可以帮助我们消除"鱼","最后","苍蝇"等歧义.

例如,在

我们钓鱼

我们可能想把鱼标记为动词,而在

吃鱼

它肯定是名词.

NLTK教程可能是一个很好的参考.一个坚实的n-gram标记符可以使你达到90%以上的准确率; 可能高于95%(再次在新闻专线文本上).

更复杂的方法(称为"结构化推理")将整个标记序列视为一个整体.也就是说,它们不是试图分别预测每个单词的最可能标记,而是尝试预测整个输入序列的最可能的标记序列.结构化推理当然更难以实现和训练,但通常会提高准确度与n-gram方法.如果你想阅读这个领域,我建议Sutton和McCallum的精彩介绍.