【学习笔记】 文本分析

网课知识点汇总

NLTK与jieba概述

NLP:自然语言处理

NLTK:是一套基于Python的自然语言处理工具包,可以方便地完成自然语言处理的任务

语言处理任务 nltk模块 功能描述
获取和处理语料库 nltk.corpus 语料库和词典的标准化接口
字符串处理 nltk.tokenize, nltk.stem 分词,句子分解提取主干
搭配发现 , nltk.collocations 用于识别搭配工具,查找单词之间的关联关系
词性标识符 nltk.tag 包含用于词性标注的类和接口
分类 nltk.classify, nltk.cluster nltk.classify用类别标签标记的接口;nltk.cluster包含了许多聚类算法 如贝叶斯、EM、k-means
分块 nltk.chunk 在不受限制的文本识别非重叠语言组的类和接口
解析 nltk.parse 对图表、概率等解析的接口
语义解释 nltk.sem, nltk.inference 阶逻辑,模型检验
指标评测 nltk.metrics 精度,召回率,协议系数
概率与估计 nltk.probability 计算频率分布、平滑概率分布的接 口
应用 nltk.app,nltk.chat 图形化的关键词排序,分析器, WordNet查看器,聊天机器人
语言学领域的工作 nltk.toolbox 处理SIL工具箱格式的数据

jieba:中文分词组件,支持以下三种分词模式

1、精确模式:试图将句子最精确地切开,适合文本分析

2、全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义

3、搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词

安装NLTK的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
##1、在终端使用pip命令直接安装:
pip install -U nltk

##2、anaconda中已经预装好,直接启动jupyter-notebook, 输入不报错
import nltk

##如果希望安装单独的数据包,或者是下载全部的数据包,则需要在upyter Notebook(或者管理员账户)中执行以下操作
nltk.download() #打开NLTK下载器

##如果希望集中安装所有的选项,则需要单击【File】->【Change Download Directory】选择更新下载目录。

##如果只想安装单独的语料库
nltk.download('XXX') #XXX放入想下载的库

##下载后测试是否成功,以brown为例
from nltk.corpus import brown
brown.words()

jieba库的安装

1
2
3
4
##如果希望对中文进行分词操作,则需要借助 jieba分词工具完成。安装jieba库的方式比较简单,可以使用如下pip命令直接安装:
pip install jieba
##未报错说明安装成功
import jieba

文本预处理

文本预处理一般包括分词、词形归一化、删除停用词,具体流程如下所示:

分词

分词是指将由连续字符组成的语句,按照一定的规则划分成一个个独立词语的过程。
不同的语言具有不同的语法结构。英文以空格为分隔符,中文没有形式上的分隔符。

根据中文的结构特点,可以把分词算法分为以下三类:

1、基于规则的分词方法:按照一定的策略将待分析的中文句子与一个“充分大的”机器词典中的词条进行匹配。

2、基于统计的分词方法:它的基本思想是常用的词语是比较稳定的组合。

3、基于理解的分词方法:它的基本思想是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。

要想使用NLTK对英文句子分词,则可以调用word_tokenize()函数基于空格或标点进行划分,并返回单词列表。

1
2
3
4
5
6
7
sentence = 'I like bule.'
##将句子切分为单词
words = nltk.word_tokenize(sentence)
##或者用遇空格分隔的方式,并先替换标点
sentence = 'I like bule.'
sentence = sentence.replace(".", " ")
sentence.split(" ")

要想使用jieba对中文句子分词,则可以通过jieba.cut()函数进行划分,该函数接收如下三个参数:
1、需要分词的字符串。
2、cut_all参数用来控制是否采用全模式。设置为True则为全模式,False为精确模式,默认为False。
3、HMM参数用来控制是否使用HMM模型。

1
2
3
4
5
6
7
8
9
10
11
#全模式True
sentence = '传智专修学院推出颠覆式办学模式'
terms_list = jieba.cut(sentence, cut_all = True)
print('【全模式】:'+'/'.join(terms_list))
#【全模式】:传/智/专修/修学/学院/推出/颠覆/式/办学/模式
####################################################
#精确模式False
sentence = '传智专修学院推出颠覆式办学模式'
terms_list = jieba.cut(sentence, cut_all = False)
print('【精确模式】:'+'/'.join(terms_list))
#【精确模式】:传智/专修/学院/推出/颠覆/式/办学/模式

词性表注

词性是对词语分类的一种方式。

英文词汇:名词、形容词、动词、代词、数词、副词、介词、连词、冠词和感叹词。

中文词汇:名词、动词、形容词、数词、量词、代词、介词副词、连词、感叹词、助词和拟声词。

词性标注,又称词类标注,是指为分词结果中的每个词标注一个正确的词性。

1
2
##I love itcast
##I 人称代词 love 动词 itcast 名词

NLTK库中使用不同的约定来标记单词

