《机器学习》数据分析之关键词提取、TF-IDF、项目实现 <下>

目录

一、内容回顾

1、核心算法

2、算法公式

3、拆分文本

二、再次操作

1、取出每一卷的地址和内容

得到下列结果:(此为DF类型)

2、对每一篇文章进行分词

3、计算TF-IDF值

得到以下数据:

三、总结

1、关键词提取

1)基于频率统计的方法

2)基于文本特征的方法

2、TF-IDF(Term Frequency-Inverse Document Frequency)

1)词频(Term Frequency,TF)

2)逆文档频率(Inverse Document Frequency,IDF)

3)TF-IDF的最终得分为TF和IDF的乘积

3、总结


一、内容回顾

1、核心算法

        TF-IDF,用来评估一个词在文档中的重要性统计方法

2、算法公式

3、拆分文本

        上节课我们通过以下代码将红楼梦正篇文章分成了120个卷

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 "手机电子书" not in line:
        if '卷 第' in line:   # 判断每一行是否有这个数值
            juan_name = line.strip()+'.txt'   # 去除带有上述数值的一行数据左右两边的空白字符,比如空格、制表、换行等,并增加了一个后缀txt
            path = os.path.join('.\\红楼梦\\分卷\\',juan_name)  # 使用os库中的方法path.join遍历并创建一个文件,文件地址为红楼梦目录下的分卷文件内,文件名为上述增加了txt后缀的字符串
            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文件
    continue
juan_file.close()  # 操作完关闭文件

其处理结果如下所示:(分卷内存放每卷内容)

二、再次操作

1、取出每一卷的地址和内容

import pandas as pd
import os

filePaths = []   # 定义一个空列表用于存放卷内文件的地址
fileContents = []   # 用来存放卷内文件的内容

for root,dirs,files in os.walk(r'.\红楼梦\分卷'):   # 使用os的walk用法,用来遍历文件内的文件地址、文件目录、文件名,返回三个参数
    for name in files:    # 遍历每一个文件名
        filePath = os.path.join(root,name)   # 使用os.path.join遍历文件地址和目录
        filePaths.append(filePath)   # 将带有文件地址和文件名的字符串存入filePaths列表
        f = open(filePath,'r',encoding='utf8')   # 打开前面生成的文件,因为此时已经有了文件地址和文件名
        fileContent = f.read()   # 读取文件内的内容
        fileContents.append(fileContent)   # 将文件内容存在fileContents列表中
        f.close()  # 存放完关闭文件

corpos = pd.DataFrame({'filePath':filePaths,'fileContent':fileContents})  # 将上述带有文件地址和文件内容的两个列表转变成二维数组,并给予列名
print(corpos)
得到下列结果:(此为DF类型)

2、对每一篇文章进行分词

import jieba   # 导入分词库
jieba.load_userdict(r'.\红楼梦\红楼梦词库.txt')   # 传入本地的红楼梦词库,其中存放红楼梦的固定词组
# 使用pd打开停用词,则表明打开后的文件为一个DateFrame类型,index_col表示是否将第一列当做索引列,engine使用python解释器解析
stopwords = pd.read_csv(r'.\红楼梦\StopwordsCN.txt',encoding='utf8',index_col=False,engine='python')
file_to_jieba = open(r'.\红楼梦\分词后汇总.txt','w',encoding='utf8')   # 创建一个文件,用于存放分词后的数据,一行代表一卷内容的分词结果

for index,row in corpos.iterrows():   # 使用iterrows遍历二维数组每一行的内容,返回两个参数,一个表示所有的行索引,一个表示所有行的内容series类型
    juan_ci = ''   # 定义一个空,用来递增每一卷分出来的词组
    filePath = row['filePath']   # 取出返回的每一行数据的地址
    fileContent = row['fileContent']  # 取出每一行的数据内容,表示每一卷的内容
    segs = jieba.cut(fileContent)   # 对取出的每一卷内容进行分词,得到一个列表,
    for seg in segs:   # 遍历每一个分出来的词组
        if seg not in stopwords.stopword.values and len(seg.strip())>0:  # 判断分出来的词组是否是空值,是否是停止词的内容
            juan_ci += seg + ' '   # 将取出的每一个词后面加上一个空格,然后将每一卷的所有的词组连接起来
    file_to_jieba.write(juan_ci+'\n')    # 将每一卷连接好的词组内容写入文件
