欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python基于隱馬爾可夫模型實現(xiàn)中文拼音輸入

 更新時間:2016年04月01日 08:56:26   投稿:hebedich  
這篇文章主要介紹了python基于隱馬爾可夫模型實現(xiàn)中文拼音輸入的相關(guān)資料,需要的朋友可以參考下

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

原理簡介隱馬爾科夫模型

抄一段網(wǎng)上的定義:

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

拼音輸入法中可觀察的參數(shù)就是拼音,隱含的參數(shù)就是對應(yīng)的漢字。

viterbi算法

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

代碼解釋

model定義

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

數(shù)據(jù)表定義如下:

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文件,里面的initstarting,initemission,init_transition分別對應(yīng)于生成隱馬爾科夫模型中的初始概率矩陣,發(fā)射概率矩陣,轉(zhuǎn)移概率矩陣,并把生成的結(jié)果寫入sqlite文件中。訓(xùn)練用到的數(shù)據(jù)集是結(jié)巴分詞里的詞庫,因為沒有訓(xùn)練長句子,最后運行的結(jié)果也證明只能適用于短句輸入。

初始概率矩陣

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

轉(zhuǎn)移概率矩陣

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

上圖展示的一后面出現(xiàn)概率最高的十個字,也挺符合日常習(xí)慣。

發(fā)射概率矩陣

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

viterbi實現(xiàn)

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

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

  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

結(jié)果展示

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

問題統(tǒng)計:

統(tǒng)計字典生成轉(zhuǎn)移矩陣寫入數(shù)據(jù)庫的速度太慢,運行一次要將近十分鐘。發(fā)射概率矩陣數(shù)據(jù)不準(zhǔn)確,總有一些漢字的拼音不匹配。訓(xùn)練集太小,實現(xiàn)的輸入法不適用于長句子。

相關(guān)文章

  • jupyter notebook如何導(dǎo)出pdf并支持中文

    jupyter notebook如何導(dǎo)出pdf并支持中文

    這篇文章主要介紹了jupyter notebook如何導(dǎo)出pdf并支持中文問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Flask框架WTForm表單用法示例

    Flask框架WTForm表單用法示例

    這篇文章主要介紹了Flask框架WTForm表單用法,結(jié)合登錄驗證的具體實例分析了Flask框架WTForm表單相關(guān)使用技巧,需要的朋友可以參考下
    2018-07-07
  • python實現(xiàn)逐個讀取txt字符并修改

    python實現(xiàn)逐個讀取txt字符并修改

    今天小編就為大家分享一篇python實現(xiàn)逐個讀取txt字符并修改,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • pandas數(shù)據(jù)的合并與拼接的實現(xiàn)

    pandas數(shù)據(jù)的合并與拼接的實現(xiàn)

    Pandas包的merge、join、concat方法可以完成數(shù)據(jù)的合并和拼接,本文主要介紹了這三種實現(xiàn)方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Python socket.error: [Errno 98] Address already in use的原因和解決方法

    Python socket.error: [Errno 98] Address already in use的原因和解決

    這篇文章主要介紹了Python socket.error: [Errno 98] Address already in use的原因和解決方法,在Python的socket編程中可能會經(jīng)常遇到這個問題,需要的朋友可以參考下
    2014-08-08
  • Python 中導(dǎo)入文本文件的示例代碼

    Python 中導(dǎo)入文本文件的示例代碼

    這篇文章主要介紹了如何在 Python 中導(dǎo)入文本文件,在Python中導(dǎo)入文本文件是很常見的操作,我們可以使用內(nèi)置的open函數(shù)和with語句來讀取或?qū)懭胛谋疚募枰呐笥芽梢詤⒖枷?/div> 2023-05-05
  • pytorch機器學(xué)習(xí)softmax回歸的簡潔實現(xiàn)

    pytorch機器學(xué)習(xí)softmax回歸的簡潔實現(xiàn)

    這篇文章主要介紹了為大家介紹了pytorch機器學(xué)習(xí)中softmax回歸的簡潔實現(xiàn)方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • Python+OpenCV實戰(zhàn)之利用?K-Means?聚類進行色彩量化

    Python+OpenCV實戰(zhàn)之利用?K-Means?聚類進行色彩量化

    這篇文章主要介紹了如何利用?K-Means?聚類進行色彩量化,以減少圖像中顏色數(shù)量。文中的代碼具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以關(guān)注一下
    2021-12-12
  • python實現(xiàn)圖片文件批量重命名

    python實現(xiàn)圖片文件批量重命名

    這篇文章主要為大家詳細介紹了python實現(xiàn)圖片文件批量重命名,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Python?Pytorch學(xué)習(xí)之圖像檢索實踐

    Python?Pytorch學(xué)習(xí)之圖像檢索實踐

    隨著電子商務(wù)和在線網(wǎng)站的出現(xiàn),圖像檢索在我們的日常生活中的應(yīng)用一直在增加。圖像檢索的基本本質(zhì)是根據(jù)查詢圖像的特征從集合或數(shù)據(jù)庫中查找圖像。本文將利用Pytorch實現(xiàn)圖像檢索,需要的可以參考一下
    2022-04-04

最新評論