句子分割:
句子分割可以看作是一个标点符号的分类任务:每当我们遇到一个可能会结束的句子的符号,我们必须决定他是否终止了当前句子。
代码语言:javascript复制#首先获得一些已被分割成句子的数据 #将他转换成一种适合提取特征的形式
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)
在这里 tokens是单独句子标识符的合并链表,boundaries 是一个包含所有句子边界标识符索引的集合。 接着我们要指定用于决定标点是否表示句子边界的数据特征:
代码语言:javascript复制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}
基于这个特征提取器,我们可以通过选择所有的标点符号创建一个加标签的特征集的链表,然后标注他们是否是边界标识符:
代码语言:javascript复制featuresets = [(punct_features(tokens, i), (i in boundaries))
for i in range(1, len(tokens)-1)if tokens[i] in '.?!']
再训练一个标点符号分类器:
代码语言:javascript复制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)
使用该分类器进行断句:
代码语言:javascript复制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
识别对话行为类型
在处理对话时,把话语看作说话者所做的一种行为是很有用的。这个解释是最简单的表述行为的(表述行为的)语句如“我原谅你”或“我打赌你不能爬那座山。”但是问候语、问题、答案、断言和说明都可以被认为是基于言语的行为类型。识别对话言语下的对话行为是理解对话的重要的第一步。
NPS语料库中,有超过10000个来自即时消息会话的帖子。这些帖子都已经被贴上15种对话行为类型中的一种标签。
代码语言:javascript复制posts = nltk.corpus.nps_chat.xml_posts()[:10000]
定义一个简单的特征提取器,检查帖子包含了什么词:
代码语言:javascript复制def dialogue_act_features(post):
features = {}
for word in nltk.word_tokenize(post):
features['contains(%s)' % word.lower()] = True
return features
然后为每个帖子提取特征,构造训练和测试数据。并创建一个新的分类器。
代码语言:javascript复制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))
识别文字蕴含(RTE)
识别文字蕴含的意思是判断文本T的一个给定片段是否蕴含着另一个叫做 假设 的文本。
在我们的RTE特征检测器中,我们让单词(即词类型)作为代理的信息,和我们的特性计算重叠程度的词,并假设有单词的程度而不是文本。并不是所有的单词都是同样重要的–命名实体,如人的名字,组织和地方可能会是更重要的,这促使我们为word和nes(命名实体)提取不同的信息,此外,一些高频虚词作为“停止词”被过滤掉。
构造特征提取器:
代码语言:javascript复制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
为了表明特征的内容,可以检验下前面显示的文本/假设 的一些属性
代码语言:javascript复制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')