好吧,我有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)
我已经在名为“文本”的列表中以全文形式拥有所有文档。 我不知道我的问题是否足够清楚。
答案 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
的不同参数:
stop_words='english'
以忽略英语停用词(例如the
和`and)min_df
和max_df
,这使CountVectorizer
根据文档频率忽略某些单词(太频繁或不频繁的单词,可能没用)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()