gpt4 book ai didi

python - 为给定文档选择前 n 个 TFIDF 特征

转载 作者:太空宇宙 更新时间:2023-11-03 11:15:20 24 4
gpt4 key购买 nike

我正在使用 TFIDF 稀疏矩阵进行文档分类,并且只想保留每个文档的前 n 个(比如 50 个)项(按 TFIDF 分数排名)。请参阅下面的编辑

import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

tfidfvectorizer = TfidfVectorizer(analyzer='word', stop_words='english',
token_pattern='[A-Za-z][\w\-]*', max_df=0.25)
n = 50

df = pd.read_pickle('my_df.pickle')
df_t = tfidfvectorizer.fit_transform(df['text'])

df_t
Out[15]:
<21175x201380 sparse matrix of type '<class 'numpy.float64'>'
with 6055621 stored elements in Compressed Sparse Row format>

我尝试按照 this post 中的示例进行操作,虽然我的目的不是展示特征,而只是在训练前为每个文档选择前n个。但是我遇到内存错误,因为我的数据太大而无法转换为密集矩阵。

df_t_sorted = np.argsort(df_t.toarray()).flatten()[::1][n]
Traceback (most recent call last):

File "<ipython-input-16-e0a74c393ca5>", line 1, in <module>
df_t_sorted = np.argsort(df_t.toarray()).flatten()[::1][n]

File "C:\Users\Me\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\sparse\compressed.py", line 943, in toarray
out = self._process_toarray_args(order, out)

File "C:\Users\Me\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\sparse\base.py", line 1130, in _process_toarray_args
return np.zeros(self.shape, dtype=self.dtype, order=order)

MemoryError

有什么方法可以做我想做的事而不用密集表示(即没有 toarray() 调用)并且不会比我已经拥有的特征空间减少太多(使用 min_df )?

注意:max_features 参数不是我想要的,因为它只考虑“按词频排序的顶级 max_features 整个语料库”(文档 here)和我想要的是文档级别的排名。

编辑: 我想知道解决此问题的最佳方法是否是将除 n-best 之外的所有特征 的值设置为零。我这样说是因为已经计算了词汇表,所以特征索引必须保持不变,因为我想将它们用于其他目的(例如,可视化对应于 n-best 的实际单词功能)。

一位同事编写了一些代码来检索 n 个排名最高的特征的索引:

n = 2
tops = np.zeros((df_t.shape[0], n), dtype=int) # store the top indices in a new array
for ind in range(df_t.shape[0]):
tops[ind,] = np.argsort(-df_t[ind].toarray())[0, 0:n] # for each row (i.e. document) sort the (inversed, as argsort is ascending) list and slice top n

但从那里,我需要:

  1. 检索剩余(即排名最低的)索引列表并“就地”修改值,或
  2. 遍历原始矩阵 (df_t) 并将所有值设置为 0,n tops 中的最佳索引除外。

有一个帖子here解释如何使用 csr_matrix,但我不确定如何将其付诸实践以获得我想要的结果。

最佳答案

from nltk.tokenize import word_tokenize
from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer(tokenizer=word_tokenize,ngram_range=(1,2), binary=True, max_features=50)
TFIDF=vect.fit_transform(df['processed_cv_data'])

TfidfVectorizer 中传递的 ma​​x_features 参数将挑选出按其词频而不是按其排序的前 50 个特征Tf-idf 得分。您可以使用以下方式查看功能:

print(vect.get_feature_names())

关于python - 为给定文档选择前 n 个 TFIDF 特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52972368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com