Python文本數據分析與處理(新聞摘要)
分詞
- 使用jieba分詞, 注意lcut只接受字符串
過濾停用詞
TF-IDF得到摘要信息或者使用LDA主題模型
- TF-IDF有兩種
- jieba.analyse.extract_tags(content, topK=20, withWeight=False) # content為string, topK選出20個關鍵字, withWeight: 每一個關鍵詞同等重要
- 使用gensim庫
- from gensim import corpora, models
- dictinary = corpora.Dictionary(word_list) # 為每一個單詞分配一個id, 並記錄每一個單詞的詞頻到dfs屬性中
- corpus = [dictionary.doc2bow(line) for line in word_list] # 得到詞庫, 形式是(token, id)
- corpus.token2id以[token:id, ...]返回
- # 將數據處理完之后, 才能使用models進行計算
- lda = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20) # corpus指定語料庫, id2word指定字典, id在corpus中, num_toptics指定訓練的主題數
- lda.print_topic(1, 10) # 1為topic的id, 10為topic中關鍵字的個數
- lda.print_topic(3, 10) # 3為返回的topic個數, 10為每一個topic中關鍵字的個數
- 返回的形式是0.009*"文化" + 0.005*"戀情" + 0.004*"中" + 0.004*"撒" + 0.004*"節目"的列表, 數字為權重
機器學習貝葉斯(文本處理, 判斷一句評論是否是侮辱性的[學會了這個, 那么垃圾郵箱, 廣告的過濾也一樣了, 文本處理貝葉斯的world])
與其他的泰坦尼克號遇難預測等案例不同, 文本處理需要自己在預處理時構建出數據表. 沒有后者每一個提供表
不使用第三方庫實現的思路
-
獲取文本數據
- 格式: data0 = [['Hello', 'buddy'], ['You', 'silly']], labels = [1, 1]等
- 二維list, 一個list表示合並在一起可以表示一句話
-
過濾停用詞得到去掉停用詞的集合data
-
對data進行去重(現在使用的算法不需要單詞出現的數量, 如果換作其他算法則不一定), 獲取data中所有的單詞words, words的形式為list
- 實現思路:
- data = set(data): 轉換為set達到去重的效果
- data = list(data): 將data轉為list, 因為需要單詞的順序
- 實現思路:
-
data0的每一個list元素的單詞轉為0和1, 返回一組向量, 0表示沒有該單詞, 1表示有該單詞
-
def NBTrain函數使用貝葉斯進行訓練
- 根據labels先判斷出bad言論數, 得出其概率
- 縮小范圍, 鎖定到bad言論中, 計算出每一條bad言論的單詞總數與所有bad言論的總數的比值
- 鎖定到not bad言論中, 計算出每一條not bad言論的單詞總數與所有not bad言論的總數的比值
- 返回三個向量
-
根據根據貝葉斯公式, 根據輸入的測試集向量, 通過貝葉斯公式與NBTrain出來的參數(該參數與貝葉斯公式非常相關)得出p0與p1, 比較大小進行分類借口
使用sklearn的native_bayes模塊實現
- 獲得數據
- 過濾掉停用詞
- 將每一個樣本對應的單詞以' '.jion合並, 因為之后將單詞轉為向量的對象需要這樣的參數
- 導入sklearn.features_extraction.text.CountVectorizier或者sklearn.features_extraction.text.TfidfVectorizier, 是兩種將字符串中的單詞轉為向量的算法, 后者效果更好, 所以以他為例
- tfidf = TfidVectorizier() # 有一個ngram_range可選參數, (1, 4)表示得到的feature為1個, 2個依次增加到3個, 3就是最終每一個句子的向量的長度
- tfidf_fit = tfidf.fit_transform(texts) # texts的形式['I am myself', 'Do not say it', ...]
- tfidf_fit.get_feature_names()返回單詞list
- tfidf_fit.toarray()返回轉換后的向量
- 現在得到了我們需要用於建模的數據表了(前面就是特征提取的操作, 是機器學習中最難的部分, 目的就是為了得到可以用於建模的數據表)
- 將數據分成訓練集和測試集
- 導入native_bayes模塊中的MultinomialNB類對象
- clf = MultinomialNB()
- clf.fit(X_train.values.tolist(), y_train.values.tolist()) # bayes坑的地方, 傳入的必須是list, 內部不提供轉換
- 評估
- clf.score(X_test.values.tolist(), y_test.values.tolist())