當前位置:
首頁 > 知識 > 使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

人們經常抱怨新聞中對重要的主題報道得太少。其中一個主題就是氣候變化。科學上的共識是,這是一個重要的問題,而且人們有理由認為,越多的人意識到它,我們解決它的機會就越大。但我們如何評估各種媒體對氣候變化的報道有多廣泛呢?我們可以使用Python進行一些文本分析!

具體來說,在這篇文章中,我們將嘗試回答哪家新聞媒體對氣候變化報道的最多。同時,我們將學習使用Python分析文本數據的一些技巧,並測試與該數據相關的一個假設。

本教程假設你非常熟悉Python和流行的數據科學包pandas。如果你想重溫一下pandas,請查看這篇文章,如果你需要構建更全面的基礎,Dataquest的交互課程將更深入地涵蓋所有Python和pandas基礎。


發現&研究我們的數據集

在這篇文章中,我們將使用Andrew Thompson提供的來自Kaggle的新聞數據集(沒有關聯)。該數據集包含超過14.2萬篇文章,來自15個來源,大部分來自2016年和2017年,並被分成三個不同的csv文件。以下是Andrew在Kaggle 概覽頁面上展示的文章數量:

使用 Python進行文本分析來檢驗一個假設

稍後,我們將複製我們自己的版本。但有一件事或許值得關注,那就是這些新聞媒體的特點與它們發表的與氣候變化相關的文章的比例之間的相關性。

我們可以看看一些有趣的特徵,包括所有權(獨立、非盈利或公司)和政治傾向(如果有的話)。下面,我做了一些初步的研究,我是從維基百科和供應商自己的網頁上收集的信息。

我還發現了兩個網站,allsides.com和mediabiasfactcheck.com,它們對出版物的自由派和保守派傾向進行了評分,所以我從那裡收集了一些有關政治傾向的信息。

  • Atlantic:
  • Owner: Atlantic Media; majority stake recently sold to Emerson collective, a non-profit founded by Powell Jobs, widow of Steve Jobs
  • Lean Left
  • Breitbart:
  • Owner: Breitbart News Network, LLC
  • Founded by a conservative commentator
  • Right
  • Business Insider:
  • Owner: Alex Springer SE (publishing house in Europe)
  • Center / left-center
  • Buzzfeed News:
  • Private, Jonah Peretti CEO & Kenneth Lerer, executive chair (latter also co-founder of Huffington Post)
  • Lean left
  • CNN:
  • Turner Broadcasting System, mass media
  • TBS itself is owned by Time Warner
  • Lean left
  • Fox News:
  • Fox entertainment group, mass media
  • Lean right / right
  • Guardian:
  • Guardian Media Group (UK), mass media
  • Owned by Scott Trust Limited
  • Lean left
  • National Review:
  • National Review Institute, a non-profit
  • Founded by William F Buckley Jr
  • Right
  • New York Post:
  • News corp, mass media
  • Right / right center
  • New York Times:
  • NY Times Company
  • Lean Left
  • NPR:
  • Non-profit
  • Center / left-center
  • Reuters:
  • Thomson Reuters Corporation (Canadian multinational mass media)
  • Center
  • Talking points memo:
  • Josh Marshall, independent
  • Left
  • Washington Post:
  • Nash Holdings LLC, controlled by J. Bezos
  • Lean left
  • Vox:
  • Vox Media, multinational
  • Lean left / left

仔細研究一下,我們可能會假設右傾的Breitbart與氣候相關的文章所佔的比例,會比NPR等媒體要低。

我們可以把它變成一個正式的假設陳述,我們會在後面做。但首先,讓我們更深入地研究數據。一個術語需要注意:在計算語言學和NLP社區中,像這樣的文本集合稱為語料庫,所以在本文中討論文本數據集時,我們將使用這個術語。

探索性數據分析(EDA)是任何數據科學項目的重要組成部分。它通常涉及以各種方式分析和可視化數據,以便在進行更深入的分析之前尋找模式。不過,在本例中,我們使用的是文本數據而不是數字數據,這使得情況有些不同。

例如,在數值探索性數據分析中,我們通常希望查看數據特性的平均值。但是在一個文本資料庫中是不存在「平均」這個詞的,這使得我們的任務更加複雜。然而,我們仍然可以進行定量和定性的研究來檢查我們的語料庫的一致性。

首先,讓我們重新生成上面的圖表,以確保沒有遺漏任何數據,然後按文章數量進行排序。我們將從覆蓋所有導入開始,讀取數據集,並檢查其三個部分的長度。

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

