首页 > 其他分享 >亦菲喊你来学机器学习(19) --TF-IDF中文处理

亦菲喊你来学机器学习(19) --TF-IDF中文处理

时间:2024-09-02 15:21:37浏览次数:11  
标签:jieba 19 来学 中文 单词 TF IDF 分词

文章目录

TF-IDF

TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种用于信息检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

上一篇我们提到了,对于中文文章来说,我们没有办法直接计算TF-IDF值,因为我们没有计算的对象,每个单词都在句子中连接在一起了,不同于英语每个单词都被空格分开了,所以我们也需要将中文中的句子都分开成一个个单词。

于是我们来介绍jieba库方法,来实现中文分词!

jieba库中文分词

jieba是中文文本处理中的一个非常流行的库,用于中文分词。中文分词是中文自然语言处理中的一个基础步骤,因为中文文本不像英文那样有明显的空格来分隔单词。jieba支持三种分词模式:精确模式、全模式和搜索引擎模式,同时它还支持添加自定义词典,以优化分词结果。

本篇简单介绍其两个作用:

  1. 分词
  2. 自定义添加词典

介绍之前,因为jieba库是第三方库,所以要安装哦:

pip install jieba

分词

jieba库中本身就有词海,包含了大部分的常用词,分词方法lcut():

import jieba    #jieba库用于中文分词
str1 = '我们在学习Python办公自动化'
x1 = jieba.lcut(sentence = str1)	#lcut()分词
print(x1)
---------------------
['我们', '在', '学习', 'Python', '办公自动化']

自定义添加词典

但是在这个字符串中,我们想让’Python办公自动化’作为一个单词输出,于是我们需要自己手动的将’Python办公自动化’添加进jieba词海中,让其将它识别成一个单词,添加方法add_word():

str1 = '我们在学习Python办公自动化'
jieba.add_word('Python办公自动化') #在jieba词海之中,添加新的单词,在jieba分词时,将其识别成一个词
x2 = jieba.lcut(sentence = str1) # lcut()分词
print(x2)
--------------
['我们', '在', '学习', 'Python办公自动化']

一个一个单词添加太过麻烦,我们还可以读取一个文本中的单词,将其中单词添加进词海,添加方法load_userdict():

jieba.load_userdict(r'红楼梦词库.txt')   #加载用户自定义的词典文件,将文件中的词添加进词库
str = '傲世也因同气味把万事全抛白雪红梅园林集景'
a = jieba.lcut(sentence = str)
print(a)
--------------------
['傲世也因同气味', '把万事全抛', '白雪红梅园林集景']

这样,我们就了解了jieba库的基本用法。

TF-IDF应用中文文章

1. 收集数据

链接:https://pan.baidu.com/s/1vdM88FORqAvixific6GfHA?pwd=9unj

提取码:9unj

2. 数据预处理

jieba分词,将中文文本中的词语都按要求分开来,去除掉语气助词、符号等没必要的字符,即去停用词:

# 将每篇文本都进行中文分词(去停用词,找到符合条件的词)
import jieba
# 加载用户自定义的词典,以便在分词过程中能够识别并正确分割出用户词典中定义的词汇
jieba.load_userdict('.\红楼梦\红楼梦词库(1).txt')
# 识别停用词(无关的符号、语气词之类的)
stopwords = pd.read_csv('./红楼梦/StopwordsCN.txt',
                        encoding='utf-8',engine='python',index_col=False)
File_words = open('训练数据.txt','r',encoding='utf-8')
file_jieba = open('./分词.txt','w',encoding='utf-8')
for line in File_words:
    juan_ci = ''
    segs = jieba.lcut(line)
    for seg in segs:
        if seg not in stopwords.stopword.values and len(seg.strip()) > 0:
            juan_ci += seg + ' '
    file_jieba.write(juan_ci)
file_jieba.close()

在这里插入图片描述

将分好的词另外存放进一个文本,便于接下来计算TF-IDF值。

3. 构建TF-IDF模型对象

将分词的文本读出,对文本中的每个词拟合变换,计算TF-IDF值:

from sklearn.feature_extraction.text import TfidfVectorizer
inFile = open('./红楼梦/分词后汇总.txt','r',encoding='utf-8')
corpus = inFile.readlines()

vectorizer = TfidfVectorizer()
tfidf = vectorizer.fit_transform(corpus)
wordlist = vectorizer.get_feature_names_out()	#得到文本中的所有单词

模型拟合变换之后,即fit_transform()后,模型中已经将每个单词的TF-IDF值计算出来了,存放在模型对象tfidf的data参数中:

在这里插入图片描述

4. 排序取值

将文章中每个单词及其对应的TF-IDF值一一匹配对应,取权重最大的前十位:

wordlist = vectorizer.get_feature_names_out()
resdict = {}
for j in range(0,len(wordlist)):
    resdict[wordlist[j]] = tfidf.data[j]
