文章目录
- TF-IDF
- jieba库中文分词
- TF-IDF应用中文文章
-
- [1. 收集数据](#1. 收集数据)
- [2. 数据预处理](#2. 数据预处理)
- [3. 构建TF-IDF模型对象](#3. 构建TF-IDF模型对象)
- [4. 排序取值](#4. 排序取值)
- 总结
TF-IDF
TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种用于信息检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
上一篇我们提到了,对于中文文章来说,我们没有办法直接计算TF-IDF值,因为我们没有计算的对象,每个单词都在句子中连接在一起了,不同于英语每个单词都被空格分开了,所以我们也需要将中文中的句子都分开成一个个单词。
于是我们来介绍jieba库方法,来实现中文分词!
jieba库中文分词
jieba是中文文本处理中的一个非常流行的库,用于中文分词。中文分词是中文自然语言处理中的一个基础步骤,因为中文文本不像英文那样有明显的空格来分隔单词。jieba支持三种分词模式:精确模式、全模式和搜索引擎模式,同时它还支持添加自定义词典,以优化分词结果。
本篇简单介绍其两个作用:
- 分词
- 自定义添加词典
介绍之前,因为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)]
这样我们就取到了权重最大的前十位单词,如果要搜索这篇文章的话,便可以通过搜索这些单词来搜索。
总结
本篇介绍了:
- jieba分词的基础用法
- 如何计算中文文本中单词的TF-IDF值
- 型拟合变换之后,模型中已经将每个单词的TF-IDF值计算出来了