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

如何在Python中使用Gensim预处理数据时保留重要数字?

解决Gensim simple_preprocess过滤数字的问题:将数字转为单词形式

我之前也碰到过一模一样的问题——gensim.utils.simple_preprocess 默认会过滤短数字,甚至把一些重要的编号类数字当作非核心token剔除,确实挺闹心的。要把众议院决议编号、法案编号这类数字转成单词形式保留下来,咱们可以借助 num2words 库轻松实现,下面给你两种实用方案:

方法一:先全局替换数字为单词,再用simple_preprocess处理

这种思路是先把文本里所有数字一次性转成对应语言的单词,再交给simple_preprocess做后续分词、清洗,优点是能覆盖所有数字场景,包括嵌在文本中间的编号。

步骤1:安装依赖库

首先得装 num2words,它支持多语言数字转单词,中文也完全适配:

pip install num2words

步骤2:编写自定义预处理函数

import re
from num2words import num2words
from gensim.utils import simple_preprocess

def preprocess_with_number_conversion(sentence):
    # 定义数字替换逻辑,支持整数和小数
    def replace_num(match_obj):
        num_str = match_obj.group(0)
        try:
            # 先尝试转整数,中文指定lang='zh'
            return num2words(int(num_str), lang='zh')
        except ValueError:
            try:
                # 转小数
                return num2words(float(num_str), lang='zh')
            except ValueError:
                # 不是有效数字就返回原内容
                return num_str
    
    # 用正则匹配所有数字(整数、小数)并替换
    processed_text = re.sub(r'\d+(\.\d+)?', replace_num, sentence)
    # 调用simple_preprocess,调整min_len避免过滤短单词
    return simple_preprocess(processed_text, min_len=1)

测试示例

比如输入文本:"众议院决议123号,法案45.6",调用函数后会得到:

['众议院', '决议', '一百二十三', '号', '法案', '四十五', '点', '六']

方法二:分词后单独处理数字token

如果不想全局替换,也可以先让simple_preprocess完成分词,再对每个token判断是否为数字,针对性转成单词。这种方法更灵活,适合只处理纯数字token的场景:

import re
from num2words import num2words
from gensim.utils import simple_preprocess

def preprocess_token_level_conversion(sentence):
    # 先获取simple_preprocess的原始token
    raw_tokens = simple_preprocess(sentence, min_len=1)
    processed_tokens = []
    
    for token in raw_tokens:
        # 判断是否是整数
        if token.isdigit():
            try:
                # 转成中文单词后作为单个token保留
                processed_tokens.append(num2words(int(token), lang='zh'))
            except:
                processed_tokens.append(token)
        # 判断是否是小数
        elif re.match(r'^\d+\.\d+$', token):
            try:
                processed_tokens.append(num2words(float(token), lang='zh'))
            except:
                processed_tokens.append(token)
        else:
            processed_tokens.append(token)
    
    return processed_tokens

额外提示

  • 如果你处理的是英文文本,只需要把 lang='zh' 改成 lang='en',num2words会自动转成英文数字单词(比如123→"one hundred twenty three")
  • 如果只是想保留数字字符串而非转成单词,直接修改simple_preprocess的min_len=1参数,或者用gensim的tokenize函数自定义过滤规则即可,但这不符合你的需求,就不展开了

内容的提问来源于stack exchange,提问作者piñatabreaker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:07:51