不過,使用三個獨立的數據集並不方便。我們將把所有三個DataFrame合併成一個,這樣我們就可以更容易地使用整個語料庫:

使用 Python進行文本分析來檢驗一個假設

接下來,我們將確保擁有與原始數據集中相同的發布名稱,並檢查最早年份和最新年份的文章。

使用 Python進行文本分析來檢驗一個假設

像上面看到的那樣將日期存儲為浮點數是不常見的,但我們的CSV文件中就是按這種方式來存儲的。不管怎樣,我們並不打算在任何特別重要的地方使用日期,因此出於本教程的目的,我們將它們保留為浮點數。但是,如果我們在進行不同的分析,我們可能會希望將它們轉換成不同的格式。

我們使用pandas的value_counts()函數來快速查看下我們的文章是什麼時候的。

使用 Python進行文本分析來檢驗一個假設

我們可以看到大部分是最近幾年的文章,但是也包括了一些較老的文章。這很好地達到了我們的目的,因為我們主要關注過去幾年的報道。

現在,我們按名稱對出版物進行排序,以重現Kaggle中的原始圖表。

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

如果你想快速找到一個特定的頭條,這個圖表順序是有用的,但是按文章計數對其進行排序可能更有用,這樣我們就能更好地了解我們的數據的來源。

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

我們想要按單詞來檢查平均文章長度,但同樣重要的是這些單詞的多樣性。我們來看看兩者。

我們將從定義一個函數開始,該函數會刪除標點符號並將所有文本轉換為小寫。(我們沒有做任何複雜的句法分析,所以我們不需要保留句子結構或大寫)。

使用 Python進行文本分析來檢驗一個假設

現在,我們將在我dataframe中創建一個新列,其中包含已清洗的文本。

使用 Python進行文本分析來檢驗一個假設

在上面,我們可以看到我們已經成功地從語料庫中刪除了大寫字母和標點符號,這將使我們能更容易地識別和計數獨特字。

我們來看看每篇文章的平均(平均值)字數,以及我們數據集中最長和最短的文章。

使用 Python進行文本分析來檢驗一個假設

一篇沒有單詞的文章對我們沒有任何用處,所以讓我們看看有多少這樣的文章。我們希望從數據集中刪除沒有單詞的文章。

使用 Python進行文本分析來檢驗一個假設

讓我們去掉這些空文章,然後看看這對我們數據集中每篇文章的平均字數有什麼影響,以及新的最小字數是多少。

使用 Python進行文本分析來檢驗一個假設

在這一點上,它可能有助於我們可視化文章字數的分布,以了解我們的離群值對平均值的影響有多大。讓我們生成另一個圖表來看看:

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

我們的Python文本分析的下一步是:探究文章的多樣性。我們將以每篇文章中獨特字的數量作為開始。要計算這個值,我們需要創建一個文章中單詞的集合,而不是列表。我們可以將這個集合看作有點像列表,但是集合會省略重複的條目。

在官方文檔中有更多關於集合及其工作原理的信息,但我們先看一個關於如何創建一個集合的基本示例。注意,雖然我們是從兩個b條目開始的,但在我們創建的集合中只有一個:

使用 Python進行文本分析來檢驗一個假設

接下來,我們馬上要做幾件事:

對前面創建的tokenized的列中的系列進行操作,我們將從 string庫調用 split函數。然後我們將從我們的系列中獲取集合以消除重複的單詞,然後使用len()測量集合的大小。

最後,我們將把結果添加到一個新列中,其中包含每篇文章中獨特字的數量。

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

我們還想看看每篇文章的獨特字的平均字數,以及最小和最大的獨特字計數。

使用 Python進行文本分析來檢驗一個假設

當我們將其繪製成圖表時,我們可以看到,儘管獨特字的分布仍然是歪斜的,但它看起來更像一個正態分布(高斯分布),而不是基於我們之前生成的單詞總數的分布。

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

我們也來看看這兩個度量文章長度的方法在不同的出版物中是如何變化的。

為此,我們將使用pandas的groupby函數。關於這個功能強大的函數的完整文檔可以在這裡找到,但是對我們這裡的目的來說,我們只需要知道它允許我們通過另一列的值以不同的方式不同的度量標準來進行aggregate(合計)或求總和。

在本例中,這個列就是publication。第一個圖表通過對len進行合計只使用每個組中的對象數量。我們可以在下面的代碼中使用除title之外的任何其他列。

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

