2017-04-18 2 views
3

les plus courants d'une chaîne:2-grammes en utilisant python

this is a test this is 

Comment puis-je trouver les 2-grammes top-n les plus courantes? Dans la chaîne ci-dessus, les 2-grammes sont:

{this is, is a, test this, this is} 

Comme vous pouvez le remarquer, le 2-gramme this is apparaît 2 fois. D'où le résultat doit être:

{this is: 2} 

Je sais que je peux utiliser la méthode Counter.most_common() pour trouver les éléments les plus communs, mais comment puis-je créer une liste de 2-grammes de la chaîne pour commencer?

+0

Montrez-nous un peu de code! – Astrom

Répondre

4

Vous pouvez utiliser la méthode fournie dans ce blog post pour créer facilement des n-grammes en Python.

from collections import Counter 

bigrams = zip(words, words[1:]) 
counts = Counter(bigrams) 
print(counts.most_common()) 

Cela suppose que l'entrée est une liste de mots, bien sûr. Si votre entrée est une chaîne comme celle que vous avez fournie (qui n'a pas de ponctuation), alors vous pouvez faire words = text.split(' ') pour obtenir une liste de mots. En général, cependant, vous devez tenir compte de la ponctuation, des espaces et d'autres caractères non alphabétiques. Dans ce cas, vous pourriez faire quelque chose comme

import re 

words = re.findall(r'[A-Za-z]+', text) 

ou vous pouvez utiliser une bibliothèque externe tel que nltk.tokenize.

Modifier. Si vous avez besoin tri-grammes ou tout autre tout autre n-grammes en général, vous pouvez utiliser la fonction fournie dans le billet de blog I lié à:

def find_ngrams(input_list, n): 
    return zip(*(input_list[i:] for i in range(n))) 

trigrams = find_ngrams(words, 3) 
+0

maintenant, si j'ai besoin de faire tri-grammes au lieu de bigrams, comment puis-je faire cela - juste curieux. – stfd1123581321

1

Eh bien, vous pouvez utiliser

words = s.split() # s is the original string 
pairs = [(words[i], words[i+1]) for i in range(len(words)-1)] 

(words[i], words[i+1]) est la paire de mots au lieu i et i + 1, et nous allons sur toutes les paires de (0,1) à (n-2, n 1) avec n étant la longueur de la chaîne s.

+1

's' est une chaîne, pense que vous voulez dire' s.split() '. Aussi vous n'avez encore rien compté ... –

+0

@Chris_Rands 's' n'est jamais utilisé dans la question d'OP, donc il pourrait aussi bien être une liste de mots. Mais cela devrait certainement être précisé dans la réponse. –

+0

@Chris_Rands, vous êtes, bien sûr, correct. J'ai modifié la réponse. – zmbq