欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python基于隱馬爾可夫模型實現中文拼音輸入

系統 1722 0

在網上看到一篇關于隱馬爾科夫模型的介紹,覺得簡直不能再神奇,又在網上找到大神的一篇關于如何用隱馬爾可夫模型實現中文拼音輸入的博客,無奈大神沒給可以運行的代碼,只能純手動網上找到了結巴分詞的詞庫,根據此訓練得出隱馬爾科夫模型,用維特比算法實現了一個簡單的拼音輸入法。githuh地址:https://github.com/LiuRoy/Pinyin_Demo

原理簡介隱馬爾科夫模型

抄一段網上的定義:

隱馬爾可夫模型 (Hidden Markov Model) 是一種統計模型,用來描述一個含有隱含未知參數的馬爾可夫過程。其難點是從可觀察的參數中確定該過程的隱含參數,然后利用這些參數來作進一步的分析。

拼音輸入法中可觀察的參數就是拼音,隱含的參數就是對應的漢字。

viterbi算法

參考https://zh.wikipedia.org/wiki/維特比算法,思想是動態規劃,代碼比較簡單就不贅述。

代碼解釋

model定義

代碼見model/table.py文件,針對隱馬爾科夫的三個概率矩陣,分別設計了三個數據表存儲。這樣的好處很明顯,漢字的轉移概率矩陣是一個非常大的稀疏矩陣,直接文件存儲占用空間很大,并且加載的時候也只能一次性讀入內存,不僅內存占用高而且加載速度慢。此外數據庫的join操作非常方便viterbi算法中的概率計算。

數據表定義如下:

            
class Transition(BaseModel):

  __tablename__ = 'transition'

  id = Column(Integer, primary_key=True)
  previous = Column(String(1), nullable=False)
  behind = Column(String(1), nullable=False)
  probability = Column(Float, nullable=False)


class Emission(BaseModel):

  __tablename__ = 'emission'

  id = Column(Integer, primary_key=True)
  character = Column(String(1), nullable=False)
  pinyin = Column(String(7), nullable=False)
  probability = Column(Float, nullable=False)


class Starting(BaseModel):

  __tablename__ = 'starting'

  id = Column(Integer, primary_key=True)
  character = Column(String(1), nullable=False)
  probability = Column(Float, nullable=False)
          

模型生成

代碼見train/main.py文件,里面的init starting,init emission,init_transition分別對應于生成隱馬爾科夫模型中的初始概率矩陣,發射概率矩陣,轉移概率矩陣,并把生成的結果寫入sqlite文件中。訓練用到的數據集是結巴分詞里的詞庫,因為沒有訓練長句子,最后運行的結果也證明只能適用于短句輸入。

初始概率矩陣

統計初始化概率矩陣,就是找出所有出現在詞首的漢字,并統計它們出現在詞首的次數,最后根據上述數據算出這些漢字出現在詞首的概率,沒統計的漢字就認為出現在詞首的概率是0,不寫入數據庫。有一點注意的是為了防止概率計算的時候因為越算越小導致計算機無法比較,所有的概率都進行了自然對數運算。統計的結果如下:

python基于隱馬爾可夫模型實現中文拼音輸入_第1張圖片

轉移概率矩陣

此處用到的是最簡單的一階隱馬爾科夫模型,即認為在一個句子里,每個漢字的出現只和它前面的的一個漢字有關,雖然簡單粗暴,但已經可以滿足大部分情況。統計的過程就是找出字典中每個漢字后面出現的漢字集合,并統計概率。因為這個概率矩陣非常的大,逐條數據寫入數據庫過慢,后續可以優化為批量寫入,提高訓練效率。結果如下:

python基于隱馬爾可夫模型實現中文拼音輸入_第2張圖片

上圖展示的一后面出現概率最高的十個字,也挺符合日常習慣。

發射概率矩陣

通俗點就是統計每個漢字對應的拼音以及在日常情況下的使用概率,已暴舉例,它有兩個讀音:bao和pu,難點就是找bao和pu出現的概率。此處統計用到了pypinyin模塊,把字典中的短語轉換為拼音后進行概率統計,但是某些地方讀音也不完全正確,最后運行的輸入法會出現和拼音不匹配的結果。統計結果如下:

python基于隱馬爾可夫模型實現中文拼音輸入_第3張圖片

viterbi實現

代碼建input_method/viterbi.py文件,此處會找到最多十個局部最優解,注意是十個局部最優解而不是十個全局最優解,但是這十個解中最優的那個是全局最優解,代碼如下:

            
def viterbi(pinyin_list):
  """
  viterbi算法實現輸入法

  Aargs:
    pinyin_list (list): 拼音列表
  """
  start_char = Emission.join_starting(pinyin_list[0])
  V = {char: prob for char, prob in start_char}

  for i in range(1, len(pinyin_list)):
    pinyin = pinyin_list[i]

    prob_map = {}
    for phrase, prob in V.iteritems():
      character = phrase[-1]
      result = Transition.join_emission(pinyin, character)
      if not result:
        continue

      state, new_prob = result
      prob_map[phrase + state] = new_prob + prob

    if prob_map:
      V = prob_map
    else:
      return V
  return V
          

結果展示

運行input_method/viterbi.py文件,簡單的展示一下運行結果:

python基于隱馬爾可夫模型實現中文拼音輸入_第4張圖片

問題統計:

統計字典生成轉移矩陣寫入數據庫的速度太慢,運行一次要將近十分鐘。發射概率矩陣數據不準確,總有一些漢字的拼音不匹配。訓練集太小,實現的輸入法不適用于長句子。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 三A级做爰片免费观看国产电影 | 欧美日韩一区二区三区高清不卡 | 九九热国产视频 | 91免费播放| 香蕉视频在线观看免费国产婷婷 | 日本理论片好看理论片 | 亚洲一区二区三区久久精品 | 日韩高清中文字幕 | 一级成人生活片免费看 | 免费观看成人拍拍拍1000视频 | 欧美a级成人淫片免费看 | 五月天婷婷免费观看视频在线 | 添人人躁日日躁夜夜躁夜夜揉 | 成人欧美一区二区三区黑人3p | 久久久精品影院 | 香港论理午夜电影网 | 日本高清在线观看视频www | 国产亚洲女人久久久久久 | 国产二区精品 | 国产免费一区二区三区免费视频 | 一区二区三区在线播放 | 亚州毛色毛片免费观看 | 五月婷婷激情 | 欧美高清另类自拍视频在线看 | 亚州男人天堂 | 亚洲黄色一级大片 | 成人激情免费视频 | 91在线免费观看 | 成人国产精品免费视频不卡 | 色黄视频在线观看 | 奇米精品 | 香蕉视频在线观看免费 | 午夜视频在线免费观看 | 成人爽a毛片在线视频网站 婷婷色在线观看 | 国内精品久久久久影院老司 | 国产91亚洲精品 | 天天插天天射天天干 | 精品久久久久久久 | 九九亚洲视频 | 在线观看特色大片免费网站 | 亚洲精品综合久久 |