亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

以911新聞為例演示Python實(shí)現(xiàn)數(shù)據(jù)可視化的教程

系統(tǒng) 1691 0

本文介紹一個(gè)將911襲擊及后續(xù)影響相關(guān)新聞文章的主題可視化的項(xiàng)目。我將介紹我的出發(fā)點(diǎn),實(shí)現(xiàn)的技術(shù)細(xì)節(jié)和我對(duì)一些結(jié)果的思考。

以911新聞為例演示Python實(shí)現(xiàn)數(shù)據(jù)可視化的教程_第1張圖片

簡(jiǎn)介

近代美國(guó)歷史上再?zèng)]有比911襲擊影響更深遠(yuǎn)的事件了,它的影響在未來(lái)還會(huì)持續(xù)。從事件發(fā)生到現(xiàn)在,成千上萬(wàn)主題各異的文章付梓。我們?cè)鯓幽芾脭?shù)據(jù)科學(xué)的工具來(lái)探索這些主題,并且追蹤它們隨著時(shí)間的變化呢?
靈感

首先提出這個(gè)問(wèn)題的是一家叫做Local Projects的公司,有人委任它們?yōu)榧~約的國(guó)家911博物館設(shè)置一個(gè)展覽。他們的展覽,Timescape,將事件的主題和文章可視化之后投影到博物館的一面墻上。不幸的是,由于考慮到官僚主義的干預(yù)和現(xiàn)代人的三分鐘熱度,這個(gè)展覽只能展現(xiàn)很多主題,快速循環(huán)播放。Timescape的設(shè)計(jì)給了我啟發(fā),但是我想試著更深入、更有交互性,讓每個(gè)能接入互聯(lián)網(wǎng)的人都能在空閑時(shí)觀看。

這個(gè)問(wèn)題的關(guān)鍵是怎么講故事。每篇文章都有不同的講故事角度,但是有線索通過(guò)詞句將它們聯(lián)系到一起?!監(jiān)sama bin Laden”、 “Guantanamo Bay”、”Freedom”,還有更多詞匯組成了我模型的磚瓦。
獲取數(shù)據(jù)

所有來(lái)源當(dāng)中,沒(méi)有一個(gè)比紐約時(shí)報(bào)更適合講述911的故事了。他們還有一個(gè)神奇的API,允許在數(shù)據(jù)庫(kù)中查詢關(guān)于某一主題的全部文章。我用這個(gè)API和其他一些Python網(wǎng)絡(luò)爬蟲(chóng)以及NLP工具構(gòu)建了我的數(shù)據(jù)集。

爬取過(guò)程是如下這樣的:

  • ??? 調(diào)用API查詢新聞的元數(shù)據(jù),包括每篇文章的URL。
  • ??? 給每個(gè)URL發(fā)送GET請(qǐng)求,找到HTML中的正文文本,提取出來(lái)。
  • ??? 清理文章文本,去除停用詞和標(biāo)點(diǎn)

我寫(xiě)了一個(gè)Python腳本自動(dòng)做這些事,并能夠構(gòu)建一個(gè)有成千上萬(wàn)文章的數(shù)據(jù)集。也許這個(gè)過(guò)程中最有挑戰(zhàn)性的部分是寫(xiě)一個(gè)從HTML文檔里提取正文的函數(shù)。近幾十年來(lái),紐約時(shí)報(bào)不時(shí)也更改了他們HTML文檔的結(jié)構(gòu),所以這個(gè)抽取函數(shù)取決于笨重的嵌套條件語(yǔ)句:
?

            
# 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 = ''

          

文檔向量化

在我們應(yīng)用機(jī)器學(xué)習(xí)算法之前,我們要將文檔向量化。感謝scikit-learn的IT-IDF Vectorizer模塊,這很容易。只考慮單個(gè)詞是不夠的,因?yàn)槲业臄?shù)據(jù)集里并不缺一些重要的名字。所以我選擇使用n-grams,n取了1到3。讓人高興的是,實(shí)現(xiàn)多個(gè)n-gram和實(shí)現(xiàn)單獨(dú)關(guān)鍵詞一樣簡(jiǎn)單,只需要簡(jiǎn)單地設(shè)置一下Vectorizer的參數(shù)。
?

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

          

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

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

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

