FastText无监督训练无法识别中文词汇问题求助
问题描述
使用FastText进行无监督训练时,训练数据data.train包含5万行、共170万汉字,但训练后词汇表未识别任何中文字符,仅返回少量英文及符号类词汇。
训练代码
import fasttext model = fasttext.train_unsupervised(input='data.train', model='cbow', dim=300, epoch=10, neg=10, minn=2, minCount=20) model.save_model('data.bin')
训练输出
Read 0M words Number of words: 21 Number of labels: 0 Progress: 100.0% words/sec/thread: 254151 lr: 0.000000 avg.loss: 4.173459 ETA: 0h 0m 0s
词汇表结果
print(model.words) ['</s>', 'd', 'btw', '=', 'iphone', 'in', 'post', '/', '3', '-']
样本数据示例
我是一個小蘋果 你好嗎?今天天氣很好 我是一個小男孩 我有一部新 iphone
预期能识别出“天氣”“男孩”“蘋果”“今天”“iphone”等词汇,但实际未提取任何中文字符。
问题原因与解决方法
核心原因
FastText默认以空格作为分词分隔符,而中文文本没有天然的空格分隔,导致FastText将整段中文视为单个“词”。结合你设置的minCount=20(要求词出现至少20次),这类整段重复的概率极低,因此被完全过滤,最终词汇表仅保留了带空格分隔的英文/符号词汇。
解决步骤
对中文文本进行分词预处理
使用中文分词工具(如jieba)将每个句子拆分为空格分隔的词语,生成新的训练文件:import jieba # 读取原始训练数据 with open('data.train', 'r', encoding='utf-8') as f: lines = f.readlines() # 分词并保存为分词后的训练文件 with open('data_cut.train', 'w', encoding='utf-8') as f: for line in lines: cut_line = ' '.join(jieba.cut(line.strip())) f.write(cut_line + '\n')使用分词后的文件重新训练
修改训练代码的输入路径为分词后的data_cut.train:import fasttext model = fasttext.train_unsupervised(input='data_cut.train', model='cbow', dim=300, epoch=10, neg=10, minn=2, minCount=20) model.save_model('data_cut.bin')可选:优化参数适配中文
中文子词特征可覆盖单字到多字词,建议调整minn和maxn参数,帮助模型学习更丰富的中文语义特征:model = fasttext.train_unsupervised(input='data_cut.train', model='cbow', dim=300, epoch=10, neg=10, minn=1, maxn=4, minCount=20)
内容的提问来源于stack exchange,提问作者Raptor
相关产品推荐
相关产品推荐

