如何在Python中实现含负向术语的词袋(BOW)模型?
问题
现有一份包含科学术语的文本数据集,部分术语带有-前缀。使用Python的CountVectorizer实现词袋(BOW)模型时,带-的术语会被当作独立特征。需求是将带-的术语计数设为负值,并与无-的同术语合并,例如文本Q207KL41 -Q207KL41 -Q207KL41对应的Q207KL41特征值为-1。
原BOW实现代码如下:
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) df_reps = pd.read_csv("c:\file.csv") df = BOW(df_reps["Txt"])
解决方案
可以通过以下步骤修改代码实现需求:
- 替换数据类型:放弃使用无法存储负数的
np.uint8,改用支持正负值的np.int32; - 合并正负术语:遍历所有特征列,识别带
-前缀的术语,将其计数取负后合并到对应的无前缀术语列; - 清理冗余列:删除所有带
-前缀的原始特征列。
修改后的完整代码:
import pandas as pd import numpy as np from sklearn.feature_extraction.text import CountVectorizer def BOW(df): CountVec = CountVectorizer() Count_data = CountVec.fit_transform(df) # 改用支持负数的整数类型存储 Count_data = Count_data.astype(np.int32) cv_dataframe = pd.DataFrame(Count_data.toarray(), columns=CountVec.get_feature_names_out(), index=df.index) # 处理带'-'前缀的术语 processed_terms = set() for col in cv_dataframe.columns: if col.startswith('-'): base_term = col[1:] if base_term in cv_dataframe.columns: # 将带'-'的计数取负,累加到基础术语列 cv_dataframe[base_term] -= cv_dataframe[col] else: # 若基础术语不存在,直接将负数作为该术语的初始值 cv_dataframe[base_term] = -cv_dataframe[col] processed_terms.add(col) # 删除所有带'-'前缀的冗余列 cv_dataframe.drop(columns=processed_terms, inplace=True) return cv_dataframe df_reps = pd.read_csv("c:\file.csv") df = BOW(df_reps["Txt"])
代码说明
- 类型适配:
np.int32支持正负整数,满足负数计数的存储需求; - 合并逻辑:对于每个带
-的术语,提取其基础术语后,将当前列的计数取负合并到基础术语列,确保正负计数抵消; - 冗余清理:删除带
-的原始列,最终只保留合并后的基础术语特征。
测试示例:输入文本Q207KL41 -Q207KL41 -Q207KL41,处理后Q207KL41的特征值为1 - 2 = -1,完全符合需求。
内容的提问来源于stack exchange,提问作者asmgx
相关产品推荐
相关产品推荐

