目录
一、如何进行关键词提取
1、关键词提取步骤
1)数据收集
收集研究需要的数据,建立相应的语料库
2)数据准备
导入分词库和通用词库
3)模型建立
使用 jieba 库,对语料库进行分词处理
4)模型结果统计
根据分类结果,进行词频统计,并绘制词云图
5)TF-IDF分析
得到加权后分词结果
2、什么是语料库
语料库是指用于训练和评估模型的文本数据集。语料库通常包含大量的自然语言文本,例如新闻文章、书籍、网页内容等。
语料库中存放的是在语言的实际使用中真实出现过的语言材料。
3、如何进行中文分词
1)导包
pip install jieba
2)导入分词库
固定词组,jieba库没有内置的词组
3)导入停用词库
没有意义的词
4)使用jieba库分词
将文章完全分词即可
5)代码实例
import jieba
str = '我们在学习python办公自动化' # 导入词组
jieba.add_word('python办公自动化') # 指定固定词组
a = jieba.lcut(str) # 对词组进行分词
print(a)
此时的运行结果为:
上述如果没有使用固定词组则会有下列运行结果:
二、核心算法
1、TF-IDF分析
TF-IDF是一种用来评估一个词在文档中的重要性的统计方法。
TF指的是某一个给定的词语在该文件中出现的次数,这个数字通常会被归一化(一般是词频除以文章总词数),以防止它偏向长的文件。
IDF指的是逆文档频率。IDF的主要思想是:如果包含词条 t 的文档越少,IDF越大,则说明词条具有很好的类别区分能力。
TF-IDF倾向于过滤掉常见的词语,保留重要的词语,它的值等于一个词的TF乘以它的IDF值,其大小用于衡量一个词在一个文档中的重要性,相当于加权
2、TF-IDF算法公式
1)TF词频公式
2)IDF逆文档频率公式
3)TF-IDF公式
4)举例
以《中国的蜜蜂养殖》为例,假定该文长度为1000个词,“中国"、"蜜蜂”、养殖"各出现20次,则这三个词的"词频"(TF)都为0.02。然后,搜索Google发现,包含"的"字的网页共有250亿张,假定这就是中文网页总数。包含"中国"的网页共有62.3亿张,包含”蜜蜂”的网页为0.484亿张,包含“养殖”的网页为0.973亿张。则它们的逆文档频率(IDF)和TF-IDF如下:
“中国”、 “密封”、“养殖”的TF值 = 20/1000 = 0.02
“中国” IDF值 = log(250/62.3+1) = 0.603
“中国” TF-IDF值 = TF * IDF = 0.0121
同理即可得到剩余词组的TF-IDF值
3、案例
文档内容:(五行代表五篇文章)
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
inFile = open('task2_1.txt','r') # 打开文件
corpus = inFile.readlines() # 读取所有的文章,此时每篇文章内容存放在一行,返回结果是一个列表类型,每单个元素存放一篇文章
vectorizer = TfidfVectorizer() # 建立TF-IDF模型,转为TF-IDF的向量转换对象
tfidf = vectorizer.fit_transform(corpus) # 传入数据,进行训练,返回包含TF-IDF的向量值,其对应为每个词的TF-IDF值,每个词用坐标表示为行列号,列号为全篇文档词组的排序值
print(tfidf)
wordlist = vectorizer.get_feature_names() # 获取全篇文档的所有的词组,列表形式传出
print(wordlist)
df = pd.DataFrame(tfidf.T.todense(),index=wordlist) # 将上述转换的包含TF-IDF的数据转换为稀疏矩阵,T为转置,todense是将上述的稀疏矩阵转换成密集矩阵,之后将其转变为二维数组,并设置索引值为所有的单词
print(df)
for j in range(0,len(corpus)): # 遍历次数为文档内的文章数量
featurelist = df.iloc[:,j].to_list() # 通过索引号获取每一列的内容,并转换为列表
resdict = {} # 排序以及看输出结果对不对
for i in range(0,len(wordlist)): # 遍历的次数为词组的总数
if df.iloc[i,j]!=0: # 首先对每一列进行处理,对每一列分别取出每一个单词对应的值,判断如果不等于0的情况该怎么办
resdict[wordlist[i]] = featurelist[i] # 对每一列数据取出其TF-IDF的值,将其存入字典,键的值为相对应的词组
resdict = sorted(resdict.items(),key=lambda x:x[1],reverse=True) #使用items将字典转换成包含键值对的元组列表,sortes对可迭代对象进行排序,使用匿名函数指定排序的依据,x[1]表示元组对应的值,reverse=True表示降序
print(resdict)
运行结果:
三、处理红楼梦词库
1、导入红楼梦词库
词库内有如下内容:
用法示例:
jieba.load_userdict(r'.\红楼梦词库.txt') # 导入本地词库
str = "螯封嫩玉双双满傲世也因同气味把笔悲伤说世途把芳魂消耗把芳魂消耗望家乡" # 任意设置一个字符串,内容是词云内的数据,用于测试
a = jieba.lcut(sentence=str) # 字符串进行切分
print(a)
运行结果为:
2、对整篇红楼梦文章进行拆分
红楼梦.txt 文件内容:(其中包含整篇文章)
现需将其中的每一卷内容保存为一个新的文本文件,并且文件命名也是相应卷名
完整代码:
import os
file = open(r'.\红楼梦.txt','r',encoding='utf8') # 打开红楼梦数据文件
flag = 0 # 设置一个变量为0
juan_file = open(r'.\红楼梦\红楼梦卷开头.txt','w',encoding='utf8') # 创建写模式,创建一个名为红楼梦卷开头的txt文件,文件放在红楼梦目录下
for line in file: # 遍历每一行内容
if '卷 第' in line: # 判断每一行是否有这个数值
juan_name = line.strip()+'.txt' # 去除带有上述数值的一行数据左右两边的空白字符,比如空格、制表、换行等,并增加了一个后缀txt
path = os.path.join('.\\红楼梦\\分卷\\',juan_name) # 将文件名和路径拼接起来,得到新文件的完整路径。
print(path) # 打印这个文件名
if flag==0: # 判断,如果flag=0
juan_file = open(path,'w',encoding='utf8') # 打开并创建写一个文件,文件名为上述生成的文件名
flag=1 # 将flag赋值为1
else: # 如果flag不等于0,说明已经在生成文件名的操作内了,此时打开上述创建的文件
juan_file.close()
juan_file = open(path,'w',encoding='utf8')
continue # 这里的语句和上述if同级别,在上上个if下,即执行完上述内容后跳出这一整个循环,继续进行下一次循环
juan_file.write(line) # 此段和第一个if同级别,相当于if的else语句,如果字符串不在当前行内,那么就将这一行内容写入juan_file文件
juan_file.close() # 操作完关闭文件
运行结果:
共120卷