如何将含分词句子的Pandas数据集输入Word2Vec生成词嵌入用于SVM情感识别
分词数据转词嵌入并用于SVM情感识别的实现步骤
1. 从Pandas数据框提取Word2Vec训练语料
假设你的数据框中,存储分词句子的列名为tokenized_text(每个单元格是一个分词后的列表,比如['这部', '电影', '很', '精彩']),先把所有句子提取为嵌套列表格式——这是Word2Vec模型要求的输入格式:
corpus = df['tokenized_text'].tolist()
2. 训练Word2Vec词嵌入模型
用gensim库的Word2Vec类训练自定义词向量,参数可根据数据集规模和需求调整:
from gensim.models import Word2Vec # 初始化并训练模型 w2v_model = Word2Vec( sentences=corpus, vector_size=128, # 词向量维度,常用100/128/256 window=5, # 上下文窗口大小,即当前词前后各5个词 min_count=2, # 忽略出现次数少于2的低频词,减少噪声 workers=4 # 并行训练的线程数,加快训练速度 )
训练完成后,可通过w2v_model.wv['词']获取单个词的向量。
3. 将分词句子转换为固定维度的句子嵌入
SVM需要固定长度的输入特征,因此要把每个分词句子转换成一个统一维度的向量,最常用的方法是平均词向量:
import numpy as np def build_sentence_vec(tokens, model): # 收集句子中所有在模型词表内的词向量 valid_vecs = [model.wv[token] for token in tokens if token in model.wv] # 若句子无有效词,返回零向量;否则返回平均向量 return np.mean(valid_vecs, axis=0) if valid_vecs else np.zeros(model.vector_size) # 给数据框添加句子嵌入列 df['sent_embedding'] = df['tokenized_text'].apply(lambda x: build_sentence_vec(x, w2v_model)) # 转换为SVM可直接使用的特征矩阵和标签数组 X = np.array(df['sent_embedding'].tolist()) y = df['sentiment_label'].values # 假设情感标签列名为sentiment_label
如果追求更好的效果,也可以用TF-IDF加权平均向量——给重要性高的词赋予更高权重。
4. 用生成的嵌入训练SVM模型
直接使用sklearn的SVM模块训练即可:
from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 训练SVM分类器 svm_clf = SVC(kernel='rbf') # 常用RBF核,可根据情况调整为linear svm_clf.fit(X_train, y_train) # 评估模型 y_pred = svm_clf.predict(X_test) print(f"测试集准确率: {accuracy_score(y_test, y_pred):.2f}")
额外建议
- 若数据集规模较小,不建议自定义训练Word2Vec,可直接使用预训练词嵌入(如中文的腾讯AI Lab词向量、英文的Google News词向量),加载后直接复用上述句子向量生成逻辑即可。
- 也可以用
Doc2Vec模型(Word2Vec的扩展)直接生成句子级嵌入,无需手动计算平均向量,适合长文本场景。
内容的提问来源于stack exchange,提问作者Rodrigo Lemos
相关产品推荐
相关产品推荐

