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

文章目录

TF-IDF

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

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

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

jieba库中文分词

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

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

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

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

python 复制代码
pip install jieba

分词

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

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

自定义添加词典

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

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

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

python 复制代码
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分词,将中文文本中的词语都按要求分开来,去除掉语气助词、符号等没必要的字符,即去停用词:

python 复制代码
# 将每篇文本都进行中文分词(去停用词,找到符合条件的词)
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值:

python 复制代码
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值一一匹配对应,取权重最大的前十位:

python 复制代码
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值计算出来了
相关推荐
古希腊掌管学习的神39 分钟前
[机器学习]XGBoost(3)——确定树的结构
人工智能·机器学习
ZHOU_WUYI1 小时前
4.metagpt中的软件公司智能体 (ProjectManager 角色)
人工智能·metagpt
靴子学长2 小时前
基于字节大模型的论文翻译(含免费源码)
人工智能·深度学习·nlp
梧桐树04293 小时前
python常用内建模块:collections
python
AI_NEW_COME3 小时前
知识库管理系统可扩展性深度测评
人工智能
Dream_Snowar3 小时前
速通Python 第三节
开发语言·python
海棠AI实验室3 小时前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
hunteritself3 小时前
AI Weekly『12月16-22日』:OpenAI公布o3,谷歌发布首个推理模型,GitHub Copilot免费版上线!
人工智能·gpt·chatgpt·github·openai·copilot
IT古董4 小时前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
centurysee4 小时前
【最佳实践】Anthropic:Agentic系统实践案例
人工智能