You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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次),这类整段重复的概率极低,因此被完全过滤,最终词汇表仅保留了带空格分隔的英文/符号词汇。

解决步骤

  1. 对中文文本进行分词预处理
    使用中文分词工具(如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')
    
  2. 使用分词后的文件重新训练
    修改训练代码的输入路径为分词后的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')
    
  3. 可选:优化参数适配中文
    中文子词特征可覆盖单字到多字词,建议调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:17:37