我有一个如下所示的文本数据框
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
这是为什么以及如何解决?
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 对输入进行标记,并且仅将字母数字字符视为标记。因此,“+”和“-”符号在标记化过程中被排除。
在上面的代码中,我使用自定义分词器,它同时考虑数值和符号。