Python中的Bag of Words with Negative Words

dvtswwa3  于 2024-01-05  发布在  Python
关注(0)|答案(1)|浏览(133)

我有这份文件
这不是普通的文字
它是一本科学术语的教科书
这些文件的文本是这样的

  1. RepID,Txt
  2. 1,K9G3P9 4H477 -Q207KL41 98464 ... Q207KL41
  3. 2,D84T8X4 -D9W4S2 -D9W4S2 8E8E65 ... D9W4S2
  4. 3,-05L8NJ38 K2DD949 0W28DZ48 207441 ... K2D28K84

字符串
我可以用BOW算法建立一个特征集
这是我的代码

  1. def BOW(df):
  2. CountVec = CountVectorizer() # to use only bigrams ngram_range=(2,2)
  3. Count_data = CountVec.fit_transform(df)
  4. Count_data = Count_data.astype(np.uint8)
  5. cv_dataframe=pd.DataFrame(Count_data.toarray(), columns=CountVec.get_feature_names_out(), index=df.index) # <- HERE
  6. return cv_dataframe.astype(np.uint8)
  7. df_reps = pd.read_csv("c:\\file.csv")
  8. df = BOW(df_reps["Txt"])


结果将是“Txt”列中的单词计数。

  1. RepID K9G3P9 4H477 -Q207KL41 98464 ... Q207KL41
  2. 1 2 8 3 2 ... 1
  3. 2 0 1 2 4 ... 2


这里的技巧和我需要帮助的地方是,这些项中的一些前面有一个**-,这应该算作负值
所以如果a文本有这些值Q207KL41 -Q207KL41 -Q207KL41
在这种情况下,以-开头的项应被计为负数,因此Q207KL41的BOW为
-1**
而不是具有Q207KL41-Q207KL41的特征,它们都计数到相同的项Q207KL41,但是具有正和-负
因此,BOW之后的数据集如下所示

  1. RepID K9G3P9 4H477 Q207KL41 98464 ...
  2. 1 2 8 -2 2 ...
  3. 2 0 1 0 4 ...


如何做到这一点?

5tmbdcev

5tmbdcev1#

这可能与普通的词袋矢量化有很大的不同,你最好自己编写矢量化器。
代码:

  1. import io
  2. import pandas as pd
  3. import numpy as np
  4. from collections import defaultdict
  5. s = """
  6. RepID,Txt
  7. 1,K9G3P9 4H477 -Q207KL41 98464 Q207KL41
  8. 2,D84T8X4 -D9W4S2 -D9W4S2 8E8E65 D9W4S2
  9. 3,-05L8NJ38 K2DD949 0W28DZ48 207441 K2D28K84"""
  10. df_reps = pd.read_csv(io.StringIO(s))
  11. def BOW(documents):
  12. ret = []
  13. vocabulary = defaultdict()
  14. vocabulary.default_factory = vocabulary.__len__
  15. for document in documents:
  16. feature_counter = defaultdict(int)
  17. for token in document.split():
  18. sign = 1
  19. if token[0] == "-":
  20. token = token[1:]
  21. sign = -1
  22. feature_idx = vocabulary[token]
  23. feature_counter[feature_idx] += sign
  24. ret.append(feature_counter)
  25. df = pd.DataFrame.from_records(ret)
  26. df = df.fillna(0)
  27. df.columns = vocabulary.keys()
  28. df = df.astype(np.int8)
  29. return df
  30. print(BOW(df_reps["Txt"]))

字符串
输出量:

  1. K9G3P9 4H477 Q207KL41 98464 D84T8X4 D9W4S2 8E8E65 05L8NJ38 K2DD949 0W28DZ48 207441 K2D28K84
  2. 0 1 1 0 1 0 0 0 0 0 0 0 0
  3. 1 0 0 0 0 1 -1 1 0 0 0 0 0
  4. 2 0 0 0 0 0 0 0 -1 1 1 1 1

展开查看全部

相关问题