【问题标题】:Using TfidfVectorizer on a Dictionary of Lists在列表字典上使用 TfidfVectorizer
【发布时间】:2017-05-31 06:41:17
【问题描述】:

我有一个存储为 25 个列表的字典的大型语料库,我想使用 SKLearn 的 TfidfVectorizer 进行分析。每个列表包含许多字符串。现在,我关心整个语料库中的总词频 (tf) 和 25 个字符串 (idf) 的每个列表中最独特的词。问题是,我还没有找到将这种对象传递给 TfidfVectorizer 的方法。传递 dict 只是向量化键,传递值会产生一个 AttributeError: 'list' object has no attribute 'lower' (我猜它需要一个字符串。)

提前致谢。

更新:现在包括我的预处理步骤,它使用了 dict 的区域,ID 对称为 buckets

for area in buckets:
    area_docs = []
    for value in buckets[area]:   
        if 'filename_%s.txt' % value in os.listdir(directory):
            fin = open(directory+'/filename_%s.txt' % value, 'r').read() 
            area_docs.append(fin)
            buckets[area] = area_docs



corpus = buckets.values()
vectorizer = TfidfVectorizer(min_df=1, stop_words='english')
X = vectorizer.fit_transform(corpus)
idf = vectorizer.idf_
d = dict(zip(vectorizer.get_feature_names(), idf))
sorted_d = sorted(d.items(), key=operator.itemgetter(1))
sorted_d[:50]

【问题讨论】:

  • TfidfVectorizer 用于“将原始文档集合转换为 TF-IDF 特征矩阵”。它需要一系列文档。您的字典似乎以某种方式被处理,因此不清楚您希望 TfidfVectorizer 做什么。
  • 谢谢@juanpa.arrivillaga。编辑以反映列表项是多字字符串(在我的实际案例中,文档约为 2000 个字)。这些列表基本上是子语料库。实际上,我想知道给定子语料库(列表)中最有特色的词。

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


【解决方案1】:

TfidfVectorizer 想要一个字符串列表,其中每个字符串都是一个文档。您的area_docs 变量已经是一个字符串列表,所以当您调用buckets.values() 时,您会得到一个字符串列表列表,这对于TfidfVectorizer 来说维度太多了。您需要展平该列表。以下代码在 Python3 中,仅更改了一行并添加了另一行:

for area in buckets:
    area_docs = []
    for value in buckets[area]:   
        if 'filename_%s.txt' % value in os.listdir(directory):
            fin = open(directory+'/filename_%s.txt' % value, 'r').read() 
            area_docs.append(fin)
            buckets[area] = area_docs

corpus = list(buckets.values()) # Get your list of lists of strings
corpus = sum(corpus, []) # Good trick for flattening 2D lists to 1D
vectorizer = TfidfVectorizer(min_df=1, stop_words='english')
X = vectorizer.fit_transform(corpus)
idf = vectorizer.idf_
d = dict(zip(vectorizer.get_feature_names(), idf))
sorted_d = sorted(d.items(), key=operator.itemgetter(1))
sorted_d[:50]

应该这样做!

【讨论】:

    猜你喜欢
    • 2018-08-19
    • 2017-07-16
    • 2017-05-26
    • 2018-11-10
    • 2018-01-22
    • 2023-03-03
    • 1970-01-01
    • 2021-03-31
    • 2021-05-01
    相关资源
    最近更新 更多