欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

以911新聞為例演示Python實現數據可視化的教程

系統 1758 0

本文介紹一個將911襲擊及后續影響相關新聞文章的主題可視化的項目。我將介紹我的出發點,實現的技術細節和我對一些結果的思考。

以911新聞為例演示Python實現數據可視化的教程_第1張圖片

簡介

近代美國歷史上再沒有比911襲擊影響更深遠的事件了,它的影響在未來還會持續。從事件發生到現在,成千上萬主題各異的文章付梓。我們怎樣能利用數據科學的工具來探索這些主題,并且追蹤它們隨著時間的變化呢?
靈感

首先提出這個問題的是一家叫做Local Projects的公司,有人委任它們為紐約的國家911博物館設置一個展覽。他們的展覽,Timescape,將事件的主題和文章可視化之后投影到博物館的一面墻上。不幸的是,由于考慮到官僚主義的干預和現代人的三分鐘熱度,這個展覽只能展現很多主題,快速循環播放。Timescape的設計給了我啟發,但是我想試著更深入、更有交互性,讓每個能接入互聯網的人都能在空閑時觀看。

這個問題的關鍵是怎么講故事。每篇文章都有不同的講故事角度,但是有線索通過詞句將它們聯系到一起。”Osama bin Laden”、 “Guantanamo Bay”、”Freedom”,還有更多詞匯組成了我模型的磚瓦。
獲取數據

所有來源當中,沒有一個比紐約時報更適合講述911的故事了。他們還有一個神奇的API,允許在數據庫中查詢關于某一主題的全部文章。我用這個API和其他一些Python網絡爬蟲以及NLP工具構建了我的數據集。

爬取過程是如下這樣的:

  • ??? 調用API查詢新聞的元數據,包括每篇文章的URL。
  • ??? 給每個URL發送GET請求,找到HTML中的正文文本,提取出來。
  • ??? 清理文章文本,去除停用詞和標點

我寫了一個Python腳本自動做這些事,并能夠構建一個有成千上萬文章的數據集。也許這個過程中最有挑戰性的部分是寫一個從HTML文檔里提取正文的函數。近幾十年來,紐約時報不時也更改了他們HTML文檔的結構,所以這個抽取函數取決于笨重的嵌套條件語句:
?

            
# s is a BeautifulSoup object containing the HTML of the page
if s.find('p', {'itemprop': 'articleBody'}) is not None: 
  paragraphs = s.findAll('p', {'itemprop': 'articleBody'})
  story = ' '.join([p.text for p in paragraphs])
elif s.find('nyt_text'): 
  story = s.find('nyt_text').text
elif s.find('div', {'id': 'mod-a-body-first-para'}): 
  story = s.find('div', {'id': 'mod-a-body-first-para'}).text
  story += s.find('div', {'id': 'mod-a-body-after-first-para'}).text
else: 
  if s.find('p', {'class': 'story-body-text'}) is not None:
    paragraphs = s.findAll('p', {'class': 'story-body-text'})
    story = ' '.join([p.text for p in paragraphs])
  else:
    story = ''

          

文檔向量化

在我們應用機器學習算法之前,我們要將文檔向量化。感謝scikit-learn的IT-IDF Vectorizer模塊,這很容易。只考慮單個詞是不夠的,因為我的數據集里并不缺一些重要的名字。所以我選擇使用n-grams,n取了1到3。讓人高興的是,實現多個n-gram和實現單獨關鍵詞一樣簡單,只需要簡單地設置一下Vectorizer的參數。
?

            
vec = TfidfVectorizer(max_features=max_features, 
      ngram_range=(1, 3),
      max_df=max_df)

          

開始的模型里,我設置max_features(向量模型里詞或詞組的最大數量)參數為20000或30000,在我計算機的計算能力之內。但是考慮到我還加入了2-gram和3-gram,這些組合會導致特征數量的爆炸(這里面很多特征也很重要),在我的最終模型里我會提高這個數字。
用NMF做主題模型

