J'utilise NLTK pour rechercher des n-grammes dans un corpus, mais cela prend beaucoup de temps dans certains cas. J'ai remarqué que calculer des n-grammes n'est pas une caractéristique rare dans d'autres paquets (apparemment, Haystack a des fonctionnalités pour cela). Cela signifie-t-il qu'il existe une façon potentiellement plus rapide de trouver des n-grammes dans mon corpus si j'abandonne le NLTK? Si oui, que puis-je utiliser pour accélérer les choses?Calcul rapide n-gram
Répondre
Puisque vous n'avez pas indiqué si vous voulez des mots ou des n-grammes au niveau du personnage, je vais juste supposer le premier, sans perte de généralité.
Je suppose également que vous commencez avec une liste de jetons, représentés par des chaînes. Ce que vous pouvez facilement faire est d'écrire vous même l'extraction de n-gram.
def ngrams(tokens, MIN_N, MAX_N):
n_tokens = len(tokens)
for i in xrange(n_tokens):
for j in xrange(i+MIN_N, min(n_tokens, i+MAX_N)+1):
yield tokens[i:j]
Remplacez ensuite le yield
avec l'action réelle que vous voulez prendre chaque n-gramme (ajouter à un dict
, le stocker dans une base de données, peu importe) pour se débarrasser de la surcharge du générateur. Enfin, si ce n'est pas vraiment assez rapide, convertissez ce qui précède en Cython et compilez-le. Exemple d'utilisation d'un defaultdict
au lieu de yield
:
def ngrams(tokens, int MIN_N, int MAX_N):
cdef Py_ssize_t i, j, n_tokens
count = defaultdict(int)
join_spaces = " ".join
n_tokens = len(tokens)
for i in xrange(n_tokens):
for j in xrange(i+MIN_N, min(n_tokens, i+MAX_N)+1):
count[join_spaces(tokens[i:j])] += 1
return count
Les nouvelles versions de Cython reconnaissent Python pour les instructions et les accélèrent si possible. De plus, vous avez une méthode de recherche dans l'itération interne. définir 'tokenjoiner = "" .join' en dehors de la boucle et en remplaçant l'intérieur "" .join devrait accélérer les choses. – rocksportrocker
@rocksportrocker: bon endroit, a ajouté votre suggestion. –
et vous pouvez réécrire la ligne interne avec "count.get (....) + = 1" introduire un autre var pour éviter la recherche de méthode. – rocksportrocker
Vous trouverez peut-être un pythonique, la fonction élégante et rapide génération ngram utilisant zip
et floc (*) opérateur here:
def find_ngrams(input_list, n):
return zip(*[input_list[i:] for i in range(n)])
Pour caractère niveau n grammes que vous pourriez utiliser la fonction suivante
def ngrams(text, n):
n-=1
return [text[i-n:i+1] for i,char in enumerate(text)][n:]
- 1. Solr Ngram match Malheur
- 2. Calcul rapide de crc32 C#:
- 3. NGram dans-ordre de recherche
- 4. recherche avec ngram dans ElasticSearch
- 5. calcul rapide de l'histogramme sur une grille
- 6. ES Rechercher un mot partiel - ngram?
- 7. Tutoriel Solr autosuggest pour Edge Ngram
- 8. (OpenCV) Calcul de la matrice d'adjacence rapide du bassin versant
- 9. Déploiement Java vers un cloud pour un calcul rapide
- 10. environnement de calcul rapide en ligne pour ruby
- 11. l'utilisation de tokenizer lucene ngram pour l'expression fuzzy match
- 12. NLTK text.generate(). Pour ce faire avec différents modèles ngram
- 13. Calcul dans le terminal
- 14. Besoin d'un code python plus rapide pour le calcul de l'entropie d'échantillon
- 15. calcul rapide pour virgule flottante de précision étendue pour l'application de la théorie des nombres
- 16. Méthode rapide pour le calcul de la décomposition spectrale matricielle symétrique 3x3
- 17. Android, calcul hachage SHA-1 à partir du fichier, l'algorithme le plus rapide
- 18. Le calcul rapide de RMS donne NaNs en Java - erreur de virgule flottante?
- 19. Calcul du type de données long - Pourquoi Java est-il beaucoup plus rapide que C++?
- 20. Comment rendre cette initialisation de feuille de calcul personnalisée plus rapide?
- 21. Calcul rapide de la proximité moyenne dans une matrice de proximité
- 22. Comment rendre le calcul/l'insertion d'une colonne de différences de dates plus rapide?
- 23. Calcul rapide des distances à chaque centre de cluster pour un ensemble de données
- 24. Mise en œuvre plus rapide de la multiplication matricielle-vectorielle [Calcul parallèle]
- 25. Calcul plus rapide des moyennes hors diagonales dans les grandes matrices
- 26. Calcul rapide Exp: possible d'améliorer la précision sans perdre trop de performance?
- 27. Correction orthographique rapide et rapide
- 28. Calcul du mode statistique
- 29. recherche pas les matchs retour que je veux avec filtre ngram
- 30. Quels sont les effets secondaires de l'utilisation d'un grand max_gram pour un tokenizer nGram dans elasticsearch?
Plus de lecture pour ceux intéressés: http://packages.python.org/Whoosh/ngram s.html – Trindaz
Question connexe: http://stackoverflow.com/questions/21883108/fast-optimize-n-gram-implementations-in-python – dmcc