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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:38:25