2010-05-17 9 views
3

Si j'écrivais un logiciel qui tentait de prédire quel mot un utilisateur allait taper suivant en utilisant les deux mots précédents que l'utilisateur avait tapés, je voudrais créer deux tables.Stocker n-grammes dans la base de données dans <n nombre de tables

Comme si:

== 1-gram table == 
Token | NextWord | Frequency 
------+----------+----------- 
"I" | "like" | 15 
"I" | "hate" | 20 

== 2-gram table == 
Token | NextWord | Frequency 
---------+------------+----------- 
"I like" | "apples" | 8 
"I like" | "tomatoes" | 12 
"I hate" | "tomatoes" | 20 
"I hate" | "apples" | 2 

Suivant cet exemple implimentation les types d'utilisateurs « I » et le logiciel, en utilisant la base de données ci-dessus, prédit que le prochain mot l'utilisateur va taper est « haine ». Si l'utilisateur tape "haïr" alors le logiciel prédira alors que le prochain mot que l'utilisateur va taper est "tomates". Cependant, cette implan- tation nécessiterait un tableau pour chaque n-gramme supplémentaire que je choisis de prendre en compte. Si je décidais de prendre en compte les 5 ou 6 mots précédents pour prédire le mot suivant, alors j'aurais besoin de 5-6 tables et d'une augmentation exponentielle de l'espace par n-gramme.

Quelle serait la meilleure façon de représenter cela dans seulement un ou deux tableaux, qui n'a pas de limite supérieure sur le nombre de n-grammes que je peux supporter?

Répondre

2

Essayez un deux colonne de table -

phrase, frequency 

Une optimisation serait de « noramalise » quelques mots dans la phrase, par exemple "n'est pas" à "n'est pas".

Une deuxième optimisation consisterait à utiliser un hachage MD5, CRC32 ou similaire de la phrase comme clé.

+0

+1 pour le hachage. Si vous utilisez un grand corpus, ou des cordes longues, l'utilisation d'un hachage sera * essentielle * pour une performance adéquate. Vous aurez toujours besoin de garder la chaîne d'origine à cause des inévitables collisions, hélas. – egrunin

1

Vous pouvez en fait le laisser comme vous l'avez et n'utiliser qu'une seule table. Un deux grammes ne peut pas être égal à un gramme, parce que les deux grammes auront un espace dedans. De même, aucun gramme ne sera égal à deux grammes parce que les trois grammes auront deux espaces. À l'infini.

Vous pouvez donc mettre tous les 1 grammes, 2 grammes, etc. dans le champ Token et aucun ne pourra entrer en collision. Pourquoi ne pas simplement les stocker tous dans la même table?

2

Token | NextWord | Frequency 
---------+------------+----------- 
"I"  | "like"  | 15 
"I"  | "hate"  | 20 
"I like" | "apples" | 8 
"I like" | "tomatoes" | 12 
"I hate" | "tomatoes" | 20 
"I hate" | "apples" | 2 

Ce serait alors à votre logiciel de décider ce que vous passez pour « Token », et également lorsque vous insérez de nouvelles valeurs (à savoir ne pas insérer un mot partiellement tapé). Si vous voulez être compliqué, vous pouvez avoir une colonne supplémentaire pour le nombre de mots, mais je ne pense pas que cela soit réellement nécessaire (le nombre d'espaces + 1 est le nombre de mots)

Questions connexes