标签 描述 示例
JJ 形容词 special, high, good
RB 副词 quickly, simply, hardly
CC 条件连词 and, or
DT 限定词 the,a
MD 情态动词 could, should
NN 单数名词 home, time, year
NNS 复数名词 birds, dogs, flowers
NNP 专有名词单数 Affica, April, Washington
CD 基本数量词 twenty-one, second, 1997
PRP 人称代词 I, you, he, she
PRPS 所有格代词 my, your, his, her
IN 介词 on,of, at,by,under
TO 不定词 howto,whattodo
UH 感叹词 ah,ha,wow, oh
VB 动词原型 see,listen, speak, run
VBD 动词过去时 did, told, made
VBG 动名词 going,working,making
VBN 动词过去分词 given, taken, begun
WDT WH限定词 which,whatever

如果希望给单词标注词性,则需要先确保已经下载了averaged_perceptron_tagger模块,然后再调用pos_tag()函数进行标注。

1
2
3
words = nltk.word_tokenize('I love blue')
nltk.pos_tag(words)
#[('I', 'PRP'), ('love', 'VBP'), ('blue', 'JJ')]

词形归一化

英文中,一个单词常常是另一个单词的变种。一般在信息检索和文本挖据时,需要对一个词的不同形态进行规范化,以提高文本处理的效率。

词形还原是去除词缀以获得单词的基本形式。这个基本形式称为根词,而不是词干。根词始终存在于词典中,词干不一定是标准的单词,它可能不存在于词典中。

词根:look 一般进行时:looking 一般过去时:looked

词形规范化过程主要包括两种:词干提取和词形还原。

词干提取:是指删除不影响词性的词缀,得到单词词干的过程

词形还原:能够捕捉基于词根的规范单词形式

1、目前最受欢迎的就是波特词干提取器,它是基于波特词干算法来提取词干的,这些算法都集中在PorterStemmer类中。

1
2
3
from nltk.stem.porter import PorterStemmer
porter_stem = PorterStemmer()
porter_stem.stem('watched')

2、还可以用兰卡斯特词干提取器,它是基于兰卡斯特词干算法来提取词干的,这些算法都集中在LancasterStemmer类中。

1
2
3
from nltk.stem.lancaster import LancasterStemmer
lancaster_stem = LancasterStemmer()
lancaster_stem.stem('jumped')

3、还有一些其它的词干器,比如 SnowballStemmer,它除了支持英文以外,还支持其它13种不同的语言。

1
2
3
from nltk.stem import SnowballStemmer
snowball_stem = SnowballStemmer('english')
snowball_stem.stem('listened')

4、NLTK库中提供了一个强大的还原模块,它使用WordNetLemmatizer类来获得根词,使用前需要确保已经下载了wordnet语料库。lemmatize()方法会比对wordnet语料库,并采用递归技术删除词缀,直至在词汇网络中找到匹配项,最终返回输入词的基本形式。如果没有找到匹配项,则直接返回输入词,不做任何变化。

1
2
3
4
5
6
7
8
9
10
11
#导入模块
from nltk.stem import WordNetLemmatizer
#创建对象
wordnet_lem = WordNetLemmatizer()
#归一化
wordnet_lem.lemmatize('books')
wordnet_lem.lemmatize('went')
#单词went并没有还原,这主要是因为它具有多种词性,went作为动词使用时,代表单词 go的过去式,但是作为名词使用的话,它表示的是人名文特。
#可以直接在词形还原时指定词性,也就是说在调用lemmatize()方法时将词性传入pos参数。
#指定went的词性为动词
wordnet_lem.lemmatize('went',pos='v')

删除停用词

停用词是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言文本之前或之后会自动过滤掉某些没有具体意义的字或词。比如英文中的I、the,中文中的啊。

如果直接用包含大量停用词的文本作为分析对象,则可能会导致分析结果存在较大偏差通常在处理过程中会将它们从文本中删除。

停用词都是人工输入、非自动化生成的,生成后的停用词会形成一个停用词表,但是并没有一个明确的停用词表能够适用于所有的工具。

对于中文的停用词,可以参考中文停用词库、哈工大停用词表、百度停用词列表。对于其它语言来说,可以参照 https://www.ranks.nl/stopwords进行了解。

NLTK库里面有一个标准的停用词列表,在使用之前要确保已经下载了stopwords语料库,并且用import语句导入stopwords模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
##下载语料库
import nltk
nltk.download('stopwords')
##导入停词列表
from nltk.corpus import stopwords
##文本
text ='Python is a structured and powerful object-oriented programming language.'
##分词
words = nltk.word_tokenize(text)
##定义语言为英语
stop_words = stopwords.words('english')
##在words中循环定义word,如果word不在停词表stop_words中,则append入list列表中
remain_list = []
for word in words:
if word not in stop_words:
remain_list.append(word)
print(remain_list)
##['Python', 'structured', 'powerful', 'object-oriented', 'programming', 'language', '.']

文本情感分析

文本情感分析,又称为倾向性分析和意见挖掘是指对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。

