scikit-learn应用:基于K-means的新闻聚类


要对新闻文本进行聚类,首先要将每一篇新闻都表示成向量的形式。这里使用的方法是提取文本中的特征词,然后将每篇文档表示成一个特征向量。提取特征的方式有很多,这里选取最简单的基于TF-IDF的方法。对新闻文本进行分词、去停用词后,计算每个词的TF-IDF值,依据该值提取特征,并获得每篇文档的特征向量。接下来对流程进行详细描述。

0x001、预处理:分词、去停用词

这里使用比较简单的jieba分词库进行分词。对每篇文章分词后,将出现在停用词表中的词删除。

  • 在分词之前,为了提高分词精确度,可以导入自定义词库。
  • 清华大学中文分词库:THUOCL
  • 在Github上找到一份停用词表:goto456/stopwords
1
2
3
4
import jieba
jieba.load_userdict('path/to/dict') # 导入用户词典
doc = '今天天气真好。'
data = jieba.lcut(doc) # 分词并返回list格式

0x002、基于TF-IDF的特征向量

分词之后,每个词的TF-IDF值可以看作这个词的权重。依照权重逆序排列之后,前n个词可以看做n个特征。那么对于每个文档,就可以得到一个n维的特征向量。

这个过程可以调用sklearn的API实现,非常方便。

1
2
3
4
5
6
7
8
9
10
from sklearn.feature_extraction.text import TfidfVectorizer
# 将分词结果放入列表中:
corpus=["我 来到 北京 清华大学",#第一类文本切词后的结果,词之间以空格隔开
"他 来到 了 网易 杭研 大厦",#第二类文本的切词结果
"小明 硕士 毕业 与 中国 科学院",#第三类文本的切词结果
"我 爱 北京 天安门"]#第四类文本的切词结果
vectorizer = TfidfVectorizer(max_features=20) # max_features设置最多提取几个特征
data = vectorizer.fit_transform(vectorizer) # 训练并将corpus中的文档逐条转成特征向量
# 可以通过 vectorizer.get_features()获得特征词
# 可以通过 data.toarray()获得numpy.array格式的特征向量

0x003、基于K-means的文本聚类

同样的,这里直接调用sklearn的API实现。示例如下:

1
2
3
4
5
6
from sklearn.cluster import KMeans
X = np.array([[1, 2], [1, 4], [1, 0],
[4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, random_state=0)
labels = kmeans.fit_predict(X) # 获得X中每个类的标签
centers = kmeans.cluster_centers_ # 获得每个类的中心

以上。

参考链接

  1. scikit-learn文本特征提取之TfidfVectorizer
  2. python scikit-learn计算tf-idf词语权重
  3. sklearn.feature_extraction.text.TfidfVectorizer
  4. sklearn.cluster.KMeans
谢谢支持!
0%