基於搜狗實驗室的新聞數據分析

詳細代碼和數據(part02/python文本分析/news_sougou)能夠查看這個:https://github.com/HappyZXY/machineLearning

數據源:

    http://www.sogou.com/labs/resource/ca.phpphp

    來自若干新聞站點2012年6月-----7月期間國內、國際、體育、社會、娛樂等18個頻道的新聞算數據,提供url和正文信息python

格式說明:

     數據格式爲git

<doc>
<url>頁面URL<url>
<docno>頁面ID</docno>  
<contenttitle>頁面標題</contenttitle>
<content>頁面標題</content>
</doc>

注:content字段是去除了HTML標籤,保存的是新聞正文文本

  

panda速查手冊 github

 1 #數據讀取與導出
 2 import pandas as pd
 3 import numpy as np
 4 pd.read_csv(filename,sep='')#從csv文件導入數據
 5 pd.read_csv(filename,sep='',header=none)#導入沒有頭的文件
 6 #構造DataFrame數據
 7 df=pd.DataFrame([[1,2,3],[4,5,6]],columns=['f1','f2','f3'])
 8  
 9 #導出數據
10 df.to_csv(filename,index=False)
11  
12 #數據查看
13 df.head(n)#查看數據的前n行
14 df.tail(n)#查看DataFrame對象的最後n行
15 df.shape()#查看行數和列數
16 df.info()#查看索引、數據類型和內存信息
17 df.describe()# 查看數值型列的彙總統計
18 s=df['user_id']#根據列名以Serise的形式返回列
19 df[['user_id','item_id']]#以DataFrame形式返回多列
20 s.iloc['index_one']#按索引選取 數據
21 df.iloc[0,:]#返回第一行
22 df.iloc[0,0]#返回第一列的第一個元素
23 df.sample(frac=0.5)#採樣
24  
25 #數據整理
26 pd.isnull()#檢查DataFrame對象中的控制,並返回一個Boolean數組
27 df.dropna(axis=0)#刪除全部包含空值的行
28 df.dropna(axis=1)#刪除全部包含空值的列
29 df.dropna(axis=1,thresh=n)#刪除全部小於n個非空值的行
30 df.fillna(x)#用x替換DataFrame對象中的全部的空值
31 df.fillna(df.median)#中位數填充
32 s.replace(1,'one')#用'one'代替全部等於1的值
33 df.columns= ['a','b','c']#重命名列名
34 df.rename(columns=lambda x:x+1)#批量重命名列名
35 df.rename(index=lambda x:x+1 )#批量重命名索引
36  
37 #數據處理
38 df[df[col]>0.5]#選擇col列的值大於0.5的行
39 df.sort_values(by='col',ascending=True)#按照列col排序數據,默認升序排序
40  
41 #數據合併
42 df1.append(df2)#將df2中的行添加到df1的尾部
43 pd.concat([df1,df2],axis=1)#按列合併
44 pd.concat([df1,df2],axis=0)#按行合併
45  
46 df.corr()#返回全部列與列之間的相關係數
47 df.count()#返回每一列中的非空值的個數
48 df.dtypes()#查看數據類型
49 df['uesr_id'].hist()#查看變量分佈
50 df.isnull().sum()#查看每一列缺失值的狀況
51 df['user_id'].unique()#查看數據取值
52  
53  
54 a.sort_index(axis=1,ascending=False)#axis=1表示對全部的columns進行排序
55 a.sort(column='x')#對DataFrame中的值進行排序
56 選取對象
57 a['x']#選取特定的列,
58 選取行數據,經過切片[]來選擇
59 a[0:3]#選取前三行的數據
60  
61 loc是經過 行標籤來選擇數據
62 iloc經過行號索引行數據
63 ix經過行標籤或者行號索引行數據(基於loc和iloc的混合)
64 a.loc['one']  #默認表示選取行爲'one'的行
65 a.loc[:,'a','b']表示選取全部行以及columns爲a,b的列
66 a.loc[['one','two'],['a','b']]表示選取‘one’和‘two’這兩行以及columns爲ab的列
67 a.loc[0]表示選取第一行的數據
68  
69 條件選擇
70 a[a.c>0]表示選擇c列中大於0 的數據
71 賦值
72 a.loc[:,['a','c']=9 即將a和c列的全部行中的值設置爲9
73  
74 a.dropna(how='any')表示去掉包含缺失值的行
75 a.fillna(value=x) 表示用值爲x 的數來對缺失值 進行填充
76  
77 統計某一列x中格格之出現的次數 a['x'].value_counts()
78  
79 對數據應用函數 a.apply(lambda x :x.max()-x.mnin())表示 返回全部列中最大值-最小值的差
View Code

 

 

分詞-清洗-統計-詞雲可視化

 

首先導入將使用的庫和數據 ,這裏數據存放在data文件下了,這次試驗以val.txt爲測試,數據量5000,較小

 

 

 

可視化展現每一篇新聞的分詞效果數組

 

 

 讀取中止詞,可根據需求適量增長,一樣使用panda展現出來 ,這裏取樣爲前20個app

 

根據中止詞表,對每一篇新聞,drop掉全部的意義不大的詞,機器學習

 
drop中止詞後,可視化顯示全部的詞,而後根據這些詞進行分組統計,查看每一詞在文章中出現的次數
ide

 

 

emmmm,又是詞雲展現一下,老套路了,很少解釋,,這裏詞去除的有些不乾淨,可自行改進函數

 

TF-IDF提取關鍵詞與LDA主題模型

調用jieba.analyse.extract_tags函數,提取出關鍵詞,關於使用方法,官方源碼以下學習

 1  def textrank(self, sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'), withFlag=False):
 2         """
 3         Extract keywords from sentence using TextRank algorithm.
 4         Parameter:
 5             - topK: return how many top keywords. `None` for all possible words.
 6             - withWeight: if True, return a list of (word, weight);
 7                           if False, return a list of words.
 8             - allowPOS: the allowed POS list eg. ['ns', 'n', 'vn', 'v'].
 9                         if the POS of w is not in this list, it will be filtered.
10             - withFlag: if True, return a list of pair(word, weight) like posseg.cut
11                         if False, return a list of words
12         """

 

LDA主題模型(LDA文檔主題生成模型)

  LDA(Latent Dirchlet Allocation )是一種文檔主題生成模型,也稱爲一個三層貝葉斯機率模型,包含詞、主題和文檔三層結構。所謂生成模型,就是說,咱們認爲一篇文章的每一個詞都是經過必定機率選擇了某個主題,並從主題中以必定機率選擇某個詞語,這樣一個過程。文檔到主題服從多項式分佈,主題到詞也服從多項式分佈。

  LDA是一種非監督機器學習技術,能夠用來識別大規模文檔集(document collection)或者語料庫(corpus)中潛藏的主題信息。它採用了詞袋(bag of words)的方法,這種方法將每一篇文章視爲一個詞頻向量,從而將文本信息轉化爲易於建模的數字信息。可是詞袋方法沒有考慮詞與詞之間的順序,這簡化了問題的複雜性,同時也爲模型的改進提供了契機。每一篇文檔表明了一些主題所構成的一個機率分佈,而每個主題又表明了不少單詞所構成的一個機率分佈。

 

LDA生成過程

  對於語料庫中的每篇文檔,LDA定義了以下生成過程(generativeprocess):
    1.對每一篇文檔,從主題分佈中抽取一個主題;
    2.從上述被抽到的主題所對應的單詞分佈中抽取一個單詞;
    3.重複上述過程直至遍歷文檔中的每個單詞。
  語料庫中的每一篇文檔與T(經過反覆試驗等方法事先給定)個主題的一個多項分佈 (multinomialdistribution)相對應,將該多項分佈記爲θ。每一個主題又與詞彙表(vocabulary)中的V個單詞的一個多項分佈相對應,將這個多項分佈記爲φ。
 
 

LDA應用

  在實際的運用中,LDA能夠直接從gensim調,主要的一些參數有以下幾個:   corpus:語料數據,須要包含單詞id與詞頻    num_topics:咱們須要生成的主題個數(重點調節)   id2word:是一種id到單詞的映射(gensim也有包生成)   passes:遍歷文本的次數,遍歷越多越準備   alpha:主題分佈的先驗   eta:詞分佈的先驗 

 

官方實例以下

  comment_texts是一個list,每個元素都是一篇文章,也是list結構

  dow2bow是將文本轉換爲詞袋形式

  初始化的時候對每個詞都會生成一個id,新的文本進去的時候,返回該文本每個詞的id,和對應的頻數,對於那些不存在原詞典的,能夠控制是否返回。

  

1 from gensim.test.utils import common_texts
2 from gensim.corpora.dictionary import Dictionary
3 
4 # Create a corpus from a list of texts
5 common_dictionary = Dictionary(common_texts)
6 common_corpus = [common_dictionary.doc2bow(text) for text in common_texts]
7 
8 # Train the model on the corpus.
9 lda = LdaModel(common_corpus, num_topics=10)

 

原理到這裏,下面繼續

 

 

能夠看出第一個模型的詞分佈,‘爆料’和‘中’佔比較大(這裏topn控制了輸出的單詞個數,對應的單詞能夠經過以前生成dict找出)

 

繼續輸出前20主題的看一下效果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

參考文獻:

[1] 搜狗實驗室 http://www.sogou.com/labs/resource/ca.php 2019-6-29 15:00

[2] 簡書.LDA應用和理解 https://www.jianshu.com/p/74ec7d5f6821 2019-7-1 2019-6-29-23:00

[3] 百度百科.LDA https://baike.baidu.com/item/LDA/13489644?fr=aladdin#ref_[1]_13230719 2019-6-30 7:12

[4] 簡書.利用TF-IDF與餘弦類似性自動提取關鍵詞 2019-7-1 15:30

相關文章
相關標籤/搜索