使用 Python 生成基於馬爾可夫鏈的偽隨機文字

發表於2015-12-27

首先看一下來自Wolfram的定義

馬爾可夫鏈是隨機變數{X_t}的集合(t貫穿0,1,…),給定當前的狀態,未來與過去條件獨立。

Wikipedia的定義更清楚一點兒

…馬爾可夫鏈是具有馬爾可夫性質的隨機過程…[這意味著]狀態改變是概率性的,未來的狀態僅僅依賴當前的狀態。

馬爾可夫鏈具有多種用途,現在讓我看一下如何用它生產看起來像模像樣的胡言亂語。

演算法如下,

  1. 找一個作為語料庫的文字,語料庫用於選擇接下來的轉換。
  2. 從文字中兩個連續的單詞開始,最後的兩個單詞構成當前狀態。
  3. 生成下一個單詞的過程就是馬爾可夫轉換。為了生成下一個單詞,首先檢視語料庫,查詢這兩個單詞之後跟著的單詞。從它們中隨機選擇一個。
  4. 重複2,直到生成的文字達到需要的大小。

程式碼如下

為了看到一個示例結果,我們從古騰堡計劃中拿了沃德豪斯的《My man jeeves》作為文字,示例結果如下。

[如果想執行這個例子,請下載jeeves.txtmarkovgen.py
馬爾可夫演算法怎樣呢?

  •     最後兩個單詞是當前狀態。
  •     接下來的單詞僅僅依賴最後兩個單詞,也就是當前狀態。
  •     接下來的單詞是從語料庫的統計模型中隨機選擇的。

這是一個示例文字。

“The quick brown fox jumps over the brown fox who is slow jumps over the brown fox who is dead.”

這個文字對應的語料庫像這樣,

現在如果我們從”brown fox”開始,接下來的單詞可以是”jumps”或者”who”。如果我們選擇”jumps”,然後當前的狀態就變成了”fox jumps”,再接下的單詞就是”over”,之後依此類推。

提示

  •     我們選擇的文字越大,每次轉換的選擇更多,生成的文字更好看。
  •     狀態可以設定為依賴一個單詞、兩個單詞或者任意數量的單詞。隨著每個狀態的單詞數的增加,生成的文字更不隨機。
  •     不要去掉標點符號等。它們會使語料庫更具代表性,隨機文字更好看。

資源

相關文章