情感分析还可以细分为情感极性(倾向)分析、情感程度分析及主客观分析等。其中,情感极性分析的目的在于,对文本进行褒义、贬义、中性的判断,比如对于“喜爱”和“厌恶”这两个词,就属于不同的情感倾向。

目前,常见的情感极性分析方法主要分为两种:基于情感词典和基于机器学习。

情感词典:是最简单的情感极性分析的方式,通过制定一系列的情感词典和规则,对文本进行段落拆解句法分析,计算情感值,最后通过情感值来作为文本的情感倾向依据。使用情感词典的方式虽然简单粗暴,但是非常实用,不过一旦遇到一些新词或者特殊词,就无法识别出来,扩展性非常不好。

第一步:对文本进行分词操作,从中找出情感词、否定词以及程度副词。

第二步:判断每个情感词之前是否有否定词及程度副词,将它之前的否定词和程度副词划分为一组。

第三步:将所有组的得分加起来,得分大于0的归于正向,小于0的归于负向。

机器学习:将目标情感分为两类:正、负或者是根据不同的情感程度划分为15类,然后对训练文本进行人工标注,进行有监督的机器学习过程。其中,朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。朴素贝叶斯的思想基础是:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。nltk.classify模块中的NaiveBayesClassifier类实现了朴素贝叶斯分类算法,该类中有一个类方法 train(),主要用于根据训练集来训练模型。

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
#准备用于训练的文本
text_one = 'This is a wonderful book.'
text_two = 'I like reading this book very much.'
text_thr = 'This book reads well.'
text_fou = 'This book is not good.'
text_fiv = 'This is a very bad book.'
#导入模块
from nltk.classify import NaiveBayesClassifier
#定义文本预处理方法
def pret_text(text):
#文本预处理包括:分词、词形归一化、删除停用词
#分词
words = nltk.word_tokenize(text)
#创建对象
wordnet_lem = WordNetLemmatizer()
#遍历words进行归一化
words = [wordnet_lem.lemmatize(word) for word in words]
#删除停用词
remain_list = [word for word in words if word not in stopwords.words('english')]
#展示结果
print(remain_list)
#遍历词 得到对应的词是否在文本中
return {word: True for word in remain_list}
#查看处理结果
pret_text(text_one)
##['This', 'wonderful', 'book', '.']
###################
#构建训练文本,正向为1,负向为-1
train_data = [[pret_text(text_one),1],[pret_text(text_two),1],[pret_text(text_thr),1],[pret_text(text_fou),-1],[pret_text(text_fiv),-1]]
train_data
#训练得到模型
model = NaiveBayesClassifier.train(train_data)
#模型测试1
test_text1 = 'I like this movie very much'
model.classify(pret_text(test_text1))
##1
#模型测试2
test_text2 = 'this film is very bad'
model.classify(pret_text(test_text2))
##-1

文本相似度

文本映射到向量,再利用余弦相似度计算的一般实现步骤如下:

第一步:通过特征提取的模型或手动实现,找出这两篇文章的关键词。

第二步:从每篇文章中各取出若干个关键词,再把这些关键词合并成一个集合,然后计算每篇文章中各个词对于这个集合中的关键词的词频。

第三步:生成两篇文章中各自的词频向量。

第四步:计算两个向量的余弦相似度,值越大侧表示越相似。

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
#导入模块
from nltk import FreqDist
#准备文本
text1 = "John likes to watch movies"
text2 = "John also likes to watch football games"
#加总
all_text = text1 + ' '+ text2
#分词
words = nltk.word_tokenize(all_text)
#创建FreqDist对象,记录每个词出现的频率
freq_dist = FreqDist(words)
freq_dist
#取出John
freq_dist['John']
#取出里面5个常用的单词
most_comman_words = freq_dist.most_common(5)
#展示
most_comman_words
#找到单词所处的位置
def find_postion(comman_words):
#查找常用单词的位置
result = {}
pos = 0
for word in comman_words:
result[word[0]] = pos
pos += 1

return result
#调用方法,记录常用单词对应的位置
pos_dict = find_postion(most_comman_words)
pos_dict
#文本转化为词频向量
def text_to_vector(words):
#初始向量
freq_vec = [0] * 5
#在常用单词的列表上计算词频
for word in words:
if word in list(pos_dict.keys()):
freq_vec[pos_dict[word]] += 1
return freq_vec
#获取text的词频向量
vec1 = text_to_vector(nltk.word_tokenize(text1))
vec1
##
vec2 = text_to_vector(nltk.word_tokenize(text2))
vec2
#计算文本的相似度
from nltk.cluster.util import cosine_distance
cos_dist = cosine_distance(vec1,vec2)
cos_similarity = 1 - cos_dist
cos_similarity

参考来源

https://www.bilibili.com/video/BV1w5411s7FU?spm_id_from=333.788.player.switch&vd_source=7ec7928f0f3a9f6f81d43028ee0cd7b5&p


作话:不属于0基础,还是要先了解基本的python代码

作者

LxxCandy

发布于

2025-10-24

更新于

2025-10-26

许可协议

评论