使用朴素贝叶斯分类器进行句子分割的nltk.org示例:.sent如何分离句子,并且ML算法如何改进它?

时间:2018-12-16 02:24:55

标签: nlp nltk naivebayes sentence nltk-trainer

nltk.org book (chapter 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和'boundaries'索引,他们选择所有标点符号,每个标点符号都具有其特征,并将其标记为True边界或False边界,从而创建< strong>标记的功能集:

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之类的原始语料库文本除以句子? -在这种情况下,选择它们的标准是什么?

2 个答案:

答案 0 :(得分:2)

问题(1):NLTK可能不清楚,但是句段分割是一个难题。就像您说的那样,我们可以从标点符号结尾的句子开始,即前一个字符为小写字母,当前字符为标点符号,下一个字符为大写字母(顺便说一句,中间有空格!不要忘记!)。但是,请考虑以下句子:

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

Wikipedia page on sentence boundary disambiguation说明了其中的一些问题。在Jurafsky和Martin编写的NLP教科书“语音和语言处理”中,他们也有chapter on Text normaliazation,并列举了一些更多的示例说明为何单词/句子分割可能具有挑战性-可能对您有所帮助这个的。我假设我们正在讨论有关英语细分的问题,但是其他语言显然存在其他问题(例如,某些语言没有大写字母)。

问题2:nlpk是如何真正分离句子的两种算法? NLTK使用一种称为PunktSentenceTokenizer

的无监督句子分割方法

问题3:是否已手动将原始语料库文本(如树库或棕色)除以句子? -是的,这些都是人工分成的句子。这些是NLP中用于开发语言工具(例如POS标记器,解析器等)的一些常用语料库。选择这些语料库的一个原因可能是它们已在NLTK中可用,而我们不必寻找另一个人工注释的语料库来做句子边界检测的监督学习。

答案 1 :(得分:2)

(否则,很好的)已被接受的答案遗漏的一件事是对NaiveBayes算法在应用您描述的规则之外所做的事情的解释。

任何这种类型的分类器都具有若干功能,并且必须确定它们作为分类线索的重要性。 下一个字母大写 =非常重要,上一个字母小写 =重要,但不那么重要,标点后的空格 =重要,等等。机器学习算法使用 some 方法为每个功能分配权重(重要性),从而使结果达到算法所能提供的效果。有些人可以一步一步完成,有些则可以按婴儿步完成,每次迭代都会比以前的结果有所改善(“爬坡”)。

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