非負矩陣分解(Non-negative Matrix Factorization,或者叫NMF),是一個線性代數優化算法。它最具魔力的地方在于不用任何闡釋含義的先驗知識,它就能提取出關于主題的有意義的信息。數學上它的目標是將一個nxm的輸入矩陣分解成兩個矩陣,稱為W和H,W是nxt的文檔-主題矩陣,H是txm的主題-詞語矩陣。你可以發現W和H的點積與輸入矩陣形狀一樣。實際上,模型試圖構建W和H,使得他們的點積是輸入矩陣的一個近似。這個算法的另一個優點在于,用戶可以自主選擇變量t的值,代表生成主題的數量。

再一次地,我把這個重要的任務交給了scikit-learn,它的NMF模塊足夠處理這個任務。如果我在這個項目上投入更多時間,我也許會找一些更高效的NMF實現方法,畢竟它是這個項目里最復雜耗時的過程。實現過程中我產生了一個主意,但沒實現它,是一個熱啟動的問題。那樣可以讓用戶用一些特定的詞來填充H矩陣的行,從而在形成主題的過程中給系統一些領域知識。不管怎么樣,我只有幾周時間完成整個項目。還有很多其他的事需要我更多的精力。
主題模型的參數

因為主題模型是整個項目的基石,我在構建過程中做的決定對最終成果有很大影響。我決定輸入模型的文章為911事件發生18個月以后的。在這個時間段喧囂不再,所以這段時間出現的主題的確是911事件的直接結果。在向量化的階段,開始幾次運行的規模受限于我的計算機。20或者30個主題的結果還不錯,但是我想要包含更多結果的更大模型。

我最終的模型使用了100000個向量詞匯和大約15000篇文章。我設置了200個主題,所以NMF算法需要處理15000×100000, 15000×200和200×100000規模的矩陣。逐漸變換后兩個矩陣來擬合第一個矩陣。
完成模型

最終模型矩陣完成之后,我查看每個主題并檢查關鍵詞(那些在主題-詞語矩陣里有最高概率值的)。我給每個主題一個特定的名字(在可視化當中可以用),并決定是否保留這個主題。一些主題由于和中心話題無關被刪除了(例如本地體育);還有一些太寬泛(關于股票市場或者政治的主題);還有一些太特定了,很可能是NMF算法的誤差(一系列來源于同一篇文章中的有關聯的3-grams)

這個過程之后我有了75個明確和相關的主題,每個都根據內容進行命名了。
分析

主題模型訓練好之后,算出給定文章的不同主題的權重就很容易了:

  • ??? 使用存儲的TF-IDF模型將文章文本向量化。
  • ??? 算出這個向量和精簡過的NMF主題-詞語矩陣的點積。(1x100k * 100k x 75 = 1 x 75 )
  • ??? 結果向量的75個維度表示這篇文章和75個主題有多相關。

更難的部分在于決定怎么把這些權重變成一個能講故事的可視化的形式。如果我只是簡單地將一段時期全部文章的話題權重加起來,這個分布應該是一個關于那段時間中每個主題出現頻率的準確表達。但是,這個分布的組成部分對人類來說毫無意義。換種方式想,如果我對每個主題做一個二分分類,我就能算出一段時間內和一個主題相關的文章百分數。我選擇了這個方法因為它更能說明問題。

話題二分分類也有難度,尤其是這么多文章和話題的情況下。一些文章在很多主題下都有更高的權重,因為他們比較長并且包含的關鍵詞出現在不同主題里。其他一些文章在大多主題下權重都很低,即使人工判斷都能發現它的確和某些主題相關。這些差別決定了固定權重閾值不是一個好的分類方法;一些文章屬于很多主題而一些文章不屬于任何主題。我決定將每篇文章分類到權重最高的三個主題下。盡管這個方法不完美,它還是能提供一個很好的平衡來解決我們主題模型的一些問題。
可視化

