TM02. Collocation
分析完單一文字的詞頻後,通常會開始思考「用詞的脈絡」。用操作型定義來說就是,哪些字會出現在某個詞的附近?又哪些字經常會在一起出現?這類的方法可以從Collocation開始談起。
Def. Collocation [Wikipedia:collocation]. In corpus linguistics, a collocation is a series of words or terms that co-occur more often than would be expected by chance. In phraseology, collocation is a sub-type of phraseme. An example of a phraseological collocation, as propounded by Michael Halliday,[1] is the expression strong tea. While the same meaning could be conveyed by the roughly equivalent powerful tea, this expression is considered excessive and awkward by English speakers.
本單元將依照政大資科黃瀚萱老師的教材建議採用一個較長文本《共產黨宣言(The Communist Manifesto)》來介紹Collocation,並測試能否找到一些該文本的特徵。該文件可由Project Gutenberg免費電子書處下載,你也可以下載其他的英文書籍來做測試,以觀察文本間的差異。
1. 詞頻
載入資料
注意事項:讀取資料的時候,請注意這個範例是把corpus02.txt這個檔案放在名為data的資料夾裡,如果你讀取不到該資料的話,請自行調整一下檔案的路徑。
with open("data/corpus02.txt", encoding="utf8") as fin:
text = fin.read()
print("Number of characters: %d" % len(text))Number of characters: 75346
文字前處理
篩去停用詞的時機。當在處理單一文字時,若為一般性目的通常會篩去停用詞,例如要找到文本中的關鍵字就不需要這些停用詞,但也有些狀況是要保留停用詞的,比方說,你要研究美國總統候選人的說話習慣,通常這種「說話習慣」的分析在詞頻上可有兩種面向,一種是他會用什麼生冷或特殊字詞?另一種是,他講話習慣上會怎麼使用主持、連結詞等。第二種的範例就比方說,他會怎麼用We、You、I這類代名詞,這類代名詞分析往往是演講稿的分析的主要結果,甚至會發現在前後兩次競選候選人的說話習慣差異。就Collocation(詞對)分析而言,一樣要去取捨要不要篩去停用詞,但更要去評估篩去停用詞的時機,比方說,是在建立詞對前做篩除,還是在建立詞對後?若在建立詞對後,要用「且」或者是「或」的條件?這些取捨受文本型態影響,也會影響到後續的分析與詮釋。
前面我提到文本型態指的是什麼?比方說,Twitter分析、新聞內文分析、演講稿、書籍、研究論文的用字和風格都差非常多,所以,必須要根據文本特性來做分析。比方說,假設我現在有數萬篇研究論文的摘要,每篇論文摘要都有好幾個句子,但這些句子大體可分為是對BACKGROUND、MOTIVATION、METHOD、RESULTS、DISCUSSION的描述,當我要判斷這些句子究竟是哪一類型的描述時,通常我不會針對句子或文本的特有關鍵字去做分析,因為這些關鍵字是該文本特有的用詞,無助於分析出是哪一類型的句子。反倒是,我們只要看到The result shows that或者we conclude或we review...等再一般也不過的片語時,就知道他是在描述哪一種類型的句子。因此,在這種案例,我會選擇不要去除停用詞來做分析。
NLTK斷詞與停用詞庫下載。若要應用NLTK來斷詞或去除停用詞的話,必須要下載NLTK的詞庫,如下面的nltk.download('punkt')與stopword_list = stopwords.words('english')。但如果已經下載過了(例如你有照著本書TM01. Term frequency操作過程做的話便會需要下載),那就不用再次下載。
import nltk
# nltk.download('punkt')
from nltk.tokenize import word_tokenize
# from nltk.corpus import stopwords
# stopword_list = stopwords.words('english')
raw_tokens = word_tokenize(text)
tokens = []
for token in raw_tokens:
if token.isalpha():
# if token.lower() not in stopword_list:
tokens.append(token.lower())
print("Number of tokens: %d" % len(tokens))印出文本中的常見的關鍵字
2. 詞對 Collocation
N-Grams:Collocation的概念可從N-Grams開始講起,所謂的N-Grams指的是把文本中的文字當成一個長長的List,每次只兩兩、三三、四四取出N個字。例如"Programming for Social Scientists"的
2-grams就是
["Programming for", "for Social", "Social Scientists"]3-grams是
["Programming for Social", "for Social Scientists"],依此類推。
Collocation的概念。Collocation指的是詞對,但怎樣的詞可以是一對的概念卻是彈性的,也就是說,我們常常在閱讀文章的時候,會覺得某兩個字老是一起出現,這兩個字可能會出現在前後,但也不一定會緊鄰,可能會隔幾個字,到底隔幾個字就可以算他們似乎在一起出現,這也是可以彈性定義的。N-Grams指的就是前後字才算,但Collocation並沒有這麼嚴謹的定義,大致上可以分為以下四種,我們將在本節中一一介紹。
Frequency-based:一定距離內的詞對出現頻率
Mean and Variance:並非單計算出現頻率,還要考慮詞對距離
Hypothesis Testing:用統計方法來檢驗詞對出現頻率的顯著性
Mutual Information:用機率的概念來檢驗詞對出現的相依與獨立性
計算並印出文本中的常見詞對
(('working', 'class'), 23)
去除停用詞
3. 考慮詞對平均距離
在前面我們僅考慮2-grams也就是前後字的狀況。但往往詞對在應用上可能中間會插入若干個字,例如「open...door」這樣的兩個字可能就可以有以下數種情形,估計一下「open...door」的平均距離差不多是2到4之間。
open the door
open the black door
open the third closet door
open a bottle of wine and put on the table near the door
計算詞彙距離
用平均距離來篩選詞對
觀察詞對:平均詞對距離
以下分別是篩除只出現一次的詞對後,分別找出平均距離最大、最小和中間的詞對(注意,排序的依據是平均距離,不是詞對數量)。請觀察看看,依據平均距離來排序的話,和詞對的出現頻率相較下,可以獲得什麼樣不同的資訊?然後觀察比較看看,平均距離最大、中間和最小的各20個詞對,哪一個能夠獲得最多得以理解文本的資訊?
觀察詞對:詞對距離的標準差
相同比較基準下看標準差,所獲得的是詞對距離的變異性,如果一個詞對的距離總是相同,那代表變異性很低,很固定;如果詞對距離變異性很大,那標準差就會高。像下面的Top20是標準差最高的(因為剛好兩對,一對應該是8、一對是距離1,所以除以二後距離恰成4.5)。由於高標準差的均是出現頻率最少的,所以,觀察Top20能獲得的資訊不多;但觀看Bottom20,也發現大部分都是兩對的詞對,而距離都一樣,所以標準差是0。因此,觀察Top20和Bottom20能夠獲得的資訊,單純就這邊的結果來說,似乎無法提供有意義的資訊,主因是Top20和Bottom20都是那些兩對的。據此,在下一節,我們原本只列計超過一次的詞對,但我們可以把他改為,只列計超過10對的詞對來觀察結果。
其公式為

