1. 程式人生 > 實用技巧 >使用scikit-learn進行自然語言處理——文件特徵提取(基於詞袋模型bag-of-words) 計算tf-idf

使用scikit-learn進行自然語言處理——文件特徵提取(基於詞袋模型bag-of-words) 計算tf-idf

首先python環境已經安裝了numpy, scipy, sklearn, jieba

# coding=utf-8
"""
@desc: 
"""
from scipy import sparse
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer, TfidfVectorizer
from jieba import cut

# 用jieba進行中文分詞
import jieba

'''
corpus是一個列表,每篇文章是該列表的一個字串型別的元素,word_separator是文章分詞後使用該分隔符分割每個單詞
''' def word_cut_chinese(corpus, word_separator): word_cut_results = list() for document in corpus: word_cut_results.append(word_separator.join(jieba.cut(document))) # 可再加一步去停用詞 return word_cut_results # ---------------使用以上函式處理---------------------------------------- WORD_SEPARATOR
= ' ' corpus = ['我第一次學習自然語言處理,真的有點慌真的好著急', '不要緊張一切都會好的'] train_data = word_cut_chinese(corpus, WORD_SEPARATOR) print('word_cuted_corpus is :', train_data) # word_cuted_corpus is : ['我 第一次 學習 自然語言 處理 , 真的 有點 慌 真的 好 著急', '不要 緊張 一切 都 會 好 的'] print('--------分詞結果-------') for doc in train_data:
print(doc) # 用sklearn構建bag of words from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer, TfidfVectorizer count_vectorizer = CountVectorizer() # 訓練語料庫,得到一個scipy的稀疏矩陣count_matrix count_matrix = count_vectorizer.fit_transform(train_data) print(u"矩陣的稀疏表示count_matrix is:", '\n',count_matrix) # count_matrix is: 含義:第0篇文件的編號為7的詞在第0篇文件中出現的的頻次是1 # (0, 7) 1 # (0, 3) 1 # 得到稠密矩陣 print(u"稠密矩陣count_matrix_todense is:", '\n', count_matrix.todense()) # 檢視整個語料庫的tokens tokens = count_vectorizer.vocabulary_ print('可以得到token字典,tokens is:', '\n', tokens) # 通過單詞查詢id print(u'真的這個詞的索引是:',count_vectorizer.vocabulary_.get('真的')) # 通過id查詢單詞 print(tokens.items()) # filter函式過濾字典的每一項 print(u'索引為5的詞語是',list(filter(lambda x: x[1] == 5, tokens.items()))[0][0]) '''可以使用訓練語料生成的詞典為新的語料生成特徵矩陣''' # 應用到新的語料 corpus_new=['我真的很喜歡你'] word_cuted_corpus_new=word_cut_chinese(corpus_new,WORD_SEPARATOR) matrix_new = count_vectorizer.transform(word_cuted_corpus_new) print(matrix_new.toarray()) '''使用sklearn計算tf-idf矩陣''' tf_idf_transformer = TfidfTransformer() tf_idf_matrix = tf_idf_transformer.fit_transform(count_matrix) print('-------tf-idf矩陣密集表示----') print(tf_idf_matrix.todense()) print('-------tf-idf矩陣稀疏表示----') print(tf_idf_matrix)

ref: https://blog.csdn.net/chansonzhang/article/details/84023654?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight