NLTK-008:分类文本(有监督分类的更多例子)

举报
冬晨夕阳 发表于 2022/03/29 23:38:31 2022/03/29
【摘要】 句子分割: 句子分割可以看作是一个标点符号的分类任务:每当我们遇到一个可能会结束的句子的符号,我们必须决定他是否终止了当前句子。 #首先获得一些已被分割成句子的数据 #将他转换成一种适合提取特征的形...

句子分割:

句子分割可以看作是一个标点符号的分类任务:每当我们遇到一个可能会结束的句子的符号,我们必须决定他是否终止了当前句子。

#首先获得一些已被分割成句子的数据  #将他转换成一种适合提取特征的形式
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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。