当前位置:   article > 正文

2024年最全NLP 中的文本分类_nlp文本分类,15个经典面试问题

nlp文本

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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’})


 


执行后判断特征a和特征b的分类分别是3和2


因为训练集中特征是a的分类是3的最多,所以会归类为3


当然实际中训练样本的数量要多的多,特征要多的多


请尊重原创,转载请注明来源网站[www.shareditor.com](https://bbs.csdn.net/topics/618658159)以及原始链接地址


### 文档分类


不管是什么分类,最重要的是要知道哪些特征是最能反映这个分类的特点,也就是特征选取。文档分类使用的特征就是最能代表这个分类的词。


因为对文档分类要经过训练和预测两个过程,而特征的提取是这两个过程都需要的,所以,习惯上我们会把特征提取单独抽象出来作为一个公共方法,比如:



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

from nltk.corpus import movie_reviews
all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())
word_features = all_words.keys()[:2000]
def document_features(document):
for word in word_features:
features[‘contains(%s)’ % word] = (word in document_words)
return features


这是一个简单的特征提取过程,前两行找到movie\_reviews语料库中出现词频最高的2000个词作为特征,下面定义的函数就是特征提取函数,每个特征都是形如contains(\*\*\*)的key,value就是True或False,表示这个词是否在文档中出现


那么我们训练的过程就是:



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

featuresets = [(document_features(d), c) for (d,c) in documents]
classifier = nltk.NaiveBayesClassifier.train(featuresets)


 


要预测一个新的文档时:



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

classifier.classify(document_features(d))


 


通过



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

classifier.show_most_informative_features(5)


可以找到最优信息量的特征,这对我们选取特征是非常有帮助的


 


### 其他文本分类


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


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


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


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


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


  



## 从一句话里提取出十句话的信息,扩充训练样本


按照之前理解的内容,对一句话做处理,最多是切成一个一个的词,再标注上词性,仅此而已,然而事实并非如此,一句话还可以做更多的文章,如下:


### 什么?还能结构化?


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


  



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


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


1)小明是一个实体


2)参与者有两个:我和小明


3)地点设定是:公司


4)要做的事情是:讨论


5)讨论的内容是:问题


6)这个问题是一个技术问题


7)公司是一个地点


8)讨论是一种行为


9)我和小明有某种关系


10)下午是一个时间


上面这些信息有一些是专门针对这个句子的,有一些是常理性的,对于针对句子的信息有利于理解这句话,对于常理性的信息可以积累下来用来以后理解其他句子。


那么怎么才能把非结构化的句子转成结构化的信息呢?要做的工作除了**断句、分词、词性标注**之外,还要做的一个关键事情就是**分块**。


 


### 分块


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


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


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


 


### 分块如何标记和存储呢?


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


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



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115

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


这是不是让你想到了语法树?


 


### 关系抽取


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


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


 


### 编程实现


下面介绍部分有关分块的代码,因为中文标注好分块的语料没有找到,所以只能沿用英文语料来说明,但是原理是一样的


conll2000语料中已经有标注好的分块信息,如下:



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

from nltk.corpus import conll2000
print conll2000.chunked_sents(‘train.txt’)[99]
(S
(PP Over/IN)
(NP a/DT cup/NN)
(PP of/IN)
(NP coffee/NN)
,/,
(NP Mr./NNP Stone/NNP)
(VP told/VBD)
(NP his/PRP$ story/NN)
./.)


我们可以基于这些标注数据做训练,由于这种存储结构比较特殊,所以就不单独基于这种结构实现parser了,只说下跟前面讲的机器学习一样,只要基于这部分数据做训练,然后再用来标注新的语料就行了


  


### 这里介绍一下 sklearn 库中的的一个文本分类 demo


以下为笔者自己编辑: 


  




  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

-- coding:utf-8 --

import numpy as np

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

1715403535642)]
[外链图片转存中…(img-KwGXNG3B-1715403535643)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/781434
推荐阅读
相关标签
  

闽ICP备14008679号