NLTK-008:分类文本(有监督分类的更多例子)
句子分割:
句子分割可以看作是一个标点符号的分类任务:每当我们遇到一个可能会结束的句子的符号,我们必须决定他是否终止了当前句子。
#首先获得一些已被分割成句子的数据 #将他转换成一种适合提取特征的形式
import nltk
sents = nltk.corpus.treebank_raw.sents()
tokens = []
boundaries = set()
offset = 0
for sent in nltk.corpus.treebank_raw.sents():
tokens.extend(sent)
offset+=len(sent)
boundaries.add(offset-1)
print(boundaries)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
在这里 tokens是单独句子标识符的合并链表,boundaries 是一个包含所有句子边界标识符索引的集合。
接着我们要指定用于决定标点是否表示句子边界的数据特征:
def punct_features(tokens, i):
return {'next-word-capitalized': tokens[i+1][0].isupper(),
'prevword': tokens[i-1].lower(),'punct': tokens[i],
'prev-word-is-one-char': len(tokens[i-1]) == 1}
- 1
- 2
- 3
- 4
基于这个特征提取器,我们可以通过选择所有的标点符号创建一个加标签的特征集的链表,然后标注他们是否是边界标识符:
featuresets = [(punct_features(tokens, i), (i in boundaries))
for i in range(1, len(tokens)-1)if tokens[i] in '.?!']
- 1
- 2
再训练一个标点符号分类器:
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
- 2
- 3
- 4
使用该分类器进行断句:
def segment_sentences(words):
start = 0
sents = []
for i, word in enumerate(words):
if word in '.?!' and classifier.classify(punct_features(words, i)) == True:
sents.append(words[start:i+1])
start = i+1
if start < len(words):
sents.append(words[start:])
return sents
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
识别对话行为类型
在处理对话时,把话语看作说话者所做的一种行为是很有用的。这个解释是最简单的表述行为的(表述行为的)语句如“我原谅你”或“我打赌你不能爬那座山。”但是问候语、问题、答案、断言和说明都可以被认为是基于言语的行为类型。识别对话言语下的对话行为是理解对话的重要的第一步。
NPS语料库中,有超过10000个来自即时消息会话的帖子。这些帖子都已经被贴上15种对话行为类型中的一种标签。
posts = nltk.corpus.nps_chat.xml_posts()[:10000]
- 1
定义一个简单的特征提取器,检查帖子包含了什么词:
def dialogue_act_features(post):
features = {}
for word in nltk.word_tokenize(post):
features['contains(%s)' % word.lower()] = True
return features
- 1
- 2
- 3
- 4
- 5
然后为每个帖子提取特征,构造训练和测试数据。并创建一个新的分类器。
featuresets = [(dialogue_act_features(post.text), post.get('class'))
for post in posts]
size = int(len(featuresets) * 0.1)
train_set, test_set = featuresets[size:], featuresets[:size]
classifier = nltk.NaiveBayesClassifier.train(train_set)
print(nltk.classify.accuracy(classifier, test_set))
- 1
- 2
- 3
- 4
- 5
- 6
识别文字蕴含(RTE)
识别文字蕴含的意思是判断文本T的一个给定片段是否蕴含着另一个叫做 假设 的文本。
在我们的RTE特征检测器中,我们让单词(即词类型)作为代理的信息,和我们的特性计算重叠程度的词,并假设有单词的程度而不是文本。并不是所有的单词都是同样重要的–命名实体,如人的名字,组织和地方可能会是更重要的,这促使我们为word和nes(命名实体)提取不同的信息,此外,一些高频虚词作为“停止词”被过滤掉。
构造特征提取器:
def rte_features(rtepair):
extractor = nltk.RTEFeatureExtractor(rtepair)
features = {}
features['word_overlap'] = len(extractor.overlap('word'))
features['word_hyp_extra'] = len(extractor.hyp_extra('word'))
features['ne_overlap'] = len(extractor.overlap('ne'))
features['ne_hyp_extra'] = len(extractor.hyp_extra('ne'))
return features
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
为了表明特征的内容,可以检验下前面显示的文本/假设 的一些属性
rtepair = nltk.corpus.rte.pairs(['rte3_dev.xml'])[33]
extractor = nltk.RTEFeatureExtractor(rtepair)
print(extractor.text_words)
print extractor.overlap('word')
print extractor.overlap('ne')
print extractor.hyp_extra('word')
- 1
- 2
- 3
- 4
- 5
- 6
文章来源: blog.csdn.net,作者:考古学家lx,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_43582101/article/details/90342810
- 点赞
- 收藏
- 关注作者
评论(0)