从 sklearn 输出中获取 tf / tfidf

Getting tf / tfidf from sklearn output

我的数据框是

df = pd.DataFrame({"person":['A','B','C'],"url":["google.kr","whosebug.com","yahoo.us"],"weight":[5,10,15]})
df2 = df.loc[np.repeat(df.index.values,df.weight)]

tfidf 是:

v = TfidfVectorizer(token_pattern='\S+',smooth_idf=False,norm=None)
x = v.fit_transform(df2['url'])

我使用

提取 idf
v.idf_

在漂亮的格式化数组中给出 idf。

我正在努力提取 tfidf 或仅提取 tf。

# for tfidf
x.toarray()
# for tf 
v = CountVectorizer(token_pattern='\S+')
x = v.fit_transform(df2['url'])
x.toarray() 

这给了我一个只包含 0,1 的数组。

对于词频 (TF),计数向量器正在计算 df2 每一行中每个标记的出现次数。换句话说,当您查看 df2 时,您会发现每一行中都会出现一个标记,这就是它为 1 或 0 的原因。因此,您必须对每列计数求和以获得整个行中的词频整个数据框,我想这就是你想要的?

# for tf 
v = CountVectorizer(token_pattern='\S+')
x = v.fit_transform(df2['url'])

# gets term frequencies for each token
[sum(l) for l in list(zip(*x.toarray()))] 

# see which tokens are which element
v.vocabulary_

输出

[5, 10, 15]
{'google.kr': 0, 'whosebug.com': 1, 'yahoo.us': 2}

zip 方法只是从数组中取消每个 'column' 的嵌套。如果你以前没有看过,你可以了解更多here

你已经知道的 IDF,所以 TF-IDF 是 tf * idf