現在我們將分別對單詞的平均數和獨特字數量進行合計。

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

最後,我們來看看整個語料庫中最常見的單詞。

我們將使用一個Python Counter,這是一種特殊的字典,它假定每個鍵的值為整數類型。在這裡,我們將使用文章的標記化版本來遍歷所有文章。

使用 Python進行文本分析來檢驗一個假設

但是,當我們在計數最常見的單詞時,我們並不想把所有的單詞都包括在我們的計數中。在書面英語中,有許多單詞是如此常見,以至於在任何分析中,它們都很可能是最常見的單詞。對它們進行計數並不能告訴我們關於文章內容的任何信息。在NLP和文本處理中,這些單詞被稱為「stopwords」。常見的英語stopwords停頓詞列表包括「and」、「or」和「such」等單詞。

記得我們在這個項目開始的地方從nltk.corpus導入了stopwords模塊,所以現在我們來看看什麼單詞包含在這個預先製作的stopwords列表中:

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

正如我們所見,這是一個很長的列表,沒有一個詞可以確切告訴我們一個文章的意思。我們使用這個列表來刪除Counter中的stopword。

使用 Python進行文本分析來檢驗一個假設

為了進一步過濾我們的單詞計數來得到有用的信息,Counter有一個方便的most_common方法,我們可以在這裡使用它來查看Counter找到的最常用的單詞。使用這個函數,我們可以指定想要查看的結果的數量。在這裡,我們將要求它列出最常見的20個單詞。

使用 Python進行文本分析來檢驗一個假設

在上面,我們可以看到一些非常容易預測到的單詞,但也有一點令人驚訝: u顯然是最常見的單詞之一。這聽起來可能有些奇怪,但它就是從文章中經常使用「U.S.」和「U.N.」這樣的縮寫詞這一事實中得出來的。

這有點奇怪,但請記住,目前我們只是在研究數據。我們想要檢驗的實際假設是: 氣候變化報道可能與媒體的某些方面有關,比如其所有權或政治傾向。在我們的語料庫中,u作為一個單詞的存在根本不可能影響這個分析,所以我們可以讓它保持原樣。

我們還可以在其他領域對這個數據集進行更多的清理和細化,但這可能沒有必要。相反,讓我們進入下一步:測試我們最初的假設是否正確。

文本分析: 檢驗我們的假設

我們如何檢驗我們的假設?首先,我們必須確定哪些文章是關於氣候變化的,然後我們必須通過文章類型來比較這些報道。

我們如何判斷一篇文章是否在談論氣候變化?有幾種方法可以做到這一點。我們可以使用高級文本分析技術(如集群或主題建模)來識別概念。但是對於本文的目的來說,我們保持簡單一些:讓我們只識別可能與主題相關的關鍵字,並在文章中搜索它們。只要頭腦風暴一些有趣的單詞和短語就可以了。

當我們列出這些短語時,我們必須小心避免使用諸如「環境」或「可持續性」之類的模糊辭彙。這些辭彙可能與環保主義有關,但也可能與政治環境或商業可持續性有關。即使是「氣候」也可能不是一個有意義的關鍵詞,除非我們能確定它與「變化」密切相關。

我們需要做的是創建一個函數來確定一篇文章是否包含我們感興趣的單詞。為此,我們將使用regex,也叫正則表達式。如果你需要複習一下,本文更詳細地介紹了Python中的正則表達式。除了這個Regex,我們還將搜索cc_wds參數中定義的其他幾個短語的精確匹配。

在尋找有關氣候變化的話題時,我們必須謹慎一點。我們不能用「change」這個詞,因為那樣會把「changing」這類相關的詞去掉。

因此,下面是我們如何過濾它的過程: 我們想要在1到5個單詞之內找到後面跟著chang字元串的climate字元串(在正則表達式中,w+會匹配一個或多個單詞字元,而W+會匹配一個或多個非單詞字元)。

我們可以使用 | 來表示邏輯or,所以我們也可以在1到5個單詞之內匹配到後面跟著chang字元串的climate字元串。1到5個單詞的部分是正則表達式的一部分,它看起來像這樣:(?:w+ W+){1,5}?。

總之,搜索這兩個字元串可以幫助我們識別任何提到氣候變化、正在變化的氣候等的文章。

使用 Python進行文本分析來檢驗一個假設

這裡詳細展示了這個函數部分是如何運行的:

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

