如何将FastText输出的词向量输入神经网络用于电影类型分类
方案可行性结论
通过FastText获取词向量后输入神经网络完成电影类型分类的方案是完全可行的,相比常规的TF-IDF输入方案,FastText词向量能保留词语的语义关联信息,在分类任务上通常能取得更好的效果。
现有代码的问题
你当前的FastText训练语料使用了movies_new['genre_new']即电影类型标签数据,而非电影剧情/摘要语料,才会出现输入整段剧情文本时,返回的相似结果都是电影题材标签的异常输出,不符合分类任务的前置要求。
正确实现流程
- 第一步:调整FastText训练语料,替换为全量的电影剧情/摘要文本,训练得到适配当前任务场景的词向量表,原有FastText的维度、窗口等参数可根据效果迭代调整。如果你的剧情语料规模较小,也可以直接加载FastText官方预训练的对应语言词向量,无需自行训练,效果更稳定。
- 第二步:将单条电影剧情文本转换为可输入神经网络的固定格式,常见转换方式有两类:
- 平均池化句向量:将文本中所有有效词的FastText向量取平均值,作为整条文本的向量表示,可直接输入全连接神经网络训练,实现成本最低
- 序列矩阵:将文本中每个词的向量按语序拼接为二维矩阵,输入CNN、LSTM等可处理序列特征的神经网络,能捕获语序关联,分类精度通常更高
- 第三步:根据任务是单标签分类(一部电影仅对应一个类型)还是多标签分类(一部电影可对应多个类型),选择对应输出层激活函数与损失函数即可:单标签用softmax激活+多分类交叉熵损失,多标签用sigmoid激活+二分类交叉熵损失。
示例代码
import numpy as np # 文本转平均池化句向量 def get_text_vector(text, ft_model, vec_dim=100): word_list = text.strip().split() # 筛选词向量表中存在的词 valid_vecs = [ft_model.wv[word] for word in word_list if word in ft_model.wv] if not valid_vecs: return np.zeros(vec_dim) # 取平均得到句向量 return np.mean(valid_vecs, axis=0) # 构造训练集特征和标签 train_X = np.array([get_text_vector(plot, model_ted) for plot in movies_new['plot_content']]) # 标签需提前做编码处理,单标签做LabelEncoder,多标签做MultiLabelBinarizer train_y = movies_new['encoded_genre'].values
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

