【问题标题】:Converting count vectorizer to tf-idf将计数矢量化器转换为 tf-idf
【发布时间】:2019-09-28 03:41:38
【问题描述】:

所以我有下表,每一行是一个文档,每一列是单词,没有单词出现。

|doc|apple|banana|cat| 
|---|---|---|---| 
|1|2|0|0| 
|2|0|0|2| 
|3|0|2|0|

有什么方法可以将这些计数矢量化表转换为 tf-idf 矢量化器?

编辑:我的解决方案。让我知道这是否正确。

def get_tfidf(df_tfidf):

total_docs = df_tfidf.shape[0]

#Term Frequency
#(Number of times term w appears in a document) / (Total number of 
#terms in the document)

total_words_doc = df_tfidf.astype(bool).sum(axis=1)
tf = df_tfidf.values/total_words_doc[:,None]

#Inverse document frequency
#log_e(Total number of documents / Number of documents with term w in 
#it)
words_in_doc = df_tfidf.astype(bool).sum(axis=0)
idf = np.log(total_docs/words_in_doc)

tf_idf = tf*idf.values[None,:]

return tf_idf

【问题讨论】:

    标签: python pandas machine-learning


    【解决方案1】:

    使用 TfidfTransformer。对计数使用 TfidfVectorizer 可能会给我们带来不希望的结果。让我们更改您提供的术语频率矩阵以了解差异。

    doc apple banana cat
    1 2 5 0
    2 0 0 3
    3 0 6 4

    使用 TfidfTransformer

    from sklearn.feature_extraction.text import TfidfTransformer
    transformer = TfidfTransformer()
    tfidf_trans = transformer.fit_transform(df)
    tfidf_trans_df = pd.DataFrame(tfidf_trans.toarray(), index = df.index, columns=df.columns)
    print(tfidf_trans_df)
    

    输出:

    doc apple banana cat
    1 0.465494 0.885051 0.0
    2 0.0 0.0 1.0
    3 0.0 0.832050 0.5547

    使用 TfidfVectorizer

    from sklearn.feature_extraction.text import TfidfVectorizer
    vectorizer= TfidfVectorizer()
    tfidf_vect = vectorizer.fit_transform(df)
    tfidf_vect_df = pd.DataFrame(tfidf_vect.toarray(), index = df.index, columns=df.columns)
    print(tfidf_vect_df)
    

    输出:

    doc apple banana cat
    1 1.0 0.0 0.0
    2 0.0 1.0 0.0
    3 0.0 0.0 1.0

    详细解释请参考https://scikit-learn.org/stable/modules/feature_extraction.html#tfidf-term-weighting

    【讨论】:

      【解决方案2】:

      假设您有一个计数向量器作为pandas.DataFrame,如下所示:

      import pandas as pd
      data = [[1,2,0,0],[2,0,0,2],[3,0,2,0]]
      df = pd.DataFrame(data,columns=['doc','apple','banana','cat'])
      df
      

      输出

      doc apple   banana  cat
      0   1   2   0   0
      1   2   0   0   2
      2   3   0   2   0
      

      然后你可以使用sklearn.feature_extraction.text.TfidfVectorizer 来获取 tf-idf 向量,如下所示:

      from sklearn.feature_extraction.text import TfidfVectorizer
      v = TfidfVectorizer()
      x = v.fit_transform(df)
      df1 = pd.DataFrame(x.toarray(), columns=v.get_feature_names())
      print(df1)
      

      输出

      apple  banana  cat  doc
      0    0.0     0.0  0.0  1.0
      1    1.0     0.0  0.0  0.0
      2    0.0     1.0  0.0  0.0
      3    0.0     0.0  1.0  0.0
      

      【讨论】:

        猜你喜欢
        • 2023-03-17
        • 2020-08-25
        • 1970-01-01
        • 2020-12-19
        • 2021-02-10
        • 2020-01-05
        • 2019-02-10
        • 2019-07-06
        • 1970-01-01
        相关资源
        最近更新 更多