【问题标题】:How to apply tf-idf to rows of text如何将 tf-idf 应用于文本行
【发布时间】:2021-02-06 07:17:44
【问题描述】:

我有几行简介(文本格式),我想使用 tf-idf 来定义每个单词的权重。下面是代码:

def remove_punctuations(text):
    for punctuation in string.punctuation:
        text = text.replace(punctuation, '')
    return text
df["punc_blurb"] = df["blurb"].apply(remove_punctuations)

df = pd.DataFrame(df["punc_blurb"])

vectoriser = TfidfVectorizer()
df["blurb_Vect"] = list(vectoriser.fit_transform(df["punc_blurb"]).toarray())

df_vectoriser = pd.DataFrame(x.toarray(),
columns = vectoriser.get_feature_names())
print(df_vectoriser)

我得到的只是一个庞大的数字列表,我什至不确定它是给我的 TF 还是 TF-IDF,因为常用词(the、and 等)都有更高的分数大于 0。

目标是查看下面显示的 tf-idf 列中的权重,我不确定是否以最有效的方式执行此操作:

Goal Output table

【问题讨论】:

标签: python machine-learning scikit-learn nlp tf-idf


【解决方案1】:

如果您使用TfidfVectorizer,则不需要标点删除器。它会自动处理标点符号,默认 token_pattern 参数:

from sklearn.feature_extraction.text import TfidfVectorizer

df = pd.DataFrame({"blurb":["this is a sentence", "this is, well, another one"]})
vectorizer = TfidfVectorizer(token_pattern='(?u)\\b\\w\\w+\\b')
df["tf_idf"] = list(vectorizer.fit_transform(df["blurb"].values.astype("U")).toarray())
vocab = sorted(vectorizer.vocabulary_.keys())
df["tf_idf_dic"] = df["tf_idf"].apply(lambda x: {k:v for k,v in dict(zip(vocab,x)).items() if v!=0})

【讨论】:

  • 谢谢。您的代码有效,但是当我尝试更改您编写的句子并参考我的 df["blurb"] 列时,其余代码似乎不喜欢它。还有输出,有没有办法只获取行的相应单词?例如,删除 0.0 字,因为它与该行无关。
  • 显示minimal reproducible example请包括输入作为文本
  • 这是我将 df 从您的句子示例更改为我的列的时候: df = pd.DataFrame(df1["blurb"]) vectorizer = TfidfVectorizer(token_pattern='(?u)\\b \\w\\w+\\b') df["tf_idf"] = list(vectorizer.fit_transform(df["blurb"]).toarray()) ValueError: np.nan 是无效文档,预期字节或 unicode字符串
  • 我向您展示了一个工作示例。没有看到您的数据就无法帮助您
  • 它不允许我显示数据。数据很简单,就是一个两列七行的excel表格。一栏是书名,另一栏是书名。每行指的是不同的书。
猜你喜欢
  • 2020-08-27
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 2017-05-08
  • 2015-05-07
  • 2017-02-27
  • 1970-01-01
  • 2020-03-22
相关资源
最近更新 更多