【ChatBot学习笔记】0.自然语言处理

本文深入探讨了自然语言处理中的贝叶斯分类器原理,通过实例展示了其在文本分类中的应用。此外,介绍了词性标注、句子分割、对话行为识别和文字蕴含检测等文本分类任务。同时,讨论了语言的结构化处理,如分块技术,以及如何通过名词短语分块等方法提取实体。最后,提到了关系抽取在理解实体间关系的重要性,并指出文法分析在处理无限语言组合中的作用。
摘要由CSDN通过智能技术生成

0.自然语言处理

import nltk

贝叶斯分类器,简单来说就是直接以训练中高概率结果进行判断标记

my_train_set = [
        ({'feature1':u'a'},'1'),
        ({'feature1':u'a'},'2'),
        ({'feature1':u'a'},'3'),
        ({'feature1':u'a'},'3'),
        ({'feature1':u'b'},'2'),
        ({'feature1':u'b'},'2'),
        ({'feature1':u'b'},'2'),
        ({'feature1':u'b'},'2'),
        ({'feature1':u'b'},'2'),
        ({'feature1':u'b'},'2'),
        ]
classifier = nltk.NaiveBayesClassifier.train(my_train_set)
print (classifier.classify({'feature1':u'a'}))
print (classifier.classify({'feature1':u'b'}))

from nltk.corpus import movie_reviews

all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())  # 将库中单词转换成小写后统计出现频率
word_features = list(all_words.keys())[:2000]  # 选取最高频2000词,记得要将字典的key转换成列表格式
def document_features(document): 
    for word in word_features: 
        features['contains(%s)' % word] = (word in document_words) # 特征提取,看看根据影评库得到的高频2000词在文本中出现情况
    return features 

预测新文档并提取前5:

classifier.classify(document_features(d))

classifier.show_most_informative_features(5)

其他文本分类

文本分类除了文档分类外还有许多其他类型的分类,比如:

词性标注:属于一种文本分类,一般是基于上下文语境的文本分类

句子分割:属于标点符号的分类任务,它的特征一般选取为单独句子标识符的合并链表、数据特征(下一个词是否大写、前一个词是什么、前一个词长度……)

识别对话行为类型:对话行为类型是指问候、问题、回答、断言、说明等

识别文字蕴含:即一个句子是否能得出另外一个句子的结论,这可以认为是真假标签的分类任务。这是一个有挑战的事情

结构化

任何语言的每一句话之所以称为“话”,是因为它有一定的句子结构,除了一个个独立的词之外,他们之间还存在着某种关系。如果任何一句话可以由任何词构成,可长可短,那么这是一个非结构化的信息,计算机是很难理解并做计算的,但是如果能够以某种方式把句子转化成结构化的形式,计算机就可以理解了。

事实上,人脑在理解一句话的时候也暗暗地在做着由非结构化到结构化的工作。

比如说:“我下午要和小明在公司讨论一个技术问题”。这是一片非结构化的词语拼成的一句话,但是这里面有很多隐含信息:

1)时间:下午

2)对象:小明

3)地点:公司

4)活动:讨论

5)内容:问题

6)常理性:下午是一个时间、小明是一个人名、公司是一个地点、讨论是一种活动

7)特殊性:这个问题是技术问题、我和小明有某种关系

针对句子的信息有利于理解这句话,而常理性的信息可以积累下来用来以后理解其他句子

将非结构化的句子转成结构化的信息,除了要做的工作除了断句、分词、词性标注之外,还要做的一个关键事情就是分块

分块

分块就是根据句子中的词和词性,按照某种规则组合在一起形成一个个分块,每个分块代表一个实体。常见的实体包括:组织、人员、地点、日期、时间等

以上面的例子为例,首先我们做名词短语分块(NP-chunking),比如:技术问题。名词短语分块通过词性标记和一些规则就可以识别出来,也可以通过机器学习的方法识别

除了名词短语分块还有很多其他分块:介词短语(PP,比如:以我……)、动词短语(VP,比如:打人)、句子(S,我是人)

分块的标记和储存
可以采用IOB标记,I(inside,内部)、O(outside,外部)、B(begin, 开始),一个块的开始标记为B,块内的标识符序列标注为I,所有其他标识符标注为O

也可以用树结构来存储分块,用树结构可以解决IOB无法标注的另一类分块,那就是多级分块。多级分块就是一句话可以有多重分块方法,比如:我以我的最高权利惩罚你。这里面“最高权利”、“我的最高权利”、“以我的最高权利”是不同类型分块形成一种多级分块,这是无法通过IOB标记的,但是用树结构可以。这也叫做级联分块。具体树结构举个例子:

(S
    (NP 小明) 
    (VP
        (V 追赶) 
        (NP
            (Det 一只) 
            (N 兔子)))) 

关系抽取

通过上面的分块可以很容易识别出实体,那么关系抽取实际就是找出实体和实体之间的关系,这是自然语言处理一个质的跨越,实体识别让机器认知了一种事物,关系识别让机器掌握了一个真相。

关系抽取的第一个方法就是找到(X, a, Y)这种三元组,其中X和Y都是实体,a是表达关系的字符串,这完全可以通过正则来识别,因为不同语言有这不同的语法规则,所以方法都是不同的,比如中文里的“爱”可以作为这里的a,但是“和”、“因为”等就不能作为这里的a

from nltk.corpus import conll2000
print (conll2000.chunked_sents(‘train.txt’)[99])

由于句子的无限组合、无限拓展特性,想要覆盖语言的全部,光是语法分析还不够,得加上文法分析
基于规则的文法分析工作量极大,相比之下基于特征的文法分析有可穷举、方便存储的特质

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值