file_to_jieba.close()  # 关闭文件

得到一个分词文件,其内有如下数据:(其中每一行代表一个卷的所有词组,因为文件长度不够,所以自动排列到下一行)

3、计算TF-IDF值

from sklearn.feature_extraction.text import TfidfVectorizer  # 导入计算TF-IDF的库
import pandas as pd

infile = open(r'.\红楼梦\分词后汇总.txt','r',encoding='utf8')   # 打开上述生成的词组文件
corpus = infile.readlines()   # 读取文件所有行的内容

vectorizer = TfidfVectorizer()   # 建立模型
tfidf = vectorizer.fit_transform(corpus)  # 对模型进行训练,返回一个带有所有值坐标和对应TF-IDF值的稀疏矩阵
wordlist = vectorizer.get_feature_names()   # 获取所有的特征值,即所有的词组

df = pd.DataFrame(tfidf.T.todense(),index=wordlist)   # 将上述的稀疏矩阵和特征值合并,转换成二维数组,行代表每个词组在每篇文章的TF-IDF的值,列表示每篇文章的所有词组

for i in range(0,len(corpus)):   # 遍历出来每一卷文章的所有词组
    featurelist = df.iloc[:,i].to_list()  # 将每篇文章所有词组的TF-IDF的值转换成列表形式
    resdict = {}   # 设置一个空字典,用来存放每篇文章的词组和其对应的值
    for j in range(0,len(featurelist)):   # 遍历每一个单词
        resdict[wordlist[j]] = featurelist[j]  # 这里不停地传入字典新的值,键为每个单词,值为单词对应TF-IDF值
    resdict = sorted(resdict.items(),key=lambda x:x[1],reverse=True)  # 对每篇文章的TF-IDF值进行排序

    print(resdict[:10])  # 打印每篇文章的前十TF-IDF值

至此已完成所有内容

得到以下数据:

三、总结

1、关键词提取

        关键词提取是从给定的文本中提取出最具有代表性和重要性的词语。常见的关键词提取方法包括基于频率统计的方法和基于文本特征的方法。

        1)基于频率统计的方法

                通过计算词语在文本中的出现频率,提取出现频率较高的词语作为关键词。常见的方法有词频(TF)和逆文档频率(IDF)。

        2)基于文本特征的方法

                通过考虑词语在上下文中的语义关联性,提取具有语义相关性的词语作为关键词。常见的方法有TextRank算法和LDA主题模型。

2、TF-IDF(Term Frequency-Inverse Document Frequency)

        TF-IDF是一种用于评估文本中词语重要性的统计方法。它是通过计算词语在文本中的词频(TF)和逆文档频率(IDF)来确定一个词语的重要性。具体计算方法如下:

        1)词频(Term Frequency,TF)

                指定词语在文本中出现的频率,计算方法为词语在文本中的出现次数除以文本的总词数。

        2)逆文档频率(Inverse Document Frequency,IDF)

                指定词语在整个文本集合中的重要程度,计算方法为文本集合中文档总数除以包含该词语的文档数量的对数。

        3)TF-IDF的最终得分为TF和IDF的乘积

                用于衡量一个词语在文本中的重要性。较高的TF-IDF得分表示词语在文本中更重要。

3、总结

         关键词提取是从文本中提取最具有代表性和重要性的词语。TF-IDF是一种常用的关键词提取方法,通过计算词语在文本中的词频和逆文档频率来评估词语的重要性。这些方法在文本数据分析中有广泛的应用,可以帮助我们理解和处理大量的文本数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜就多练_0828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值