# N-gram 在自然語言處理這個領域中,語言模型 (Language model) 是一個經常被使用到的工具。在諸如翻譯、問答、文本產生等等的任務當中,我們經常會需要去判斷電腦產生出來的句子是否接近人類會講出來的自然語言,因此我們需要有一種「評估一句話有多像真人講出來的話」的方法,而這個方法就是語言模型。 建構一個語言模型的步驟如下: 1. 蒐集大量的文本,這些文本可以來自報章雜誌、期刊論文、經典名著,甚至網路論壇等等。蒐集到的文本將會是許多的句子。 2. 將文本中的句子進行斷詞,並統計各個斷出來的詞出現的機率。每一個被斷出來的詞,被稱作一個 1-gram。 3. 句子往往是由多個詞組成的結構。所以每一個詞出現的機率,應該和這個詞之前出現的詞有關,例如我們會說『晚餐真好吃』但比較不可能說出『天氣真好吃』,因為『好吃』不太可能用形容『天氣』。因此我們可以修改 1-gram 的方法,將給一個詞 m 出現的機率看成 P (m | m之前一個字、m之前兩個字 ... m之前n-1個字)出現的條件機率。這個種根據詞之前的內容計算機率的方法就叫作 n-gram。 4. 因為文本並不能太大,所以如果n-gram 方法的 n 很大的話,每一個詞出現的機率可能都很低,因為文本搜集需要網羅各個領域的文章,幾乎不可能有重複的句子,所以一般而言,n 通常小於 4。 6. 當我們好奇一個句子出現在文本中的機率時,我們可以利用該句子的組成成份依照順序出現的條件機率,來定義該句子的出現機率。以「商品和服務」這個句子為例,我們可以利用 2-gram 以下的算式來算出這個句子的出現機率: P(商品和服務) = P(商品|BOS) * P(和|商品) * P(服務|商品) * P(商品 | EOS) 其中,BOS 代表 Begin of Sentence。EOS 是 End of Sentence。P(商品) 是「商品」這個詞出現在文本中的機率; P(和|商品) 是「和」這個詞出現在「商品」這個詞正後面的機率。 在這個練習中,我們只要完成部分的功能,請寫出一個程式可以接受 5 個浮點數的輸入,作為一組詞的 2-gram 機率的計算器 - 第一個數字為 P(第一個詞 | BOS)的,第二個詞為 P(第二個詞 | 第一個詞 ) 以此類推。並輸出這組詞的出現機率,為了精準,請輸出到小數點下 15 位。