基于Python的文本分析:电影剧情文本聚类实战
文本聚类是自然语言处理(NLP)中的一项重要技术,它能够将相似的文档自动分组,帮助我们理解大量文本数据的内在结构。本文将基于电影剧情数据集,介绍如何使用Python实现文本聚类分析。
数据集准备与预处理
首先我们需要加载电影数据集,这个数据集包含电影标题和剧情简介(synopsis)两列:
import pandas as pd
import numpy as np
movie_data = pd.read_csv('movie_data.csv')
movie_titles = movie_data['Title'].tolist()
movie_synopses = movie_data['Synopsis'].tolist()
数据预处理是文本分析的关键步骤,我们需要对原始文本进行标准化处理:
from normalization import normalize_corpus
from utils import build_feature_matrix
# 文本标准化处理
norm_movie_synopses = normalize_corpus(movie_synopses,
lemmatize=True,
only_text_chars=True)
标准化处理包括词形还原(lemmatization)、去除特殊字符等操作,这能帮助我们减少词汇的变体形式,提高后续分析的准确性。
特征提取
文本数据需要转换为数值特征才能用于机器学习算法。这里我们使用TF-IDF方法提取特征:
# 提取TF-IDF特征
vectorizer, feature_matrix = build_feature_matrix(norm_movie_synopses,
feature_type='tfidf',
min_df=0.24, max_df=0.85,
ngram_range=(1, 2))
参数说明:
min_df=0.24:忽略在少于24%文档中出现的词max_df=0.85:忽略在超过85%文档中出现的词ngram_range=(1,2):同时考虑单个词和双词组合
这种设置可以过滤掉过于常见和过于罕见的词汇,保留有区分度的特征。
K-Means聚类
K-Means是最常用的聚类算法之一,实现简单且效果良好:
from sklearn.cluster import KMeans
def k_means(feature_matrix, num_clusters=5):
km = KMeans(n_clusters=num_clusters,
max_iter=10000)
km.fit(feature_matrix)
clusters = km.labels_
return km, clusters
num_clusters = 5
km_obj, clusters = k_means(feature_matrix=feature_matrix,
num_clusters=num_clusters)
movie_data['Cluster'] = clusters
我们设置聚类数为5,并将聚类结果添加到原始数据中。
聚类结果分析
为了更好地理解聚类结果,我们可以查看每个簇的关键特征和包含的电影:
def get_cluster_data(clustering_obj, movie_data,
feature_names, num_clusters,
topn_features=10):
# 实现细节略...
def print_cluster_data(cluster_data):
# 实现细节略...
cluster_data = get_cluster_data(clustering_obj=km_obj,
movie_data=movie_data,
feature_names=feature_names,
num_clusters=num_clusters,
topn_features=5)
print_cluster_data(cluster_data)
这将输出每个簇的5个最具代表性的特征和属于该簇的电影列表,帮助我们理解每个簇的主题。
可视化展示
文本数据的可视化可以帮助我们直观地理解聚类效果:
import matplotlib.pyplot as plt
from sklearn.manifold import MDS
from sklearn.metrics.pairwise import cosine_similarity
def plot_clusters(num_clusters, feature_matrix,
cluster_data, movie_data,
plot_size=(16,8)):
# 实现细节略...
plot_clusters(num_clusters=num_clusters,
feature_matrix=feature_matrix,
cluster_data=cluster_data,
movie_data=movie_data,
plot_size=(16,8))
这里使用了多维缩放(MDS)技术将高维特征降维到2D空间,并用不同颜色和标记表示不同簇。
其他聚类方法
除了K-Means,我们还尝试了其他两种聚类算法:
1. Affinity Propagation(近邻传播)
from sklearn.cluster import AffinityPropagation
def affinity_propagation(feature_matrix):
sim = feature_matrix * feature_matrix.T
sim = sim.todense()
ap = AffinityPropagation()
ap.fit(sim)
clusters = ap.labels_
return ap, clusters
ap_obj, clusters = affinity_propagation(feature_matrix=feature_matrix)
近邻传播算法不需要预先指定簇的数量,它会自动确定合适的簇数。
2. 层次聚类
from scipy.cluster.hierarchy import ward, dendrogram
def ward_hierarchical_clustering(feature_matrix):
cosine_distance = 1 - cosine_similarity(feature_matrix)
linkage_matrix = ward(cosine_distance)
return linkage_matrix
def plot_hierarchical_clusters(linkage_matrix, movie_data, figure_size=(8,12)):
# 实现细节略...
linkage_matrix = ward_hierarchical_clustering(feature_matrix)
plot_hierarchical_clusters(linkage_matrix=linkage_matrix,
movie_data=movie_data,
figure_size=(8,10))
层次聚类生成树状图(dendrogram),可以直观地展示文档之间的相似性和聚类过程。
实际应用与思考
文本聚类在实际应用中有广泛用途:
- 电影推荐系统:通过聚类分析,可以发现具有相似剧情的电影,为用户推荐可能感兴趣的内容
- 文档管理:自动组织大量文档,提高信息检索效率
- 市场研究:分析客户反馈,发现共同主题和关注点
在实践中需要注意:
- 不同聚类算法适用于不同场景,需要根据数据特点选择合适的算法
- 文本预处理对结果影响很大,需要仔细调整参数
- 聚类数量的确定可以结合领域知识和评估指标
通过本教程,我们学习了如何使用Python实现文本聚类分析,从数据预处理到多种聚类算法的应用,再到结果的可视化展示。这些技术可以广泛应用于各种文本分析场景。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



