此脚本在play.golang.org:1f中没有出现错误。
但是当我在我的机器上运行时,发生的时间比我预期的要长得多,终端机上什么也没有发生。
我想要构建的是一个PartOfSpeech标签。
我认为最长的部分是将lexicon.txt加载到地图中,然后将每个单词与那里的每个单词进行比较,看看它是否已经在词典中被标记了。词典只包含动词。但不是每个单词都需要检查,看看它是否是一个动词。
更大的问题是,我不知道如何确定一个词是否是一个动词,有一个容易启发的词,如副词、形容词等。
发布于 2014-04-26 23:24:48
在这个函数中有一个大型数组参数:
func stringInArray(a string, list [214]string) bool{
for _, b := range list{
if b == a{
return true;
}
}
return false
}
每次调用此函数时,都会复制秒字数组。
大多数情况下,您应该使用片而不是数组。将此定义更改为list []string
,并将stopWords
定义为切片而不是数组:
stopWords := []string{
"and", "or", ...
}
更好的方法可能是构建stopWords的地图:
isStopWord := map[string]bool{}
for _, sw := range stopWords {
isStopWord[sw] = true
}
然后,您可以快速检查一个单词是否是一个停顿词:
if isStopWord[word] { ... }
发布于 2014-04-29 11:14:25
(引用):
我不知道如何判断一个词是否是一个动词,带有像副词、形容词等简单的启发式。
在Go实现中,我不能谈论任何问题,但我将讨论POS标签的更大问题。听起来你在尝试构建一个基于规则的unigram标签。就这些条款作一点阐述:
最先进的POS标签是97%以上的准确性,在格式良好的新闻专线文本(较不正式的类型的准确性自然较低)。基于规则的标记器可能执行得更糟糕(您必须确定满足您的需求所需的准确性级别)。如果您想继续遵循基于规则的路径,我建议您阅读this tutorial。代码基于Haskell,但它将帮助您学习基于规则的标记中的概念和问题。
尽管如此,我强烈建议您考虑其他标记方法。我提到了字母标注的弱点。相关的方法是“bigram”,意思是我们在标记单词n、trigram(通常是前两个单词,或前一个单词、当前单词和后面的单词)时考虑前面的单词;更普遍的说,“n-gram”是指考虑n个单词的序列(通常是在我们正在标记的单词周围滑动窗口)。这种语境可以帮助我们消除“鱼”、“最后”、“苍蝇”等的歧义。
例如,在
我们钓鱼
我们可能想把鱼标记为动词,而在
吃鱼
这肯定是个名词。
在这里,The NLTK tutorial可能是一个很好的参考。一个实心的n克标签应该能让你达到90%以上的准确率;很可能超过95% (同样出现在新闻专线上)。
更复杂的方法(称为“结构化推理”)将整个标记序列作为一个整体来考虑。也就是说,它们不是试图分别预测每个单词的最可能标记,而是试图预测整个输入序列的最可能的标记序列。当然,结构化推理更难实现和训练,但相对于n-gram方法,通常会提高精度。如果你想了解这方面的情况,我建议Sutton and McCallum's excellent introduction。
https://stackoverflow.com/questions/23319311
复制相似问题