盡管數據獲取,主題模型和分析階段對這個項目都很重要,它們都是為最終可視化服務的。我努力平衡視覺吸引力和用戶交互,讓用戶可以不需指導地探索和理解主題的趨勢。我開始的圖使用的是堆疊的區塊,后來我意識到簡單的線畫出來就足夠和清晰了。

我使用d3.js來做可視化,它對本項目數據驅動的模式來說正合適。數據本身被傳到了網頁上,通過一個包含主題趨勢數據的CSV文件和兩個包含主題和文章元數據的JSON文件。盡管我不是前端開發的專家,我還是成功地通過一周的課程學習了足夠的d3,html和css知識,來構建一個令人滿意的可視化頁面。
一些有趣的主題

??? 炭疽熱 ?C 911以后,恐慌情緒籠罩全國。幸運的是,大部分恐慌都是多慮了。2001年晚期的炭疽熱恐慌是一個沒有什么后續影響的孤立事件,如圖中清晰可見。

以911新聞為例演示Python實現數據可視化的教程_第2張圖片

??? 奧薩瑪本拉登,基地組織,托拉博拉 ?C 所有主題中關注的峰值發生在本拉登2011年在阿伯塔巴德被打死之后。這個話題組合值得注意,因為它展現了911事件后媒體關注的演進:最開始,本拉登獲得了很多關注。不久后,托拉博拉話題變得突出,因為托拉博拉是疑似本拉登的藏身地點和美軍的關注重點。當本拉登逃脫了追捕,這兩個話題的關注下降,而更寬泛的基地組織話題有些提升。近幾年每個話題的逐漸提升說明了它們的關聯性。盡管沒有顯著提升,它們相對的關注度還是在其他話題安靜時有所提升。

以911新聞為例演示Python實現數據可視化的教程_第3張圖片

我學到了什么

盡管我提出這個項目的時候就對主題模型和數據處理中的各個組分有了解,這個項目的真正意義在于它(再次)講出的故事。911事件的本質是消極的,但是也有許多積極的故事:許多英雄救了很多人,社區融合,以及重建。

不幸的是,在我主題模型中展現出來這樣的媒體環境:關注負能量、反派和破壞。當然,單獨的一些英雄在一兩篇文章中被贊揚了,但是沒有一個足夠廣來形成一個主題。另一方面,像奧薩瑪?本拉登和卡利亞?穆薩維這樣的反派在很多文章中被提及。即使是理查德?里德,一個笨手笨腳的(試圖)穿炸彈鞋炸飛機的人,都比一些成功的英雄有更持久的媒體影響(一個補充:注重詞匯的主題模型的一個缺點就是,像Reid這樣普通的名字會導致談論不同人物的文章被聚集到一起。在這個例子里,哈利?里德和理查德?里德)。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品亚洲片在线va | 亚洲日本中文字幕永久 | 在线免费国产 | 99视频这里只有精品国产 | 小明成人免费视频 | 一本色道久久88综合亚洲精品高清 | 色视频网站在线观看 | 国产精品男人的天堂 | 国产精品不卡视频 | 天天做天天爱天天影视综合 | 日韩在线观看视频黄 | 久久精品中文 | 亚洲天堂日本 | 91短视频免费观看 | 欧美高清一级片 | 在线看免电影网站 | 亚洲成人精品久久 | 99精品视频在线 | 亚洲视频观看 | 三极片在线观看 | 亚洲AV无码色情第一综合网 | 日日网站| 亚洲视频黄色 | 人人狠狠综合88综合久久 | 国产一区二区三区久久久久久久久 | 日韩欧美亚洲 | 日韩在线 在线播放 | 久久久久成人精品免费播放 | 成人精品视频一区二区三区尤物 | aaa在线 | 超碰香蕉 | 欧美18videos性处按摩 | 成人欧美一区二区三区视频xxx | 国产xxx在线观看 | 精品久久香蕉国产线看观看亚洲 | 麻豆国产一区二区三区四区 | 亚洲高清不卡 | 午夜剧场在线免费观看 | 天天干天天夜 | 精品久久一区二区三区 | 超级97碰碰碰碰久久久久最新 |