数据集放在“code/”的五个文件夹里,文件夹名称分别是a,b,c,d,e 每个文件夹里分别有50个文档,命名为1-50,本实验数据集是新闻文本数据,包括五个类别“财经新闻”、“体育新闻”、“教育新闻”、“军事新闻”和“娱乐新闻”每个类别均包括50篇文档。 话题检测 1. 数据预处理:利用Jieba分词对每篇文档进行分词;利用TF-ID对F每篇文档提取关键特征词;利用特征词的TF-IDF值作为文档的特征向量。 2. 对预处理后的文档(每篇文档用特征向量表示),从每个类别中随机选取40篇文档,共得到40×5=200篇文档。 3. 对提取的200篇文档,采用K-means算法,划分5个簇,每个簇代表一个类别 4. 画出聚类结果散点图,同时计算FMI指数 话题跟踪 1. 每个类别剩余10篇文档,用于话题跟踪实验 2. 每篇文档与5个簇中心向量(均值向量)计算它们之间的欧氏距离 3. 将文档划分到距离最近的簇中 4. 计算每个簇分类的,查准率、查全率和F1指数python具体代码实现
时间: 2024-01-24 19:18:35 浏览: 25
由于数据集没有提供,以下代码仅为参考实现:
# 数据预处理
import jieba
import os
from sklearn.feature_extraction.text import TfidfVectorizer
folders = ['a', 'b', 'c', 'd', 'e']
docs = []
for folder in folders:
for i in range(1, 51):
with open(os.path.join('code', folder, str(i) + '.txt'), 'r', encoding='utf-8') as f:
text = f.read()
docs.append(text)
# 利用Jieba分词对每篇文档进行分词
docs_seg = []
for doc in docs:
doc_seg = jieba.cut(doc)
docs_seg.append(' '.join(doc_seg))
# 利用TF-ID对每篇文档提取关键特征词
vectorizer = TfidfVectorizer(use_idf=True)
X = vectorizer.fit_transform(docs_seg)
# 对预处理后的文档,从每个类别中随机选取40篇文档
import random
docs_index = [i for i in range(len(docs))]
random.shuffle(docs_index)
selected_docs_index = []
for i in range(5):
selected_docs_index += docs_index[i*50+10:i*50+50]
selected_docs = [docs[i] for i in selected_docs_index]
selected_docs_seg = [docs_seg[i] for i in selected_docs_index]
# 采用K-means算法,划分5个簇
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=5, init='k-means++')
clusters = kmeans.fit_predict(X[selected_docs_index])
# 计算FMI指数
from sklearn.metrics import fowlkes_mallows_score
fmi = fowlkes_mallows_score(clusters, [i // 40 for i in range(200)]) # 类别编号为0~4
print('FMI指数:', fmi)
# 画出聚类结果散点图
import numpy as np
import matplotlib.pyplot as plt
colors = ['r', 'g', 'b', 'c', 'm']
for i in range(5):
plt.scatter(X[clusters == i, 0], X[clusters == i, 1], s=50, c=colors[i], label='Cluster ' + str(i))
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, marker='*', c='black', label='Centroids')
plt.legend()
plt.show()
# 话题跟踪
remaining_docs_index = []
for i in range(5):
remaining_docs_index += docs_index[i*50:i*50+10]
remaining_docs = [docs[i] for i in remaining_docs_index]
remaining_docs_seg = [docs_seg[i] for i in remaining_docs_index]
# 将文档划分到距离最近的簇中
remaining_X = vectorizer.transform(remaining_docs_seg)
predicted_clusters = kmeans.predict(remaining_X)
# 计算查准率、查全率和F1指数
from sklearn.metrics import precision_recall_fscore_support
precision, recall, f1, _ = precision_recall_fscore_support([i // 10 for i in range(50)], predicted_clusters, average='weighted')
print('查准率:', precision)
print('查全率:', recall)
print('F1指数:', f1)