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

Gensim FastText/Word2vec如何设置10万高频词词表并保留指定词?

实现方案

你可以通过手动控制词表修剪的方式同时满足两个需求,具体操作如下:

1. 读取指定保留词列表

读取list.txt中的词,注意和你的语料预处理逻辑保持一致(你预处理时转了小写,所以读取时也统一转小写避免匹配失败):

with open("list.txt", "r", encoding="utf-8") as f:
    keep_words = [line.strip().lower() for line in f if line.strip()]

2. 调整词表构建逻辑

核心思路是先扫描全量语料获取所有词的频次,再优先保留指定词,再补充高频词凑够10万的词表规模,最后用自定义规则修剪词表:

from gensim.models import FastText

# 你的paragraph_generator类保持不变
class paragraph_generator(object):
    def __init__(self,test=True,itersize=10000,year=None,state=None):
        self.test=test
        self.itersize=itersize
        self.sql = f"""
        SELECT
            text_id,
            lccn_sn,
            date,
            ed,
            chroniclingamerica_meta.statefp,
            chroniclingamerica_meta.countyfp,
            text_ocr
        FROM
            chroniclingamerica natural join chroniclingamerica_meta
        WHERE date_part('year',date) BETWEEN 1870 AND 1920 
        AND  seq = 1 """
        if self.test:
            self.sql = self.sql+' limit 10000'
        print(self.sql)
    def __iter__(self):
        con, cur = database_connection.connect(cursor_type='server')
        cur.itersize = self.itersize
        cur.execute(self.sql)
        for p in cur.fetchall():
            tokens = p[-1].translate(str.maketrans('', '', punct)).replace('\n',' ').lower().split(' ')
            yield tokens
        con.close()

# 初始化模型,min_count设为1避免提前过滤掉低频次的保留词
model = FastText(vector_size=256, window=8, min_count=1, epochs=1, workers=workers)
sentences = paragraph_generator(test=False, itersize=10000, year=None, state=None)
# 第一次扫描语料,获取全量词的频次统计
model.build_vocab(sentences)

# 按频次从高到低排序所有词
all_word_with_count = [(word, vocab.count) for word, vocab in model.wv.key_to_index.items()]
all_word_with_count.sort(key=lambda x: x[1], reverse=True)

# 构造最终保留词集合,优先保留指定词
keep_set = set(keep_words)
max_vocab_size = 100000
# 补充高频普通词直到词表规模达到10万
need_fill = max_vocab_size - len(keep_set)
for word, count in all_word_with_count:
    if need_fill <= 0:
        break
    if word not in keep_set:
        keep_set.add(word)
        need_fill -= 1

# 自定义修剪规则:只保留我们筛选出的词
def vocab_trim_rule(word, count, min_count):
    return word in keep_set

# 重新构建词表,应用修剪规则
model.build_vocab(sentences, trim_rule=vocab_trim_rule, update=False)

# 正常训练模型
model.train(sentences, total_examples=model.corpus_count, epochs=1)

注意事项

  • 如果list.txt中的词未出现在语料中,FastText原生支持OOV词的向量生成,你后续仍可获取这些词的向量;如果需要这些词的语义参与训练,可以在预处理时把这些词随机插入到部分训练句中。
  • 如果指定保留词的数量超过10万,上述逻辑会优先全量保留指定词,总词表规模会超过10万,你可以根据需求调整规则,比如对保留词按频次排序后截取前部分。
  • 需保证list.txt中的词和你分词后的词格式完全匹配,比如不要包含空格、特殊符号,大小写一致。

内容的提问来源于stack exchange,提问作者astampib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:36:03