亦菲喊你来学机器学习(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值计算出来了
相关推荐
SEVEN-YEARS3 分钟前
深入理解TensorFlow中的形状处理函数
人工智能·python·tensorflow
世优科技虚拟人6 分钟前
AI、VR与空间计算:教育和文旅领域的数字转型力量
人工智能·vr·空间计算
EterNity_TiMe_7 分钟前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
cloud studio AI应用12 分钟前
腾讯云 AI 代码助手:产品研发过程的思考和方法论
人工智能·云计算·腾讯云
Suyuoa18 分钟前
附录2-pytorch yolov5目标检测
python·深度学习·yolo
禁默23 分钟前
第六届机器人、智能控制与人工智能国际学术会议(RICAI 2024)
人工智能·机器人·智能控制
Robot25131 分钟前
浅谈,华为切入具身智能赛道
人工智能
只怕自己不够好36 分钟前
OpenCV 图像运算全解析:加法、位运算(与、异或)在图像处理中的奇妙应用
图像处理·人工智能·opencv
好看资源平台1 小时前
网络爬虫——综合实战项目:多平台房源信息采集与分析系统
爬虫·python
果冻人工智能2 小时前
2025 年将颠覆商业的 8 大 AI 应用场景
人工智能·ai员工