如何将DataFrame中列表格式的词列表转换为数值向量?
分词列表转模型可用数值格式方案
你已经提前完成分词步骤,不需要再重复做分词处理,根据后续选用的分类器类型,选对应的转换方法即可:
如果用传统机器学习分类器(逻辑回归、随机森林、SVM、XGBoost这类):优先选TF-IDF向量化
注意sklearn内置的TfidfVectorizer/CountVectorizer默认会对输入字符串做分词,你已经拿到分词列表了,只要自定义一个直通分析器跳过内置分词步骤,就能避免重复处理出错:from sklearn.feature_extraction.text import TfidfVectorizer # 自定义分析器,直接返回传入的分词列表 def pass_through(tokens): return tokens tfidf = TfidfVectorizer( analyzer=pass_through, min_df=2, # 过滤只在不到2条短信里出现的极稀有词 max_df=0.9, # 过滤在90%以上短信里都出现的无意义停用词 ngram_range=(1,2) # 加入二元词组,捕捉短信里的固定搭配,比如“验证码”“快递取件”这类 ) # 输出为稀疏矩阵格式,可以直接喂给所有兼容sklearn接口的传统分类器 X = tfidf.fit_transform(df['分词列名'])这个方案速度最快、可解释性强,对SMS这种短文本场景效果足够用,是做短信分类的首选基线方案。缺点是不保留词序、没有语义信息,无法适配深度模型。
如果用深度学习模型(TextCNN、BiLSTM这类):用词表映射+序列填充
这类模型需要输入固定长度的数字id序列,先基于全量分词构建词表,把每个词映射成唯一数字id,再把所有短信序列补到统一长度即可:from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences # 设定词表最大容量,未登录词统一标记为<OOV> tokenizer = Tokenizer(num_words=10000, oov_token="<OOV>") tokenizer.fit_on_texts(df['分词列名']) # 分词列表转id序列 seq = tokenizer.texts_to_sequences(df['分词列名']) # 统一序列长度,短信普遍偏短,max_len设为30-60就够用,长序列截断、短序列补0 X = pad_sequences(seq, maxlen=50, padding='post', truncating='post')后续可以在模型开头加Embedding层训练词向量,也可以直接加载预训练的Word2Vec、GloVe词向量初始化,进一步提升效果。
如果打算用预训练语言模型(BERT、ERNIE、DistilBERT这类):提前分好的词列表用不上
预训练模型有自己的子词分词逻辑,直接把原始未分词的短信文本传入对应模型的官方Tokenizer,输出的input_ids、attention_mask就可以直接喂给模型训练,不需要额外做格式转换。
额外注意:你要同时预测主类型和子类型属于多任务分类场景,标签列也需要分别用LabelEncoder转成从0开始的数字格式再输入模型。

内容的提问来源于stack exchange,提问作者aashish
相关产品推荐
相关产品推荐

