【发布时间】:2017-10-12 22:48:09
【问题描述】:
问题:将由 sklearn 的 CountVectorizer 和 TfidfTransformer 生成的稀疏矩阵转换为 Pandas DataFrame 列的最佳方法是什么,每个二元组及其对应的频率和 tf-idf 分数都有单独的行? p>
管道:从 SQL DB 中引入文本数据,将文本拆分为 bigram,计算每个文档的频率和每个文档的每个 bigram 的 tf-idf,然后将结果加载回 SQL DB。
当前状态:
引入了两列数据(number、text)。 text 被清理以产生第三列cleanText:
number text cleanText
0 123 The farmer plants grain farmer plants grain
1 234 The farmer and his son go fishing farmer son go fishing
2 345 The fisher catches tuna fisher catches tuna
这个 DataFrame 被输入到 sklearn 的特征提取中:
cv = CountVectorizer(token_pattern=r"(?u)\b\w+\b", stop_words=None, ngram_range=(2,2), analyzer='word')
dt_mat = cv.fit_transform(data.cleanText)
tfidf_transformer = TfidfTransformer()
tfidf_mat = tfidf_transformer.fit_transform(dt_mat)
然后将矩阵转换为数组后反馈到原始DataFrame中:
data['frequency'] = list(dt_mat.toarray())
data['tfidf_score']=list(tfidf_mat.toarray())
输出:
number text cleanText \
0 123 The farmer plants grain farmer plants grain
1 234 The farmer and his son go fishing farmer son go fishing
2 345 The fisher catches tuna fisher catches tuna
frequency tfidf_score
0 [0, 1, 0, 0, 0, 1, 0] [0.0, 0.707106781187, 0.0, 0.0, 0.0, 0.7071067...
1 [0, 0, 1, 0, 1, 0, 1] [0.0, 0.0, 0.57735026919, 0.0, 0.57735026919, ...
2 [1, 0, 0, 1, 0, 0, 0] [0.707106781187, 0.0, 0.0, 0.707106781187, 0.0...
问题:
- 特征名称(即二元组)不在 DataFrame 中
-
frequency和tfidf_score不在每个二元组的单独行中
期望的输出:
number bigram frequency tfidf_score
0 123 farmer plants 1 0.70
0 123 plants grain 1 0.56
1 234 farmer son 1 0.72
1 234 son go 1 0.63
1 234 go fishing 1 0.34
2 345 fisher catches 1 0.43
2 345 catches tuna 1 0.43
我设法使用以下代码将其中一个数字列分配给 DataFrame 的单独行:
data.reset_index(inplace=True)
rows = []
_ = data.apply(lambda row: [rows.append([row['number'], nn])
for nn in row.tfidf_score], axis=1)
df_new = pd.DataFrame(rows, columns=['number', 'tfidf_score'])
输出:
number tfidf_score
0 123 0.000000
1 123 0.707107
2 123 0.000000
3 123 0.000000
4 123 0.000000
5 123 0.707107
6 123 0.000000
7 234 0.000000
8 234 0.000000
9 234 0.577350
10 234 0.000000
11 234 0.577350
12 234 0.000000
13 234 0.577350
14 345 0.707107
15 345 0.000000
16 345 0.000000
17 345 0.707107
18 345 0.000000
19 345 0.000000
20 345 0.000000
但是,我不确定如何对这两个数字列执行此操作,并且这不会引入二元组(功能名称)本身。此外,此方法需要一个数组(这就是我首先将稀疏矩阵转换为数组的原因),并且由于性能问题以及我必须剥离无意义的行这一事实,我想尽可能避免这种情况.
非常感谢任何见解!非常感谢您抽出宝贵时间阅读这个问题 - 对于篇幅太长,我深表歉意。如果有什么我可以做的来改进问题或澄清我的流程,请告诉我。
【问题讨论】:
标签: python pandas dataframe scikit-learn sparse-matrix