正如我們所看到的,這一切都在按計划進行——它與氣候變化的真實含義相匹配,而不是因「變化」一詞在其他語境中的使用而被拋棄。

現在,讓我們使用我們的函數創建一個新的布爾欄位來指示我們是否找到了相關的單詞,然後看看在我們的數據集中的前五篇文章中是否提到了氣候變化:

使用 Python進行文本分析來檢驗一個假設

我們數據集中的前五篇文章沒有提到任何關於氣候變化的內容,但是我們知道我們的函數在按照我們之前測試的預期運行,所以現在我們可以開始對新聞報道進行一些分析。

回到我們最初的目標,即比較不同來源的有關氣候變化主題的報道,我們可以考慮計算每個來源發表的氣候相關文章的數量,並對不同來源進行比較。但是,當我們這樣做時,我們需要考慮文章總數的差異。如果來自一個新聞報道的氣候相關的文章數量較大,可能只是因為該新聞報道總體上發表的文章數量更多。

我們需要做的是計算氣候相關文章的相對比例。我們可以在布爾欄位(如cc_wds)上使用sum函數來計算True值的數量,並用它除以已發表文章的總數以得到我們的比例。

讓我們從查看所有來源的總比例開始,並以此作為一個基線來比較每個新聞報道:

使用 Python進行文本分析來檢驗一個假設

我們看到有關氣候報道的文章在所有文章中的比例為3.1%,這是一個相當低的比例,但從統計學的角度來看這並沒有什麼問題。

接下來我們要計算每組的相對比例。讓我們通過查看每個發布源的比例來用圖示說明這是如何工作的。我們將再次使用groupby對象和sum,但這次我們想要每個組的文章數量,我們可以通過count函數得到:

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

現在,讓我們將表中數據分解成比例,並對列表進行排序,這樣我們就可以快速地看到哪些媒體對氣候變化的報道最多:

使用 Python進行文本分析來檢驗一個假設

這一比例從NewYorkPost的0.7%到Vox的8%不等。我們來繪製圖表,先按發布名稱排序,然後再按值排序。

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

我們還可以做其他各種探索性的數據分析,但我們先把這些放在一邊,繼續我們的目標,即校驗一個關於我們的語料庫的假設。

檢驗假設

在這篇文章中,我們不會對假設檢驗及其細微之處做一個完整的敘述;要了解Python中的概率論,請訪問這篇文章,而對於統計假設檢驗的詳細信息,Wikipedia是一個不錯的繼續學習的地方。

我們將在這裡演示一種形式的假設檢驗。

回想一下,我們一開始非正式地假設出版特徵可能與他們所發表的與氣候相關的文章的優勢有關。這些特徵包括政治傾向和所有權。例如,我們與政治傾向有關的零假設非正式地說明,在比較具有不同政治傾向的文章時,在提及氣候變化這一方面它們是沒有區別的。我們來更正式一點的說。

如果我們看一下出版物的左傾和右傾的政治傾向,我們將左傾的出版物稱為「左」,右傾的出版物稱為「右」,我們的零假設是,「左」的氣候變化文章數量比例等於「右」的氣候變化文章數量比例。我們的備擇假設是這兩個總體的比例是不相等的。我們可以用其他群體分組和相似的假設來代替其他政治傾向比較或其他出版特徵。

讓我們從政治傾向開始。你可以重新瀏覽這篇文章的頂部來提醒自己我們是如何收集有關媒體的政治傾向的信息的。下面的代碼使用一個字典來根據收集到的信息為每個發布名稱分配left、right和center值。

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

我們再次使用groupby()來查找每個政治分組中氣候變化文章的比例。

使用 Python進行文本分析來檢驗一個假設

讓我們看看每組中有多少篇文章,並對其繪製圖表:

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

從上面的圖表中可以明顯看出,不同的政治傾向分組中氣候變化相關文章所佔的比例是不同的,但是讓我們來正式檢驗一下我們的假設。為此,對於給定的一對文章分組,我們先提出零假設,即假設與氣候相關的文章的總體比例沒有差異。我們也為我們的校驗建立一個95%的置信水平。

一旦我們收集了統計數據,我們就可以使用P值或置信區間來確定我們的結果是否具有統計意義。這裡我們使用置信區間,因為我們感興趣的是這個差值在什麼範圍可能反映總體比例的差異。我們對假設檢驗感興趣的統計量是兩個樣本中氣候變化文章所佔總體比例的差異。回憶一下,置信區間和顯著性檢驗之間有密切的關係。具體來說,如果一個統計量在0.05水平上顯著不同於零,則95%置信區間將不包含0。

