为何Python词袋模型会忽略列名中的正负号?如何修复?
问题描述
我有一个文本型DataFrame,结构如下:
RepID, Txt 1, +83 -193 -380 +55 +901 2, -94 +44 +2892 -60 3, +7010 -3840 +3993
其中Txt字段中的+282、-829等值均为字符串类型,而非数值类型。
使用以下词袋模型函数时:
def BOW(df): CountVec = CountVectorizer() # to use only bigrams ngram_range=(2,2) Count_data = CountVec.fit_transform(df) Count_data = Count_data.astype(np.uint8) cv_dataframe=pd.DataFrame(Count_data.toarray(), columns=CountVec.get_feature_names_out(), index=df.index) # <- HERE return cv_dataframe.astype(np.uint8)
得到的结果列名丢失了正负号(+或-),实际输出:
RepID 83 193 380 55 ... 1 1 1 1 1 2 0 0 0 0
预期输出应为:
RepID +83 -193 -380 +55 ... 1 1 1 1 1 2 0 0 0 0
原因分析
CountVectorizer默认的分词规则(由token_pattern参数控制)是(?u)\\b\\w\\w+\\b,这个正则表达式只会匹配由字母数字组成的"单词",会把+、-这类非字母数字开头的符号当作分隔符过滤掉,导致提取出的特征名丢失了正负号。
修复方案
修改CountVectorizer的token_pattern参数,让它能识别包含开头+或-的数值字符串。同时注意要明确传入Txt列,避免处理其他列。
修改后的函数如下:
import pandas as pd from sklearn.feature_extraction.text import CountVectorizer import numpy as np def BOW(df): # 自定义token_pattern,匹配带正负号的数值 CountVec = CountVectorizer(token_pattern=r'(?u)[+-]?\d+') # 明确传入Txt列,避免处理RepID Count_data = CountVec.fit_transform(df['Txt']) Count_data = Count_data.astype(np.uint8) # 用RepID作为结果的索引 cv_dataframe = pd.DataFrame( Count_data.toarray(), columns=CountVec.get_feature_names_out(), index=df['RepID'] ) return cv_dataframe.astype(np.uint8)
关键说明
token_pattern=r'(?u)[+-]?\d+':(?u):开启Unicode匹配模式,确保兼容各类字符编码[+-]?:匹配可选的+或-符号\d+:匹配一个或多个数字,确保能完整提取数值部分
- 原函数中直接传入整个DataFrame会导致
CountVectorizer处理RepID列,明确传入df['Txt']才能只处理目标文本字段。
内容的提问来源于stack exchange,提问作者asmgx
相关产品推荐
相关产品推荐

