如何使用Word2Vec实现文本分类?附词向量生成代码及输出
基于Word2Vec词向量实现文本分类的完整步骤
看起来你已经成功训练出了Word2Vec词向量,接下来要完成文本分类,核心是把单个词的向量转换成文本级别的向量表示,再结合分类模型进行训练。下面是具体的实现步骤:
1. 将文本转换为句子/文档向量
Word2Vec给出的是单个词的向量,而分类模型需要的是整个文本的特征向量。最常用的方法是平均词向量(简单易实现,效果也不错),当然也可以用加权平均等进阶方法。
代码实现:文本转向量函数
import numpy as np from gensim.models import Word2Vec # 假设你的Word2Vec模型已经训练完成(就是你代码里的`model`) def text_to_sentence_vector(text, word2vec_model, vector_dim=4): # 拆分文本为单词 words = text.split() # 收集文本中存在于词表中的词向量 valid_vectors = [] for word in words: if word in word2vec_model.wv.vocab: valid_vectors.append(word2vec_model.wv[word]) # 如果文本里没有词在词表中,返回零向量 if not valid_vectors: return np.zeros(vector_dim) # 对所有词向量取平均,得到句子向量 return np.mean(valid_vectors, axis=0) # 测试:用你之前的sentences列表中的文本 sample_text = sentences[0] sample_vector = text_to_sentence_vector(sample_text, model) print("句子向量:", sample_vector)
2. 准备带标签的分类数据集
你需要有带标签的文本数据(比如每个文本对应一个分类标签,比如0/1代表正负情感,或者多分类的类别ID)。把所有文本转换成向量后,划分训练集和测试集:
# 假设你有如下格式的数据集: texts = ["我喜欢这个产品", "这个服务很差劲", "性价比很高", ...] # 你的文本列表 labels = [1, 0, 1, ...] # 对应的标签(示例为二分类) # 把所有文本转换成向量 X = np.array([text_to_sentence_vector(text, model) for text in texts]) y = np.array(labels) # 划分训练集和测试集 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
3. 训练分类模型
现在有了结构化的特征(X)和标签(y),可以用任何经典分类模型或者神经网络来训练。这里给出两个常用的示例:
示例1:逻辑回归(轻量高效,适合小数据集)
from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report # 初始化并训练模型 classifier = LogisticRegression() classifier.fit(X_train, y_train) # 预测测试集 y_pred = classifier.predict(X_test) # 评估模型效果 print(f"测试集准确率: {accuracy_score(y_test, y_pred):.2f}") print("\n分类报告:\n", classification_report(y_test, y_pred))
示例2:神经网络(适合大数据集,可挖掘复杂特征)
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense # 构建简单的全连接神经网络 classification_model = Sequential([ Dense(16, activation='relu', input_shape=(4,)), # 输入维度对应词向量的size=4 Dense(8, activation='relu'), Dense(1, activation='sigmoid') # 二分类用sigmoid,多分类请改为softmax并调整输出维度 ]) # 编译模型 classification_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 训练模型 classification_model.fit(X_train, y_train, epochs=10, batch_size=4, validation_split=0.1) # 评估测试集 test_loss, test_acc = classification_model.evaluate(X_test, y_test) print(f"测试集准确率: {test_acc:.2f}")
一些优化建议
- 提升词向量质量:你当前设置的词向量维度
size=4太小了,实际应用中建议设置为100、200或300维(Gensim新版本参数为vector_size),这样能更好地捕捉单词的语义信息。 - 文本预处理:在训练Word2Vec之前,建议对文本做预处理(小写化、去除标点、停用词等),能有效提升词向量和分类模型的效果。
- 加权平均向量:如果想比简单平均效果更好,可以用TF-IDF权重对词向量进行加权,给重要的词更高的权重再计算平均。
- 预训练词向量:如果你的数据集很小,可以直接使用公开的预训练Word2Vec模型,这类模型的语义表示能力更强。
内容的提问来源于stack exchange,提问作者Shubham Agrawal
相关产品推荐
相关产品推荐

