87 lines
1.9 KiB
Python
87 lines
1.9 KiB
Python
"""文本分类 baseline"""
|
|
from sklearn.feature_extraction.text import TfidfVectorizer
|
|
from sklearn.svm import LinearSVC
|
|
from sklearn.model_selection import train_test_split
|
|
from sklearn.metrics import accuracy_score, classification_report
|
|
|
|
|
|
# 1. 数据
|
|
texts = [
|
|
"我要申请退款",
|
|
"这个订单可以退款吗",
|
|
"钱什么时候退回来",
|
|
"我要取消订单退款",
|
|
"商品有问题申请退款",
|
|
"怎么退货退款",
|
|
|
|
"我的密码忘记了",
|
|
"怎么修改登录密码",
|
|
"账号登录不上去了",
|
|
"如何重置密码",
|
|
"账户无法登录",
|
|
"密码在哪里修改",
|
|
|
|
"快递什么时候到",
|
|
"物流怎么还没更新",
|
|
"我的包裹到哪里了",
|
|
"查询一下配送进度",
|
|
"快递一直没有收到",
|
|
"帮我查一下物流"
|
|
]
|
|
|
|
labels = [
|
|
"refund", "refund", "refund",
|
|
"refund", "refund", "refund",
|
|
|
|
"account", "account", "account",
|
|
"account", "account", "account",
|
|
|
|
"delivery", "delivery", "delivery",
|
|
"delivery", "delivery", "delivery"
|
|
]
|
|
|
|
|
|
# 2. 切分训练集 / 验证集
|
|
X_train, X_val, y_train, y_val = train_test_split(
|
|
texts,
|
|
labels,
|
|
test_size=0.33,
|
|
random_state=42,
|
|
stratify=labels
|
|
)
|
|
|
|
|
|
# 3. 文本 -> TF-IDF 稀疏向量
|
|
vectorizer = TfidfVectorizer(
|
|
analyzer="char",
|
|
ngram_range=(1, 3)
|
|
)
|
|
|
|
X_train_vec = vectorizer.fit_transform(X_train)
|
|
X_val_vec = vectorizer.transform(X_val)
|
|
|
|
|
|
# 4. 训练分类器
|
|
model = LinearSVC(C=1.0)
|
|
model.fit(X_train_vec, y_train)
|
|
|
|
|
|
# 5. 验证
|
|
pred = model.predict(X_val_vec)
|
|
|
|
print("accuracy:", accuracy_score(y_val, pred))
|
|
print(classification_report(y_val, pred))
|
|
|
|
|
|
# 6. 推理
|
|
test_texts = [
|
|
"我的东西怎么还没送过来",
|
|
"登录密码忘了怎么办",
|
|
"我要把这个订单退掉"
|
|
]
|
|
|
|
X_test = vectorizer.transform(test_texts)
|
|
pred = model.predict(X_test)
|
|
|
|
for text, label in zip(test_texts, pred):
|
|
print(text, "->", label) |