基于Python与Scikit-learn的双文本特征Logistic regression实现咨询
双文本特征场景下TFIDF+逻辑回归实现方案
核心思路
TFIDF本身确实是针对单文本序列设计的特征提取工具,双文本场景下无需修改TFIDF的底层逻辑,分别对两个文本特征做独立的TFIDF向量化,再将得到的两个特征矩阵横向拼接为总特征矩阵,输入逻辑回归训练即可。
Scikit-learn中的ColumnTransformer工具可以自动完成按列拆分特征、分别处理、结果拼接的全流程,无需手动处理矩阵运算。
完整可运行代码
import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 1. 加载样例数据 data = [ ["Lorem ipsum dolor sit amet", "consectetur adipiscing elit", 0], ["Proin venenatis", "est sit amet rhoncus efficitur", 1], ["non bibendum massa nulla nec nulla", "Quisque sit amet suscipit ligula", 1], ["Quisque aliquet lacus non nibh elementum faucibus", "posuere, justo eget malesuada porta", 0], ["justo sem vestibulum felis", "ac facilisis ante nulla a justo", 1] ] df = pd.DataFrame(data, columns=["Feature_A", "Feature_B", "Label"]) X = df[["Feature_A", "Feature_B"]] y = df["Label"] # 2. 拆分训练集测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 3. 构造模型流水线 # 分别为两个文本列配置独立的TFIDF向量器,可根据两个文本的特性单独调整参数 preprocessor = ColumnTransformer( transformers=[ ('tfidf_a', TfidfVectorizer(stop_words='english', ngram_range=(1,2)), 'Feature_A'), ('tfidf_b', TfidfVectorizer(stop_words='english', ngram_range=(1,2)), 'Feature_B') ]) # 拼接向量化模块和逻辑回归分类器 model = Pipeline(steps=[ ('preprocessor', preprocessor), ('classifier', LogisticRegression()) ]) # 4. 训练与评估 model.fit(X_train, y_train) y_pred = model.predict(X_test) print(f"模型准确率: {accuracy_score(y_test, y_pred):.2f}")
可选优化方案
- 若两个文本特征属于同域文本(比如都是用户评论),也可以先将两个文本列拼接为单个字符串列,再用一个TFIDF处理,代码更简洁,但灵活度低于分开处理的方案
- 可以针对两个文本的长度、领域特性单独调整对应的TFIDF参数,比如短文本可以调小max_df阈值、启用ngram,长文本可以增加max_features限制维度
- 如果后续需要加入数值、类别等非文本特征,直接在
ColumnTransformer中新增对应列的处理逻辑即可,扩展成本极低
内容的提问来源于stack exchange,提问作者StudentAsker
相关产品推荐
相关产品推荐

