J'ai des problèmes avec le NLTK sous Python, en particulier la méthode. Générer ().
génère (auto, longueur = 100) p>
Imprimez du texte aléatoire, généré à l'aide d'un modèle de langue trigramme. P>
Paramètres: P>
print text.generate() Building ngram index... The quick brown fox jumps over the lazy dog fox jumps over the lazy dog dog The quick brown fox jumps over the lazy dog dog brown fox jumps over the lazy dog over the lazy dog The quick brown fox jumps over the lazy dog fox jumps over the lazy dog lazy dog The quick brown fox jumps over the lazy dog the lazy dog The quick brown fox jumps over the lazy dog jumps over the lazy dog over the lazy dog brown fox jumps over the lazy dog quick brown fox jumps over the lazy dog The None
5 Réponses :
Peut-être que vous pouvez trier le tableau des jetons au hasard avant de générer une phrase. P>
Le NLTK utilise le contexte de mots pour déterminer leur utilisation. Par exemple, ils ont tout le texte de 'Moby Dick' dans la NLTK par exemple. L'utilisation de générer avec qui générera des phrases de sondage de Meville. Donc, à moins que vous sachiez quelque chose, je ne le fais pas, je suppose que vous ne voulez pas recourir aux mots car le contexte initial est important.
vous avez raison. Si vous mélangez les mots, vous perdez les informations que les trigrammes sont tous.
Êtes-vous sûr d'utiliser Cette page de groupe Google a l'exemple: Word_Tokenize code> est la bonne approche?
>>> import nltk
>>> text = nltk.Text(nltk.corpus.brown.words()) # Get text from brown
>>> text.generate()
nltk.corpus.brown.words () est juste une collection de mots fournis avec NLTK. J'essaie de semer le générateur avec mes propres mots.
Avez-vous comparé votre propre jetonlist avec le corpus brun?
Votre exemple Corpus est le plus susceptible d'être trop petit. Je ne sais pas à quel point NLTK construit exactement son modèle de trigramme, mais il est courant que le début et la fin des phrases sont manipulés d'une manière ou d'une autre. Comme il n'y a qu'un début de phrase dans votre corpus, cela pourrait être la raison pour laquelle chaque phrase a le même départ. P>
Eh bien c'était un échantillon aux fins de si. Mon échantillon réel est plus grand. Vous avez donc besoin de ponctuation pour compenser les phrases?
Je l'ai dit, mais si vous avez déjà essayé un chapitre entier d'orwell (avec la ponctuation, je suppose), je suppose que j'avais tort.
Pour générer de texte aléatoire, vous devez utiliser Markov Chains
code à faire Que: d'ici p>
import random class Markov(object): def __init__(self, open_file): self.cache = {} self.open_file = open_file self.words = self.file_to_words() self.word_size = len(self.words) self.database() def file_to_words(self): self.open_file.seek(0) data = self.open_file.read() words = data.split() return words def triples(self): """ Generates triples from the given data string. So if our string were "What a lovely day", we'd generate (What, a, lovely) and then (a, lovely, day). """ if len(self.words) < 3: return for i in range(len(self.words) - 2): yield (self.words[i], self.words[i+1], self.words[i+2]) def database(self): for w1, w2, w3 in self.triples(): key = (w1, w2) if key in self.cache: self.cache[key].append(w3) else: self.cache[key] = [w3] def generate_markov_text(self, size=25): seed = random.randint(0, self.word_size-3) seed_word, next_word = self.words[seed], self.words[seed+1] w1, w2 = seed_word, next_word gen_words = [] for i in xrange(size): gen_words.append(w1) w1, w2 = w2, random.choice(self.cache[(w1, w2)]) gen_words.append(w2) return ' '.join(gen_words)
Vous devriez être "entraînement" du modèle Markov avec plusieurs séquences, de sorte que vous échantillonnez avec précision les probabilités d'état de départ également (appelée "PI" dans Markov-Speak). Si vous utilisez une séquence unique, vous commencerez toujours dans le même état. P>
Dans le cas de Orwell's 1984, vous voudriez utiliser la tokénisation de la phrase en premier (NLTK est très bonne à l'intérieur), puis la jeton de vote (donnant une liste de listes de jetons, pas seulement une seule liste de jetons), puis de nourrir chacun phrase séparément au modèle Markov. Cela lui permettra de démarrer correctement la séquence de modèle, au lieu d'être bloqué sur un seul moyen de démarrer chaque séquence. P>