因?yàn)橹黝}模型是整個(gè)項(xiàng)目的基石,我在構(gòu)建過(guò)程中做的決定對(duì)最終成果有很大影響。我決定輸入模型的文章為911事件發(fā)生18個(gè)月以后的。在這個(gè)時(shí)間段喧囂不再,所以這段時(shí)間出現(xiàn)的主題的確是911事件的直接結(jié)果。在向量化的階段,開(kāi)始幾次運(yùn)行的規(guī)模受限于我的計(jì)算機(jī)。20或者30個(gè)主題的結(jié)果還不錯(cuò),但是我想要包含更多結(jié)果的更大模型。

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

最終模型矩陣完成之后,我查看每個(gè)主題并檢查關(guān)鍵詞(那些在主題-詞語(yǔ)矩陣?yán)镉凶罡吒怕手档模?。我給每個(gè)主題一個(gè)特定的名字(在可視化當(dāng)中可以用),并決定是否保留這個(gè)主題。一些主題由于和中心話題無(wú)關(guān)被刪除了(例如本地體育);還有一些太寬泛(關(guān)于股票市場(chǎng)或者政治的主題);還有一些太特定了,很可能是NMF算法的誤差(一系列來(lái)源于同一篇文章中的有關(guān)聯(lián)的3-grams)

這個(gè)過(guò)程之后我有了75個(gè)明確和相關(guān)的主題,每個(gè)都根據(jù)內(nèi)容進(jìn)行命名了。
分析

主題模型訓(xùn)練好之后,算出給定文章的不同主題的權(quán)重就很容易了:

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

更難的部分在于決定怎么把這些權(quán)重變成一個(gè)能講故事的可視化的形式。如果我只是簡(jiǎn)單地將一段時(shí)期全部文章的話題權(quán)重加起來(lái),這個(gè)分布應(yīng)該是一個(gè)關(guān)于那段時(shí)間中每個(gè)主題出現(xiàn)頻率的準(zhǔn)確表達(dá)。但是,這個(gè)分布的組成部分對(duì)人類來(lái)說(shuō)毫無(wú)意義。換種方式想,如果我對(duì)每個(gè)主題做一個(gè)二分分類,我就能算出一段時(shí)間內(nèi)和一個(gè)主題相關(guān)的文章百分?jǐn)?shù)。我選擇了這個(gè)方法因?yàn)樗苷f(shuō)明問(wèn)題。

話題二分分類也有難度,尤其是這么多文章和話題的情況下。一些文章在很多主題下都有更高的權(quán)重,因?yàn)樗麄儽容^長(zhǎng)并且包含的關(guān)鍵詞出現(xiàn)在不同主題里。其他一些文章在大多主題下權(quán)重都很低,即使人工判斷都能發(fā)現(xiàn)它的確和某些主題相關(guān)。這些差別決定了固定權(quán)重閾值不是一個(gè)好的分類方法;一些文章屬于很多主題而一些文章不屬于任何主題。我決定將每篇文章分類到權(quán)重最高的三個(gè)主題下。盡管這個(gè)方法不完美,它還是能提供一個(gè)很好的平衡來(lái)解決我們主題模型的一些問(wèn)題。
可視化

盡管數(shù)據(jù)獲取,主題模型和分析階段對(duì)這個(gè)項(xiàng)目都很重要,它們都是為最終可視化服務(wù)的。我努力平衡視覺(jué)吸引力和用戶交互,讓用戶可以不需指導(dǎo)地探索和理解主題的趨勢(shì)。我開(kāi)始的圖使用的是堆疊的區(qū)塊,后來(lái)我意識(shí)到簡(jiǎn)單的線畫(huà)出來(lái)就足夠和清晰了。

我使用d3.js來(lái)做可視化,它對(duì)本項(xiàng)目數(shù)據(jù)驅(qū)動(dòng)的模式來(lái)說(shuō)正合適。數(shù)據(jù)本身被傳到了網(wǎng)頁(yè)上,通過(guò)一個(gè)包含主題趨勢(shì)數(shù)據(jù)的CSV文件和兩個(gè)包含主題和文章元數(shù)據(jù)的JSON文件。盡管我不是前端開(kāi)發(fā)的專家,我還是成功地通過(guò)一周的課程學(xué)習(xí)了足夠的d3,html和css知識(shí),來(lái)構(gòu)建一個(gè)令人滿意的可視化頁(yè)面。
一些有趣的主題

