Author InformationName: Shutter Zor(左祥太)Email: Shutter_Z@outlook.com
目录
0 引言
相信大家在最近的文章当中都发现了不少使用大语言模型做文本分类的内容。
具体而言,如果你想对海量文本进行分类处理,但受限于人工阅读的客观限制,就可能需要使用相关的语言模型进行处理。
1 举个例子
假设你现在需要处理 100 份上市公司年报,那么你需要遵循如下步骤:
- 分割成 10000 条详细的句子,因为大语言模型的输入 token 有限,这样比较保险。
- 随机抽取一部分,比如 1000 条进行人工阅读并标记。如属于“数字化转型”的标记为 1,不属于的标记为 0。
- 将 1000 条分类成 700 条的训练集与 300 条的验证集。
- 对 700 条训练集数据(利用大语言模型)进行嵌入向量的计算。
- 使用基于大语言模型的相似度计算或者其他机器学习算法预测 300 条验证集的结果,并获取准确度指标。
- 使用合适的算法对剩下 9000 条未标注样本进行标注。
在这个过程中,你可以使用一些微调的方法重新训练一下这个大语言模型,但通常来讲训练集文本较少的话,对最终结果的影响微乎其微。
不妨直接考虑使用“表现较好的大语言模型”+“机器学习分类算法”的组合,省时省力效果好。
2 一些代码
import pandas as pdimport numpy as npfrom sentence_transformers import SentenceTransformerfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import classification_report, accuracy_score# 1. 配置与模型加载MODEL_NAME = './Qwen3-Embedding-0.6B'print(f"正在加载模型: {MODEL_NAME} ...")model = SentenceTransformer(MODEL_NAME)# 2. 读取数据df = pd.read_csv("Full_100.csv")X_raw = df['text'].tolist()y = df['label'].values# 3. 提取向量特征 (Embedding)# 为 Qwen-instruct 提供指令前缀,能显著提升分类效果defget_qwen_embeddings(texts):# 针对分类任务的指令 instruction = "判断相关文本是否属于固定资产类型,以便进行准确的文本分类:"# 拼接指令 full_texts = [f"{instruction}{t}"for t in texts]return model.encode(full_texts, batch_size=16, show_progress_bar=True)print("正在提取 100 条数据的向量特征...")X_embeddings = get_qwen_embeddings(X_raw)# 4. 划分数据集 (70% 训练, 30% 验证)X_train, X_test, y_train, y_test = train_test_split( X_embeddings, y, test_size=0.3, random_state=42, stratify=y)# 5. 训练分类器 KNN-1# 使用逻辑回归,并开启 class_weight='balanced' 以处理可能的类别轻微不平衡clf = LogisticRegression(C=1.0, class_weight='balanced', max_iter=1000)clf.fit(X_train, y_train)# 6. 验证集评估y_pred = clf.predict(X_test)print("\n--- 验证集评估报告 (30条数据) ---")print(classification_report(y_test, y_pred, target_names=['其他类型 (0)', '固定资产 (1)']))print(f"总体准确率: {accuracy_score(y_test, y_pred):.2%}")
查看评估结果:
--- 验证集评估报告 (30条数据) --- precision recall f1-score support 其他类型 (0) 0.720.930.8114 固定资产 (1) 0.920.690.7916 accuracy 0.8030 macro avg 0.820.810.8030weighted avg 0.830.800.8030总体准确率: 80.00%
简单推理:
# 7. 应用于海量未标注数据 (假设你有一个列表 unlabeled_list)defpredict_new_data(new_texts): print(f"正在处理 {len(new_texts)} 条新数据...") new_embeddings = get_qwen_embeddings(new_texts) preds = clf.predict(new_embeddings)# 获取置信度 probs = clf.predict_proba(new_embeddings).max(axis=1)return preds, probs# 示例预测sample_unlabeled = ["某某大学办公家具采购合同。办公桌椅。木质家具", "某某局网络安全等级保护测评服务定点采购合同"]labels, confidences = predict_new_data(sample_unlabeled)for txt, lab, conf in zip(sample_unlabeled, labels, confidences): print(f"预测结果: {'实物'if lab==1else'服务'} | 置信度: {conf:.4f} | 文本: {txt[:30]}...")
推理结果:
正在处理 2 条新数据...Batches: 100%|██████████| 1/1 [00:00<00:00, 1.93it/s]预测结果: 实物 | 置信度: 0.6079 | 文本: 某某大学办公家具采购合同。办公桌椅。木质家具...预测结果: 服务 | 置信度: 0.5475 | 文本: 某某局网络安全等级保护测评服务定点采购合同...
3 小结
整体来说其预测结果还是比较准确的。当然,在本例中使用了逻辑分类,但经过测试,使用随机森林分类器会得到更好的结果。
不难发现,在文章中具体使用何种语言模型、何种机器学习算法,都需要更详细的讨论。学而不思则罔,思而不学则殆。
如果想使用更大的语言模型,比如 ERNIE、DeepSeek、GPT 等,在本地运行估计是不大可能的,就只能寄希望于一些提供相关计算服务的互联网企业。当然,成本会提升很多个数量级。