具有Pandas Dataframe的文档语料库的字数矩阵

时间:2018-11-23 18:51:17

标签: python pandas dataframe

好吧,我有2000多个文本文档,并且我正试图以最优雅的方式使用pandas数据框创建矩阵。矩阵如下所示:

df=pd.DataFrame(index=['Doc1_name','Doc2_name','Doc3_name','...','Doc2000_name']
                , columns=['word1','word2','word3','...','word50956'])
df.iloc[:,:] = 'count_word'
print(df)

我已经在名为“文本”的列表中以全文形式拥有所有文档。 我不知道我的问题是否足够清楚。

3 个答案:

答案 0 :(得分:1)

使用sklearn的CountVectorizer

from sklearn.feature_extraction.text import CountVectorizer


df = pd.DataFrame({'texts': ["This is one text (the first one)",
                             "This is the second text",
                             "And, finally, a third text"
                            ]})

cv = CountVectorizer()
cv.fit(df['texts'])

results = cv.transform(df['texts'])

print(results.shape) # Sparse matrix, (3, 9)

如果语料库足够小以适合您的内存(并且2000+足够小),则可以将稀疏矩阵转换为pandas数据帧,如下所示:

features = cv.get_feature_names()
df_res = pd.DataFrame(results.toarray(), columns=features)

df_res是您想要的结果:

df_res
index and   finally first   is  one second  text    the third   this
0     0     0       1       1   2   0       1       1   0       1
1     0     0       0       1   0   1       1       1   0       1
2     1     1       0       0   0   0       1       0   1       0

如果遇到MemoryError,则可以减少单词的词汇量,以考虑使用CountVectorizer的不同参数:

  1. 设置参数stop_words='english'以忽略英语停用词(例如the和`and)
  2. 使用min_dfmax_df,这使CountVectorizer根据文档频率忽略某些单词(太频繁或不频繁的单词,可能没用)
  3. 使用max_features,仅使用最常见的n单词。

答案 1 :(得分:0)

对于任何不小的文本语料,我强烈建议使用scikit-learn的{​​{3}}。

这很简单:

from sklearn.feature_extraction.text import CountVectorizer

count_vectorizer = CountVectorizer()
word_counts = count_vectorizer.fit_transform(corpus) # list of documents (as strings)

它并不能完全按照您期望的结构提供数据框,但是使用vocabulary_的{​​{1}}属性来构造它并不难,它包含术语到它在结果矩阵中的索引。

答案 2 :(得分:0)

from sklearn.feature_extraction.text import CountVectorizer

count_vect = CountVectorizer()
doc_term_matrix = count_vect.fit_transform(df['texts'])

# covert doc term matrix to array
df_vector = pd.DataFrame(doc_term_matrix.toarray())
df_vector.columns = count_vect.get_feature_names()
df_vector.head()