??? 炭疽熱 ?C 911以后,恐慌情緒籠罩全國(guó)。幸運(yùn)的是,大部分恐慌都是多慮了。2001年晚期的炭疽熱恐慌是一個(gè)沒(méi)有什么后續(xù)影響的孤立事件,如圖中清晰可見(jiàn)。

以911新聞為例演示Python實(shí)現(xiàn)數(shù)據(jù)可視化的教程_第2張圖片

??? 奧薩瑪本拉登,基地組織,托拉博拉 ?C 所有主題中關(guān)注的峰值發(fā)生在本拉登2011年在阿伯塔巴德被打死之后。這個(gè)話題組合值得注意,因?yàn)樗宫F(xiàn)了911事件后媒體關(guān)注的演進(jìn):最開(kāi)始,本拉登獲得了很多關(guān)注。不久后,托拉博拉話題變得突出,因?yàn)橥欣├且伤票纠堑牟厣淼攸c(diǎn)和美軍的關(guān)注重點(diǎn)。當(dāng)本拉登逃脫了追捕,這兩個(gè)話題的關(guān)注下降,而更寬泛的基地組織話題有些提升。近幾年每個(gè)話題的逐漸提升說(shuō)明了它們的關(guān)聯(lián)性。盡管沒(méi)有顯著提升,它們相對(duì)的關(guān)注度還是在其他話題安靜時(shí)有所提升。

以911新聞為例演示Python實(shí)現(xiàn)數(shù)據(jù)可視化的教程_第3張圖片

我學(xué)到了什么

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

不幸的是,在我主題模型中展現(xiàn)出來(lái)這樣的媒體環(huán)境:關(guān)注負(fù)能量、反派和破壞。當(dāng)然,單獨(dú)的一些英雄在一兩篇文章中被贊揚(yáng)了,但是沒(méi)有一個(gè)足夠廣來(lái)形成一個(gè)主題。另一方面,像奧薩瑪?本拉登和卡利亞?穆薩維這樣的反派在很多文章中被提及。即使是理查德?里德,一個(gè)笨手笨腳的(試圖)穿炸彈鞋炸飛機(jī)的人,都比一些成功的英雄有更持久的媒體影響(一個(gè)補(bǔ)充:注重詞匯的主題模型的一個(gè)缺點(diǎn)就是,像Reid這樣普通的名字會(huì)導(dǎo)致談?wù)摬煌宋锏奈恼卤痪奂揭黄?。在這個(gè)例子里,哈利?里德和理查德?里德)。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 好吊妞人成免费视频观看 | 国产一区精品 | 99国产在线| 久久久久一区二区三区 | 国产精品九九九久久九九 | 有色视频在线观看 | 久久国产欧美日韩精品 | 亚洲精品久久婷婷爱久久婷婷 | 色天天干 | 久草国产精品视频 | 日日狠狠的日日日日 | 亚洲网站在线看 | 日日搞夜夜操 | 中文字幕在线视频观看 | 天天操天天干天天射 | 精品亚洲成a人7777在线观看 | 四虎影视库永久在线地址 | 亚洲欧美人成综合在线最新 | 久久爱影视i | 久草美女| 四虎精品永久在线网址 | www.免费黄色 | 精品久久久久久中文字幕专区 | 精品九九在线 | 国产成人精品一区二区免费 | 日日摸夜夜爽 | 免费一级特黄a | 亚洲 国产 路线1路线2路线 | 国产精品v免费视频 | 欧美91| 亚洲欧美另类日韩 | 性感美女香蕉视频 | 爱我久久国产精品 | ass曰本人乱妇ass | 国产精品国产欧美综合一区 | 免费黄色的视频 | 欧美午夜性刺激在线观看免费 | 亚洲精品久久久久中文字幕一区 | 四虎影| a色视频| 久久天堂成人影院 |