nltk.org使用Naive Bayes分类器进行句子分割的示例:如何发送单独的句子以及ML算法如何改进它



nltk.org书(第6章)中有一个例子,他们使用NaiveBayesian算法将标点符号分类为完成一个句子或未完成一个。。。

他们就是这样做的:首先,他们获取一个语料库,使用.sent方法来获取句子,并根据它们建立一个索引,说明分隔它们的标点符号(boundaries)在哪里。

然后,他们将文本"标记化"(将其转换为单词和标点符号列表),并将以下算法/函数应用于每个标记,以便获得特征列表,这些特征将在字典中返回:

def punct_features(tokens, i):
return {'nextWordCapitalized': tokens[i+1][0].isupper(),
'prevWord': tokens[i-1].lower(),
'punct': tokens[i],
'prevWordis1Char': len(tokens[i-1]) == 1}

ML算法将使用这些特征来将标点符号分类为是否结束一个句子(即作为边界标记)。

使用此fn和"边界"索引,他们选择所有标点符号,每个标点符号都有其特征,并将其标记为True边界或False边界,从而创建一个标记特征集列表

featuresets1 = [(punct_features(tokens, i), (i in boundaries)) for i in range(1, len(tokens)-1)
if tokens[i] in '.?!;']
print(featuresets1[:4])

这是我们在打印前四套时可能产生的输出的一个例子:

[({'nextWordCapitalized': False, 'prevWord': 'nov', 'punct': '.', 'prevWordis1Char': False}, False), 
({'nextWordCapitalized': True, 'prevWord': '29', 'punct': '.', 'prevWordis1Char': False}, True), 
({'nextWordCapitalized': True, 'prevWord': 'mr', 'punct': '.', 'prevWordis1Char': False}, False), 
({'nextWordCapitalized': True, 'prevWord': 'n', 'punct': '.', 'prevWordis1Char': True}, False)]

有了这个,他们训练并评估标点符号分类器:

size = int(len(featuresets) * 0.1)
train_set, test_set = featuresets[size:], featuresets[:size]
classifier = nltk.NaiveBayesClassifier.train(train_set)
nltk.classify.accuracy(classifier, test_set)

现在,(1)这样的ML算法将如何改进以及改进什么?我无法理解第一个简单的算法是如何更好的,它只检查标点符号中的下一个标记是否为大写,上一个是否为小写。事实上,该算法是用来验证符号是边界的。。。!如果它不能改善它,还有什么可能有用的呢?

与此相关的是:(2)这两种算法中的任何一种是nlpk真正如何分离句子的?我的意思是,特别是如果最好的是第一个简单的,nltk是否理解句子只是两个标点符号之间的文本,后面跟着一个单词,第一个图表是大写的,前一个单词是小写的?这就是.sent方法的作用吗?请注意,这与语言学或牛津词典对句子的定义相去甚远:

"一组本身完整的单词,通常包含主语和谓语,表达陈述、疑问、感叹号,或命令,由一个主句和有时一个或多个主句组成附属条款。">

或者(3)像treebankbrown这样的原始语料库文本是否已经手动用句子划分?-在这种情况下,选择它们的标准是什么?

问题(1):NLTK可能没有说清楚,但句子分割是一个难题。正如你所说,我们可以从标点符号结束句子的假设开始,即上一个字符是小写,当前字符是标点符号,下一个字符为大写(顺便说一句,中间有空格!别忘了!)。然而,考虑一下这句话:

"彼得先生在多伦多一家名为a.B.C.股份有限公司的公司工作。他的月薪为2344.21美元。22年前,他以移民身份来到多伦多。"-现在,根据我们上面的规则,这将如何划分?

维基百科关于句子边界消歧的页面说明了更多的这些问题。在Jurafsky和Martin的NLP教科书《语音和语言处理》中,他们还有一章是关于文本规范化的,还有一些例子说明了为什么单词/句子分割可能具有挑战性——了解这一点可能会很有用。我假设我们正在讨论英语分段,但很明显,其他语言也存在其他问题(例如,某些语言中没有大写)。

Q2:这两种算法中的任何一种是nlpk真正分离句子的方法吗NLTK使用一种无监督的句子分割方法,称为PunktPenneeToken

Q3:像treebank或brown这样的原始语料库文本是否已经手动用句子划分了-是的,这些都是手动划分成句子的。这些是NLP中用于开发语言工具(如POS标记器、解析器等)的一些常见语料库。选择这些语料库的一个原因可能是它们在NLTK中已经可用,并且我们不必寻找另一个人工注释语料库来进行句子边界检测的监督学习。

(在其他方面很好的)公认答案遗漏了一件事,那就是解释NaiveBayes算法除了应用您描述的规则之外还有什么作用。

任何这种类型的分类器都有几个特征,它必须决定它们作为分类线索的重要性下一个大写字母=非常重要,上一个小写字母=重要但不那么重要,这个标点符号后面的空格=important等。机器学习算法使用一些方法为每个特征分配权重(=importance),以便结果与算法所能提供的一样好。有些人可以在一步中完成,另一些人可以在小步中完成,每次迭代都会比之前的结果有所改进("爬山")。

每个机器学习算法的细节都不同,Naive Bayes的细节在这里并不重要。但为了完整性:这是一种基于假设(通常与现实相反,但很方便)的统计计算,即每个特征在统计上独立于所有其他特征。

相关内容

最新更新