換句話說,如果0在我們計算的置信區間內,那麼我們就不會拒絕零假設。但如果不在,我們就可以說相關文章的比例差異具有統計學意義。我想藉此機會指出置信區間中一個常見的誤解:95%區間給出了一個區域,如果我們重新採樣,那麼在95%的情況下,該區間將包含真實的(總體)比例差異。並不是說95%的樣本都在該區間內。

為了計算該置信區間,我們需要一個點估計和一個誤差範圍; 後者由臨界值乘以標準誤差組成。對於比例差異,我們對它的點估計值是p 1- p2,其中p1和p2是我們的兩個樣本比例。在95% 的CI下,臨界值是1.96。接下來,我們的標準誤差是:

使用 Python進行文本分析來檢驗一個假設

最後,置信區間是 (點估計 ± 臨界值 X 標準誤差), 或者:

使用 Python進行文本分析來檢驗一個假設

我們使用一些輔助函數來把我們的數字代入這些公式。

使用 Python進行文本分析來檢驗一個假設

最後,calc_ci_range函數會將所有內容整合在一起。

使用 Python進行文本分析來檢驗一個假設

我們來計算一下傾向分組的置信區間,先看看「左」相對於「右」。

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

查看「左」相對於「右」出版物的比例差異,可以看到,我們的置信區間在1.8%到2.1%之間。這是一個相當窄的範圍,並且相對於總體比例差異範圍來說,也遠遠地遠離零。拒絕零假設是顯而易見的。同樣,center對left的範圍是1.3%到2.1%:

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

Because the assignment of publications to bias slant is somewhat subjective,

由於對出版物的分配從偏差偏倚的角度來看是有點主觀的,這裡有另一種變體,即將BusinessInsider、NYPost和NPR放入center中。

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

接下來,我們可以使用相同的方法查看出版物的所有權。我們將我們的總體樣本分為四組,LLC(有限責任公司),corporation(有限公司),非營利組織和私人。

使用 Python進行文本分析來檢驗一個假設

現在讓我們來對該數據繪製圖表,看看不同類型的公司是否以不同的比例報導氣候變化。

使用 Python進行文本分析來檢驗一個假設

使用 Python進行文本分析來檢驗一個假設

或許結果一點也不意外,私營媒體和非營利媒體對氣候變化的報導似乎比有限公司和有限責任公司要多一些。但我們來更仔細地看看前兩個公司,即有限責任公司和有限公司在比例上的差異:

使用 Python進行文本分析來檢驗一個假設

這裡,置信區間是0.3%到0.7%,比之前的差異更接近於0,但仍然不包括0。我們可以預計從非盈利媒體到有限責任公司的區間也不包括零:

使用 Python進行文本分析來檢驗一個假設

非營利媒體到有限責任公司的置信區間為0.6%至1.2%。最後,看看私人媒體相對於非盈利媒體的情況,我們發現置信區間是-0.3%到0.5%:

使用 Python進行文本分析來檢驗一個假設

因此,在這種情況下,我們可以得出結論,在與氣候變化相關的文章中,這兩個總體的比例沒有顯著差異,不像我們比較過的其他總體。

總結: 進行文本分析來檢驗一個假設

在這篇文章中,我們對一個大型的新聞文章語料庫進行了一些文本分析,並檢驗了關於它們內容差異的一些假設。具體來說,使用一個95%的置信區間,我們估計了不同新聞來源之間關於氣候變化討論的差異。

我們發現了一些有趣的差異,這些差異是統計顯著性的,包括右傾新聞來源對氣候變化的報道更少,有限公司和有限責任公司對氣候變化的報道比非盈利媒體和私人媒體更少。

然而,就處理這個語料庫而言,我們接觸的只是冰山一角。你可以嘗試使用這些數據進行許多有趣的分析,因此你可以自己從Kaggle下載這些數據並開始編寫你自己的文本分析項目!

延伸閱讀

Olteanu, A, et al. 「比較在線新聞和社交媒體的事件報道:氣候變化的案例」,第九屆國際AAAI網路與社交媒體會議論文集(2015)。


英文原文:https://www.dataquest.io/blog/tutorial-text-analysis-python-test-hypothesis/

譯者:憂鬱的紅秋褲

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

PEP 570:Positional-Only 參數
將Python用於NLP:Pattern 庫簡介

TAG:Python部落 |