resdict = sorted(resdict.items(),key=lambda x: x[1],reverse=True)
print(resdict[0:10])
----------------------
[('花草', 0.6881877837825879), ('当暄', 0.6369431893238401), ('姿色', 0.6344396760064667), ('格儿', 0.5345006632891931), ('防避', 0.5292960147979806), ('谦恭下士', 0.49819075049758665), ('玲珑剔透', 0.4850529808045218), ('进城', 0.4727080684472267), ('禅房', 0.47164095305220133), ('一跤', 0.4481377720511264)]

这样我们就取到了权重最大的前十位单词,如果要搜索这篇文章的话,便可以通过搜索这些单词来搜索。

总结

本篇介绍了:

  1. jieba分词的基础用法
  2. 如何计算中文文本中单词的TF-IDF值
  3. 型拟合变换之后,模型中已经将每个单词的TF-IDF值计算出来了

标签:jieba,19,来学,中文,单词,TF,IDF,分词
From: https://blog.csdn.net/m0_74896766/article/details/141809865

相关文章

  • CF 1996 E. Decode(*1600) 思维+前缀和
    CF1996E.Decode(*1600)思维+前缀和题目链接题意:给你一个长度为\(n\)的二进制字符串,求出所有的子区间的所有满足\(0\)的个数等于\(1\)的个数的子区间个数之和。思路:首先,求一段区间是否满足\(0\)的数量是否等于\(1\)的个数,是非常经典的做法,我们只需要维护一个数......
  • CF 2001 D. Longest Max Min Subsequence(*1900) 思维
    CF2001D.LongestMaxMinSubsequence(*1900)思维题目链接题意:给你一个长度为\(n\)的序列\(a\),设\(S\)是\(a\)的所有可能的非空子序列的集合,且没有重复的元素。你的目标是找出\(S\)中最长的序列。如果有多个序列,请找出将奇数位置上的项乘以\(−1\)后,使词序最小......
  • CF 2002 D1. DFS Checker (Easy Version) (*1900)思维
    CF2002D1.DFSChecker(EasyVersion)(*1900)思维题目链接题意:给你一棵\(n\)个节点组成的完全二叉树,并给出一个排列\(p\)。接下来进行\(q\)次询问。每次询问给你\(x\)和\(y\),你需要交换\(p_x\)和\(p_y\)。并且回答交换之后的排列\(p\)是否是这棵完全二叉树......
  • 2019-2020 ICPC Northwestern European Regional Programming Contest (NWERC 2019):GH
    前言目前打过的最逆天的一场,前半场CF评测机度假去了,全场Inqueue,两小时左右评测机终于回来了,Standings遍地开花,听取WA声一片。昨天就有好几道题是因为没及时看题所以没做,赛后还和队友商量说应该先把所有题大致看一遍,结果今天不长记性,还没看H和J,就去写思路不一定对+实现起来难得......
  • 19031 树的重心
    ###思路1.使用DFS遍历树,计算每个节点的子树大小。2.计算每个节点的最大连通块大小。3.找到最大连通块大小最小的节点,即为树的重心。###伪代码1.读取输入数据,构建树的邻接表。2.定义DFS函数,计算每个节点的子树大小。3.遍历所有节点,计算每个节点的最大连通块大小......
  • C程序设计语言(第2版·新版)练习题1-19
    练习1-19 编写函数reverse(s),将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序。#include<stdio.h>#defineMAXLINE1000intgetline(chars[],intlim);voidreverse(chars[]);intmain(intargc,char*argv[]){(vo......
  • 招商银行信用卡中心2019秋招IT笔试——比特币最佳买卖时机
    给定一个正整数数组,它的第 i 个元素是比特币第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一次),设计一个算法来计算你所能获取的最大利润。注意你不能在买入比特币前卖出。时间限制:C/C++1秒,其他语言2秒空间限制:C/C++32M,其他语言64M输入描述:正整数数组,为......
  • 【ERROR_INVALID_PIP】ESP开发环境 esp-idf v5.3 + VSCode + 插件 espressif idf 的搭
    目录一、概述二、详细安装流程1、下载安装ESP-IDF工具安装器2、配置相应的环境变量3、运行Helloworld 三、报错以及处理方法处理方法:四、结语一、概述        文章主要内容是对ESP-IDF的配置安装流程的回顾以及完成helloworld示例项目的构建与烧录,并针......
  • PAT乙级 1019.游戏黑洞(测试点2.3.4.5)
    一、题目给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。例如,我们从6767开始,将......
  • 240719 聚类算法的评价
    结果。评价kmean在集群的最佳数量,我们迭代一系列的值,找出其中的峰值的性能度量聚类算法的一个好方法是观察集群被分离的离散程度#-*-coding:utf-8-*-importnumpyasnpimportmatplotlib.pyplotaspltfromsklearnimportmetricsfromsklearn.clusterimportKM......