Nlp org使用朴素贝叶斯分类器进行句子分割的示例:如何发送单独的句子以及ML算法如何改进它?

Nlp org使用朴素贝叶斯分类器进行句子分割的示例:如何发送单独的句子以及ML算法如何改进它?,nlp,nltk,naivebayes,sentence,nltk-trainer,Nlp,Nltk,Naivebayes,Sentence,Nltk Trainer,在nltk.org中有一个例子,他们使用朴素的贝叶斯算法将标点符号分类为完成一个句子或不完成一个句子 这就是他们要做的:首先,他们获取一个语料库,并使用.sent方法获取句子,并根据它们建立一个索引,指出分隔它们的标点符号(边界)的位置 然后,他们将文本“标记化”(将其转换为单词和标点符号列表),并对每个标记应用以下算法/函数,以便获得字典中返回的功能列表: def punct_features(tokens, i): return {'nextWordCapitalized': tok

在nltk.org中有一个例子,他们使用朴素的贝叶斯算法将标点符号分类为完成一个句子或不完成一个句子

这就是他们要做的:首先,他们获取一个语料库,并使用.sent方法获取句子,并根据它们建立一个索引,指出分隔它们的标点符号(边界)的位置

然后,他们将文本“标记化”(将其转换为单词和标点符号列表),并对每个标记应用以下算法/函数,以便获得字典中返回的功能列表:

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
boundary或
False
one,从而创建一个标记特征集的列表

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)像
treebank
brown
这样的原始语料库文本是否已经被句子手动分割了在这种情况下,选择它们的标准是什么

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

“彼得先生在多伦多一家名为a.B.C.Inc.的公司工作。他的月薪为2344.21美元。22年前,他以移民身份来到多伦多。” -现在,按照我们上面的规则,这将如何分割

报告还说明了其中的一些问题。在Jurafsky和Martin编写的NLP教科书“语音和语言处理”中,他们也有一个例子,其中还有一些例子说明了为什么单词/句子切分具有挑战性——了解这一点可能会对您有所帮助。我假设我们正在讨论英语分词,但显然其他语言也存在其他问题(例如,某些语言中没有大写)

Q 2:这两种算法中有哪一种是nlpk真正分离句子的呢? NLTK使用一种称为

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

有一件事(否则就太棒了)被忽略的公认答案是对
NaiveBayes
算法所做的解释,而不仅仅是应用您描述的规则

这种类型的任何分类器都有几个特征,它必须决定它们作为分类线索的重要性。下一个字母大写=非常重要,上一个字母小写=重要,但不太重要,标点符号后的空格=重要,等等。机器学习算法使用某种方法来分配权重(=重要性)对每个特征进行优化,使结果与算法所能提供的结果一样好。一些可以一步完成,另一些可以在小步骤中完成,其中每次迭代都会在前一个结果的基础上有所改进(“爬山”)


每个机器学习算法的细节都不同,朴素贝叶斯的细节在这里并不重要。但为了完整性:它是基于假设的统计计算(通常与现实相反,但很方便)每个功能在统计上都独立于其他功能。

真棒的答案!因此,受监督的NaiveBayes将永远不会比以前的简单(非ML)功能做得更好算法/功能对吗?在这里使用朴素贝叶斯的目的是什么?有监督的可能学习,也可能不学习。我们知道的唯一方法是尝试所有三种方法:a)只使用你提到的规则(之前小写,之后大写);b) 采用有监督的方法;c) NLTK当前使用的无监督设备。教科书中使用朴素贝叶斯的目的是为了教学。别忘了NLTK的主要目的是教授NLP:)