在构建中文文本分类系统时,首先需对原始文本进行预处理。利用jieba库对每条文本进行分词,并以空格连接各词语形成标准输入格式。每个样本独占一行,标签以双下划线标记,如 __label__A,表示类别A。
示例数据如下:
邱县 继刚 家庭 农场 小麦 、 玉米 、 棉花 、 大豆 、 蔬菜 、 苗木 种植 、 销售 ( 依法 须 经 批准 的 项目 , 经 相关 部门 批准 后方 可 开展 经营 活动 ) __label__A
江苏 嘉利欣 农业 科技 有限公司 农业 科技 研发 、 转让 、 咨询服务 展览 展示 服务 现代农业 休闲 观光 种植 、 销售 粮食 、 果蔬 、 花卉 、 苗木 种植 中草药 销售 本 公司 种植 的 中草药 ( 特殊 中草药 除外 ) 养殖 、 销售 鱼 、 虾 、 螃蟹 ( 依法 须 经 批准 的 项目 , 经 相关 部门 批准 后方 可 开展 经营 活动 ) __label__B
赞皇县 和谐 家庭 农场 农作物 果树 蔬菜 种植 销售 需 有关 部门 审批 的 审批 后 经营 __label__C
深圳市 修元 农业 开发 有限公司 农业 开发 、 绿化 工程 、 苗圃 种植 __label__A
接下来通过Pandas读取原始数据并完成标签映射与分词处理。将公司名称与经营范围合并后,按空格拼接,并附加标签信息,生成训练文件。
# 数据读取
train_data = pd.read_csv('./industry_dalei_train.txt', encoding='utf-8')
label_map = pd.read_excel('./industry_standard.xlsx', encoding='utf-8')
label_dict = dict(zip(label_map['大类名称'], label_map['大类编号']))
# 标签映射与分词
train_data['label_code'] = train_data['sub_industry_name'].map(label_dict)
train_data['tokenized_name'] = train_data['name'].apply(lambda x: ' '.join(jieba.cut(x)))
train_data['tokenized_business'] = train_data['business'].apply(lambda x: ' '.join(jieba.cut(x)))
train_data['processed_text'] = train_data['tokenized_name'] + ' ' + train_data['tokenized_business'] + ' __label__' + train_data['label_code'].astype(str)
# 输出训练集
train_data['processed_text'].to_csv('fasttext_train_input.txt', index=False, header=False, encoding='utf-8')
安装FastText后,可直接使用其监督学习接口训练模型。训练完成后保存为二进制文件,便于后续加载和推理。
# 模型训练
model = fasttext.supervised(
input_file='fasttext_train_input.txt',
output_model='models/industry_classifier.bin',
dim=100,
epoch=25,
lr=1.0,
wordNgrams=2,
minCount=1,
verbose=2
)
# 加载已训练模型
loaded_model = fasttext.load_model('models/industry_classifier.bin')
# 评估测试集表现
test_result = loaded_model.test('./fasttext_test_input.txt')
print(f"准确率: {test_result[0]:.4f}, 召回率: {test_result[1]:.4f}")
# 实际预测调用
sample_texts = ['深圳农业科技研发', '河北家庭农场种植']
predictions = loaded_model.predict(sample_texts, k=1)
probabilities = loaded_model.predict_proba(sample_texts, k=3)