如何在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
相关产品推荐
相关产品推荐

