为什么Python会忽略列名中的符号?

问题描述 投票:0回答:1

我有一个如下所示的文本数据框

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

这是为什么以及如何解决?

python dataframe nlp
1个回答
0
投票
import re
import ..... ## import other stuffs


def custom_tokenizer(text):
    tokens = [token.strip() for token in re.split('([+-]?\d+)', text) if token.strip()] # Splitinput text into tokens taking into account numeric values and signs both
    return tokens

def BOW(df):
    CountVec = CountVectorizer(tokenizer=custom_tokenizer)
    Count_data = CountVec.fit_transform(df['Txt'])
    Count_data = Count_data.astype(np.uint8)
    cv_dataframe = pd.DataFrame(Count_data.toarray(), columns=CountVec.get_feature_names_out(), index=df.index)
    return cv_dataframe.astype(np.uint8)

### Test the Bow() func
data = {'RepID': [1, 2, 3],
        'Txt': ['+83 -193 -380 +55 +901', '-94 +44 +2892 -60', '+7010 -3840 +3993']}
df = pd.DataFrame(data)
result = BOW(df)
print(result)

您看到的问题是由于 CountVectorizer 对输入进行标记的方式造成的。默认情况下,CountVectorizer 使用 regx 对输入进行标记,并且仅将字母数字字符视为标记。因此,“+”和“-”符号在标记化过程中被排除。

在上面的代码中,我使用自定义分词器,它同时考虑数值和符号。

© www.soinside.com 2019 - 2024. All rights reserved.