2017-05-31 204 views
1

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

在此先感谢。

更新:现在包括我的预处理步骤,其使用面积的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] 
+1

TfidfVectorizer用于将原始文档集合转换为TF-IDF特征矩阵。它想要一系列文件。你的字典似乎被以某种方式处理,所以目前还不清楚你希望'TfidfVectorizer'做什么。 –

+0

谢谢@ juanpa.arrivillaga。编辑以反映列表项目是多字符串(在我的实际案例中〜2000字)。这些清单基本上都是亚文库。实际上,我想知道给定子小组(列表)中最有特色的单词。 – 6Bacon

回答

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] 

这应该这样做!