本次主要讲解在文本分类中,通过TF-IDF计算不同文本的内容权重,然后引入KMean对不同文本的TF-IDF的权重向量进行聚类。此方法广泛应用在推荐系统中基于内容的推荐。
TF-IDF
在讲解例子之前,想了解一下什么是TF-IDF。
- TF:Term Frequency,词频
- IDF:Inverse Document Frequency,逆向文档率
一个单词在文档中的区分度。这个单词出现的文档数越少,区分度越大,IDF越大。
下面通过一个小例子,加深一下了解:
import numpy as np
import pandas as pd
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
s_1 = '我喜欢和同学打篮球,打篮球属于一种运动。'
s_2 = '我想和同学去买水果。'
s_3 = '昨天我和妈妈去买水果。'
s_4 = '同学喊我跟他一起做运动,比如打篮球。'
s_5 = '今天画了个好看美妆,准备去约会。'
s_6 = '我同学帮我画了个妆,比我自己画的好看'
s_7 = '英雄联盟S11版本上分英雄推荐。'
s_8 = '英雄联盟S11赛季得世界赛时间公布'
#将文本转换为dataframe的形式
data = pd.DataFrame({'sentence':[s_1,s_2,s_3,s_4,s_5,s_6,s_7,s_8]})
#定义函数,使用jieba进行分词,并去除停用词
def func(x):
x = jieba.cut(x)
stop_word = [',','。']
return ' '.join([i for i in x if i not in stop_word])
#将句子进行函数转换
data['sentence'] = data['sentence'].apply(func)
#引入TF-IDF接口,对句子进行转换
tf = TfidfVectorizer()
res = tf.fit_transform(data['sentence'])
#获取词袋模型中的所有词语
res_name = tf.get_feature_names()
#将tf-idf矩阵抽取出来,元素w[i][j]表示j词在i类文本中的tf-idf权重
res_weight = res.toarray()
#使用KMeans根据不同词袋的权重进行聚类
kmean = KMeans(n_clusters=4)
kmean.fit(res_weight)
#获取KMean的簇类
clusters = kmean.labels_
data['cluster'] = clusters
data
result
接着,我们可以根据KMeans中K值的不同,打印其SSE的变化曲线。
import matplotlib.pyplot as plt
import seaborn as sns
SSE = []
for i in range(1,9):
km = KMeans(n_clusters=i,random_state = 2021)
km.fit(res_weight)
#获取K-means算法的SSE
SSE.append(km.inertia_)
#根据不同K值画出对应的SSE
plt.figure(figsize = (10,8))
plt.plot(SSE)
plt.ylabel('SSE',size = 20)
plt.xlabel('K',size = 20)
除此之外,TF-IDF也能对脱敏数据进行处理:
#脱敏数据同样可以处理
s_10 = '2 80 9 11 330'
s_11 = '3 11 330 15 313'
s_12 = '10 222 26 23 16'
s_13 = '7 230 25 26 10 '
#将文本转换为dataframe的形式
data_2 = pd.DataFrame({'sentence':[s_10,s_11,s_12,s_13]})
#这是不需要jieba,直接调用TF-IDF进行处理
tf = TfidfVectorizer()
res_2 = tf.fit_transform(data_2['sentence'])
#获取词袋模型中的所有词语
res_2_name = tf.get_feature_names()
res_2_weight = res_2.toarray()
#引入KMeans接口进行聚类
kmean = KMeans(n_clusters=2)
kmean.fit(res_2_weight)
#获取KMeans的簇类结果
clusters = kmean.labels_
data_2['cluster'] = clusters
data_2
result