2017-08-14 72 views
1

這裏是我的問題,我想教使用hmmlearn一個隱馬爾可夫模型。我對這門語言很陌生,在理解列表和數組之間的區別時遇到一些困難。這裏是我的代碼:學習使用hmmlearn字符序列在Python

from hmmlearn import hmm 
from babel import lists 
import numpy as np 
import unidecode as u 
from numpy import char 

l = [] 
data = [] 
gods_egypt = ["Amon","Anat","Anouket","Anubis","Apis","Atoum","Bastet","Bès","Gheb","Hâpy","Harmachis","Hathor","Heh","Héket","Horus","Isis","Ka","Khepri","Khonsou","Khnoum","Maât","Meresger","Mout","Nefertoum","Neith","Nekhbet","Nephtys","Nout","Onouris","Osiris","Ouadjet","Oupaout","Ptah","Rê","Rechef","Renenoutet","Satet","Sebek","Sekhmet","Selkis","Seth","Shou","Sokaris","Tatenen","Tefnout","Thot","Thouéris"] 
for i in range(0, len(gods_egypt)): 
    data.append([]) 
    for j in range(0, len(gods_egypt[i])): 
     data[i].append([u.unidecode(gods_egypt[i][j].lower())]) 
    l.append(len(data[i])) 
data = np.asarray(data).reshape(-1,1) 
model = hmm.MultinomialHMM(20, verbose=True) 
model = model.fit(data, l) 

,並輸出結果

Traceback (most recent call last): 
    File "~~~\HMM_test.py", line 17, in <module> 
    model = model.fit(data, l) 
    File "~~~\Python\Python36\site-packages\hmmlearn\base.py", line 420, in fit 
    X = check_array(X) 
    File "~~~\Python36-32\lib\site-packages\sklearn\utils\validation.py", line 402, in check_array 
    array = np.array(array, dtype=dtype, order=order, copy=copy) 
ValueError: setting an array element with a sequence. 

我在ValueError: setting an array element with a sequence已經看到,它可能是不同的數組長度的問題,但我無法弄清楚如何解決呢。

有什麼建議嗎?

回答

0

錯誤本身來自以下事實:model.fit()期待的數值的數組的數組。現在,您輸入data是串的名單列表的數組的數組。這是因爲該函數發現什麼引發一個錯誤,它期待is a sequencearray element,(字符串列表)的列表。

但是,即使您修復了列表問題,也會出現另一個問題: 學習HMM意味着通過一些方程組計算數值量。學習HMM的輸入數據應該是數字的,而不是一組字母。 (除非hmmlearn對於我不知道的字符有一個非常特殊的選項。)

如果您想使用HMM,則需要先將這些字母轉換爲數字。

我不知道你到底是什麼目標。 HMM旨在爲生成或分類目的建模數據(如果有多個HMM被訓練)。一旦你從構成單詞的字母中獲得了訓練有素的模型,你打算做什麼?

至於數據應該提供給不同功能的格式,我建議你看看documentation。它包括使用庫的教程。

+1

謝謝您的回答。的確,我在這裏假設'hmmlearn'中的HMM能夠生成任何類型的符號,不僅是數字,而且也是我的壞。生成序數而不是主要字母不是問題嗎?我會試着調查這個問題。 爲了回答你的問題,這段代碼的要點是要學習名稱詞典中的字母序列,以便得到一個模型,它將允許我生成一些與學習內容相同的內部結構的隨機名稱。 – Kahsius

+0

是給每個字母分配一個數字可能是第一個嘗試的想法。 1 - > A; 2-> B,...等等,跳過你不想出現的字母。 – Eskapp