觀察詞對:只考慮高頻詞對
由於在前一節發現低頻詞對下的詞對距離平均與標準差會使得我們難以觀察文本特徵,於是,在這一節我們要把納入計算的門檻值提高到超過10,來看看能不能得到一些有用的資訊。觀看變異性最低的前20對,終於可以看到一些,出現頻率高但詞對距離很穩定的詞對。
4. Pearson's Chi-Square Test
我們也可以用統計檢定來找到顯著的詞對。通常有t-test與Chi-square兩種,但是t-test需要有機率分佈近似常態的假設。Chi-square則概念上相對容易理解。
Chi-square的定義


設計Chi-square函式
回到二元詞組 Back to bigrams
計算每一詞對的chi-square
調整結果(TopN, 篩除停用詞)
5. Mutual Information (MI)
另一個現在常用來評估兩個詞間的相依關係的方法是Mutual Information(MI),又稱Pointwise Mutual Information(PMI)。詳細情形可看Wikipedia:Mutual Information。
在概率論和資訊理論中,兩個隨機變數的相互資訊(mutual Information,簡稱MI)或轉移資訊(transinformation)是變數間相互依賴性的量度。不同於相關係數,相互資訊並不局限於實值隨機變數,它更加一般且決定著聯合分布 p(X,Y) 和分解的邊緣分布的乘積 p(X)p(Y) 的相似程度。相互資訊是點間相互資訊(PMI)的期望值。from Wikipedia:Mutual Information(中文)
PMI的概念如下,P(x, y)代表x與y一起出現的機率,你可以想像說,如果P(x, y)中的x與y相互獨立的話,那P(x, y)就會等於P(x)P(y)就會等於分母,這樣兩者一除為1再取log就會變成零。所以,若x與y相互獨立的話,那麼PMI就是0,否則就會比0大。

Define a mutual information function

Computing MI
<練習>詞對分析方法的比較
請試著比較並討論,與Mutual Information相比,Frequency based 的缺點是什什 麼?
處理 metamorphosis_franz_kafka.txt(卡夫卡變形記),找出三種 collocations
Frequency-based
Chi-square test
Mutual information
如果今天我要用Collocation的方法來比較Metamorphosis和The Communist Manifesto兩本書的差別,你認為可能會有什麼樣的差別?要怎麼比?
metamorphosis_franz_kafka.txt 裡有很多對話或⾃自⾔言⾃自語,⽤用雙 引號區別。請只⽤用括號裡的⽂文字,建立collocations
"Oh, God", he thought, "what a strenuous career it is that I’ve chosen! Travelling day in and day out. Doing business like this takes much more effort than doing your own business at home, and on top of that there's the curse of travelling, worries about making train connections, bad and irregular food, contact with different people all the time so that you can never get to know anyone or become friendly with them. It can all go to Hell!" He felt a slight itch up on his belly; pushed himself slowly up on his back towards the headboard so that he could lift his head better;
<練習>斷句對詞對分析的影響
Last updated