2017-08-14 7 views
1

Voici mon problème, j'essaie d'enseigner un Hidden Markov Models en utilisant hmmlearn. Je suis nouveau à la langue, et j'ai quelques difficultés à comprendre les différences entre les listes et les tableaux. Voici mon code:Apprendre les séquences de caractères en utilisant hmmlearn en 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) 

et la sortie résultante

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. 

Je l'ai vu à ValueError: setting an array element with a sequence qu'il pourrait être un problème de longueur différente du tableau, mais je ne peux pas comprendre comment le résoudre .

Une suggestion?

Répondre

0

L'erreur elle-même vient du fait que model.fit() attend un tableau de tableaux de valeurs numériques. En ce moment votre entrée data est un tableau de tableaux de liste de listes de chaînes. C'est ce qui provoque une erreur lorsque la fonction trouve que le array element attend is a sequence, c'est-à-dire la liste (des listes de chaînes).

Cependant, même si vous résolvez le problème de liste, un autre problème se posera: L'apprentissage d'un HMM implique de calculer des quantités numériques via un ensemble d'équations. Les données d'entrée pour apprendre un HMM devraient être numériques, pas un ensemble de lettres. (Sauf si hmmlearn a une option très spéciale pour les caractères que je ne connais pas.)

Vous devez d'abord transformer les lettres en chiffres si vous voulez travailler avec des HMM.

Je ne sais pas ce que vous finissez l'objectif est. Les HMM visent à modéliser des données à des fins de génération ou de classification (si plusieurs HMM sont formés). Qu'avez-vous l'intention de faire une fois que vous avez un modèle formé à partir des lettres composant les mots?

En ce qui concerne le format dans lequel les données doivent être fournies aux différentes fonctions, je vous suggère de regarder le documentation. Il comprend des tutoriels pour l'utilisation de la bibliothèque.

+1

Nous vous remercions de votre réponse. En effet, j'ai supposé ici que le HMM dans 'hmmlearn' était capable de générer n'importe quel type de symboles, pas seulement des nombres, mon mauvais. Ne serait-ce pas un problème de générer des nombres ordinaux plutôt que des lettres cardinales? Je vais essayer d'enquêter sur ce problème. Pour répondre à votre question, le but de ce code est d'apprendre les séquences de lettres dans un dictionnaire de noms afin d'obtenir un modèle qui me permettrait de générer des noms aléatoires ayant la même construction intrinsèque que les savants. – Kahsius

+0

Oui, attribuer un numéro à chaque lettre pourrait être une première idée à essayer. 1 -> A; 2-> B, ... et ainsi de suite, en sautant les lettres que vous ne voulez pas voir apparaître. – Eskapp