使用analyzer ='char'如何计算Tf-Idf值?

Posted

技术标签:

【中文标题】使用analyzer =\'char\'如何计算Tf-Idf值?【英文标题】:How is the Tf-Idf value calculated with analyzer ='char'?使用analyzer ='char'如何计算Tf-Idf值? 【发布时间】:2019-05-24 01:12:15 【问题描述】:

我在理解我们如何在以下程序中获得 Tf-Idf 时遇到问题:

我尝试使用site 上给出的概念计算文档 2 ('And_this_is_the_third_one.') 中 a 的值,但我使用上述概念的 'a' 值是

1/26*log(4/1)

(('a' 字符的出现次数)/(给定的字符数 document)*log( # Docs/ # 给定字符的文档 发生))

= 0.023156

但输出返回为 0.2203,如输出所示。

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ['This_is_the_first_document.', 'This_document_is_the_second_document.', 'And_this_is_the_third_one.', 'Is_this_the_first_document?', ]
vectorizer = TfidfVectorizer(min_df=0.0, analyzer="char")
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())
print(vectorizer.vocabulary_)
m = X.todense()
print(m)

使用上述概念,我预计输出为 0.023156。

输出是:

['.', '?', '_', 'a', 'c', 'd', 'e', 'f', 'h', 'i', 'm', 'n', 'o', 'r', 's', 't', 'u']


't': 15, 'h': 8, 'i': 9, 's': 14, '_': 2, 'e': 6, 'f': 7, 'r': 13, 'd': 5, 'o': 12, 'c': 4, 'u': 16, 'm': 10, 'n': 11, '.': 0, 'a': 3, '?': 1


[[0.14540332 0.         0.47550697 0.         0.14540332 0.11887674
  0.23775349 0.17960203 0.23775349 0.35663023 0.14540332 0.11887674
  0.11887674 0.14540332 0.35663023 0.47550697 0.14540332]


 [0.10814145 0.         0.44206359 0.         0.32442434 0.26523816
  0.35365088 0.         0.17682544 0.17682544 0.21628289 0.26523816
  0.26523816 0.         0.26523816 0.35365088 0.21628289]


 [0.14061506 0.         0.57481012 0.22030066 0.         0.22992405
  0.22992405 0.         0.34488607 0.34488607 0.         0.22992405
  0.11496202 0.14061506 0.22992405 0.34488607 0.        ]


 [0.         0.2243785  0.46836004 0.         0.14321789 0.11709001
  0.23418002 0.17690259 0.23418002 0.35127003 0.14321789 0.11709001
  0.11709001 0.14321789 0.35127003 0.46836004 0.14321789]]

【问题讨论】:

什么是“骗局”(在这种情况下)? “骗局”你的意思是“概念”? 【参考方案1】:

TfidfVectorizer() 已将平滑添加到文档计数中,l2 标准化已应用于顶部 tf-idf 向量,如 documentation 中所述。

(字符出现次数)/(给定字符数 文件)* log (1 + # Docs / 1 + # Docs 其中存在给定字符) +1 )

此规范化默认为l2,但您可以使用参数norm 更改或删除此步骤。同样,平滑可以是

要了解如何计算准确分数,我将使用CountVectorizer() 来了解每个文档中每个字符的计数。

countVectorizer = CountVectorizer(analyzer='char')
tf = countVectorizer.fit_transform(corpus)
tf_df = pd.DataFrame(tf.toarray(),
                     columns= countVectorizer.get_feature_names())
tf_df

#output:
   .  ?  _  a  c  d  e  f  h  i  m  n  o  r  s  t  u
0  1  0  4  0  1  1  2  1  2  3  1  1  1  1  3  4  1
1  1  0  5  0  3  3  4  0  2  2  2  3  3  0  3  4  2
2  1  0  5  1  0  2  2  0  3  3  0  2  1  1  2  3  0
3  0  1  4  0  1  1  2  1  2  3  1  1  1  1  3  4  1

现在让我们将基于 sklearn 实现的 tf-idf 权重应用于第二个文档!

v=[]
doc_id = 2
# number of documents in the corpus + smoothing
n_d = 1+ tf_df.shape[0]

for char in tf_df.columns:
    # calculate tf - count of this char in the doc / total number chars in the doc
    tf = tf_df.loc[doc_id,char]/tf_df.loc[doc_id,:].sum()

    # number of documents containing this char with smoothing 
    df_d_t = 1+ sum(tf_df.loc[:,char]>0)
    # now calculate the idf with smoothing 
    idf = (np.log (n_d/df_d_t) + 1 )

    # calculate the score now
    v.append (tf*idf)

from sklearn.preprocessing import normalize

# normalize the vector with l2 norm and create a dataframe with feature_names

pd.DataFrame(normalize([v], norm='l2'), columns=vectorizer.get_feature_names())

#output:

       .    ?        _         a    c         d         e    f         h        i    m         n         o         r         s         t    u  
 0.140615  0.0  0.57481  0.220301  0.0  0.229924  0.229924  0.0  0.344886   0.344886  0.0  0.229924  0.114962  0.140615  0.229924  0.344886  0.0 

您会发现 char a 的得分与 TfidfVectorizer() 输出匹配!!!

【讨论】:

非常感谢@Al_Learning,现在很清楚了 请告诉我们平滑是什么,同样可以 在两个步骤中都加 1 是平滑方面。如果您仍然感到困惑,请提出一个新问题,并提供更多详细信息。

以上是关于使用analyzer ='char'如何计算Tf-Idf值?的主要内容,如果未能解决你的问题,请参考以下文章

SVM如何计算文档分类中测试文档的tf-df?

使用 sklearn 如何计算文档和查询之间的 tf-idf 余弦相似度?

如何使用 tf.one_hot 计算一种热编码?

如何使用谱线分析(Peak Analyzer)进行多峰分析?

如何计算查询的 TF-IDF?

WOW Analyzer计算技能使用率以及战斗贡献率的工具