Algorithme de prédiction de mots
Je suis sûr qu'il y est un post sur ce sujet, mais je ne pouvais pas en trouver un en posant cette question exacte. Considérez les points suivants:
- Nous avons un dictionnaire de mots disponibles
- Nous sommes nourris de nombreux paragraphes de mots, et je veux être en mesure de prédire le mot suivant dans une phrase donnée cette entrée.
Dire que nous avons quelques phrases telles que "Bonjour, mon nom est Tom", "Son nom est jerry", "Il va là où il n'y a pas d'eau". Nous vérifions une table de hash si un mot existe. Si cela ne fonctionne pas, nous lui affecter un id unique et le mettre dans la table de hachage. De cette façon, au lieu de stocker une chaîne de mots comme un bouquet de chaînes de caractères, nous pouvons juste avoir une liste d'id unique.
Ci-dessus, nous aurions par exemple (0, 1, 2, 3, 4), (5, 2, 3, 6), et (7, 8, 9, 10, 3, 11, 12). À noter que 3 est "est" et nous avons ajouté de nouvelles id unique que nous avons découvert de nouveaux mots. Donc, dire que nous sommes une phrase "son nom est", ce serait (13, 2, 3). Nous voulons savoir, compte tenu de ce contexte, que le mot suivant doit être. C'est l'algorithme que je pensais, mais je ne pense pas que son efficacité:
- Nous avons une liste de N chaînes (observé phrases) où une chaîne peut être ex. 3,6,2,7,8.
- Chaque chaîne est en moyenne de taille M, où M est la moyenne de la longueur des phrases
- Nous sommes donné une nouvelle chaîne de taille S, ex. 13, 2, 3, et nous voulons savoir ce qui est le plus probable du mot suivant?
Algorithme:
- Première analyse de l'ensemble de la liste des chaînes pour ceux qui contiennent l'intégralité des S entrée(13,2,3, dans cet exemple). Puisque nous avons à balayage N chaînes, chacune de longueur M, et de comparer les lettres à la fois, ses O(N*M*S).
- Si il n'y a pas de chaînes de notre analyse qui ont le S complet, de l'analyse suivante en enlevant le moins de mot significatif (ie. la première, donc supprimer 13). Maintenant, scan (2,3) 1 dans le pire des cas O(N*M*S) qui est vraiment S-1.
- Poursuivre la numérisation de cette façon jusqu'à ce que nous obtenons des résultats > 0 (si jamais).
- Compter les mots suivants dans tous les autres chaînes que nous avons rassemblées. On peut utiliser une table de hachage qui compte à chaque fois que nous ajoutons, et de garder une trace de la plupart des mot ajouté. O(N) le pire des cas, construire, O(1) pour trouver le max de mots.
- Le max de mot est le plus probable, si retour il.
Chaque scan prend O(M*N*S) le pire des cas. C'est parce qu'il y a N chaînes, chaque chaîne a M chiffres, et nous devons vérifier S numéros de superposition d'un match. Nous scannons S fois pire des cas (13,2,3,puis 2,3, puis 3 pour 3 scans = S). Ainsi, le total de la complexité est O(S^2 * M * N).
Donc, si nous avons de 100 000 chaînes et une durée moyenne des peines de 10 mots, nous sommes à la recherche 1 000 000 de*S^2 pour trouver la meilleure parole. Clairement, N >> M, puisque la durée de la peine, ne l'est pas avec le nombre de peines en général, de sorte que M peut être une constante. On peut alors réduire la complexité à O(S^2 * N). O(S^2 * M * N) peut être plus utile pour l'analyse, mais, depuis M peut être un important "constante".
Cela pourrait être la complète mauvais, de l'approche à prendre pour ce type de problème, mais je voulais partager mes pensées au lieu de simplement flagrante de demander de l'aide. La raison im de la numérisation de la façon dont je le fais c'est parce que je ne voulez analyser autant que je le dois. Si rien n'a le S complet, il suffit de garder l'élagage S jusqu'à ce que certaines chaînes de match. Si elles ne correspondent jamais, nous n'avons aucune idée de ce à prédire le mot suivant! Toutes les suggestions sur un moins de temps/espace solution complexe? Merci!
source d'informationauteur user2045279
Vous devez vous connecter pour publier un commentaire.
C'est le problème de langage de modélisation. Pour une approche de base, La seule chose que vous avez besoin est une table de hachage de la cartographie fixe-longueur des chaînes de mots, de dire de longueur kle plus probable mot suivant.(*)
Au temps de formation, vous cassez l'entrée en (k+1)-grammes à l'aide d'une fenêtre glissante. Donc, si vous rencontrez des
vous générer, pour k=2,
Cela peut être fait en temps linéaire. Pour chacun des 3-gram, tally (dans une table de hachage) combien de fois le troisième mot qui suit les deux premiers.
Enfin, en boucle par le biais de la table de hachage et pour chaque touche (2 grammes) de ne garder que les plus fréquentes troisième mot. Le temps linéaire.
À la prévision du temps, regardez seulement les k (2) dernières paroles et prédire le mot suivant. Cela ne prend que la constante de temps puisqu'il s'agit seulement d'une table de hachage de recherche.
Si vous vous demandez pourquoi vous devriez garder seulement à court subchains au lieu de plein de chaînes, puis regardez dans la théorie de Markov windows. Si votre modèle n'oubliez pas de toutes les chaînes de mots qu'il a vu dans son entrée, puis il serait mal overfit ses données d'entraînement et seulement reproduire son entrée à la prévision du temps. Comment le mal dépend de l'ensemble de la formation (plus de données, c'est mieux), mais pour k>4 vous auriez vraiment besoin lissage dans votre modèle.
(*) Ou à une distribution de probabilité, mais ce n'est pas nécessaire pour votre simple exemple de cas d'utilisation.
Yeh Whye Teh a également un certain récent ouvrage intéressant qui traite de ce problème. La "Séquence Memoizer étend le traditionnel prédiction-par-partielles régime en correspondance à prendre en compte arbitrairement longue histoire.
Voici un lien de l'article original: http://www.stats.ox.ac.uk/~teh/recherche/compling/WooGasArc2011a.pdf
Il est également intéressant de lire le travail de fond, qui peut être trouvé dans le document "Une Interprétation Bayésienne de Interpolées de Kneser-Ney"