前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NLTK-008:分类文本(有监督分类的更多例子)

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

作者头像
李玺
发布2021-11-22 14:20:45
5310
发布2021-11-22 14:20:45
举报
文章被收录于专栏:爬虫逆向案例

句子分割:

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

代码语言: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')
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 句子分割:
  • 识别对话行为类型
  • 识别文字蕴含(RTE)
相关产品与服务
文字识别
文字识别(Optical Character Recognition,OCR)基于腾讯优图实验室的深度学习技术,将图片上的文字内容,智能识别成为可编辑的文本。OCR 支持身份证、名片等卡证类和票据类的印刷体识别,也支持运单等手写体识别,支持提供定制化服务,可以有效地代替人工录入信息。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档