181 votes

n-grams en python, quatre, cinq, six grammes ?

Je cherche un moyen de diviser un texte en n-grammes. Normalement, je ferais quelque chose comme :

import nltk
from nltk import bigrams
string = "I really like python, it's pretty awesome."
string_bigrams = bigrams(string)
print string_bigrams

Je suis conscient que nltk ne propose que des bigrammes et des trigrammes, mais existe-t-il un moyen de diviser mon texte en quatre-grammes, cinq-grammes ou même cent-grammes ?

Gracias.

1voto

柯鴻儀 Points 549

Il est assez facile de faire n gram en python, par exemple :

def n_gram(list,n): 
    return [ list[i:i+n] for i in range(len(list)-n+1) ]

et si vous le faites :

str = "I really like python, it's pretty awesome."
n_gram(str.split(" "),4)

Vous obtiendrez

[['I', 'really', 'like', 'python,'], 
['really', 'like', 'python,', "it's"], 
['like', 'python,', "it's", 'pretty'], 
['python,', "it's", 'pretty', 'awesome.']]

1voto

Mat Points 51

C'est une vieille question, mais si vous voulez réellement obtenir les n-grams comme une liste de substrats (et non comme une liste de listes ou de tuples) et ne voulez pas importer quoi que ce soit, le code suivant fonctionne très bien et est facile à lire :

def get_substrings(phrase, n):
    phrase = phrase.split()
    substrings = []
    for i in range(len(phrase)):
        if len(phrase[i:i+n]) == n:
            substrings.append(' '.join(phrase[i:i+n]))
    return substrings

Vous pouvez l'utiliser, par exemple, de cette manière pour obtenir tous les n-grammes d'une liste de termes jusqu'à a longueur des mots :

a = 5
terms = [
    "An n-gram is a contiguous sequence of n items",
    "An n-gram of size 1 is referred to as a unigram",
]

for term in terms:
    for i in range(1, a+1):
        print(f"{i}-grams: {get_substrings(term, i)}")

Imprimés :

1-grams: ['An', 'n-gram', 'is', 'a', 'contiguous', 'sequence', 'of', 'n', 'items']
2-grams: ['An n-gram', 'n-gram is', 'is a', 'a contiguous', 'contiguous sequence', 'sequence of', 'of n', 'n items']
3-grams: ['An n-gram is', 'n-gram is a', 'is a contiguous', 'a contiguous sequence', 'contiguous sequence of', 'sequence of n', 'of n items']
4-grams: ['An n-gram is a', 'n-gram is a contiguous', 'is a contiguous sequence', 'a contiguous sequence of', 'contiguous sequence of n', 'sequence of n items']
5-grams: ['An n-gram is a contiguous', 'n-gram is a contiguous sequence', 'is a contiguous sequence of', 'a contiguous sequence of n', 'contiguous sequence of n items']
1-grams: ['An', 'n-gram', 'of', 'size', '1', 'is', 'referred', 'to', 'as', 'a', 'unigram']
2-grams: ['An n-gram', 'n-gram of', 'of size', 'size 1', '1 is', 'is referred', 'referred to', 'to as', 'as a', 'a unigram']
3-grams: ['An n-gram of', 'n-gram of size', 'of size 1', 'size 1 is', '1 is referred', 'is referred to', 'referred to as', 'to as a', 'as a unigram']
4-grams: ['An n-gram of size', 'n-gram of size 1', 'of size 1 is', 'size 1 is referred', '1 is referred to', 'is referred to as', 'referred to as a', 'to as a unigram']
5-grams: ['An n-gram of size 1', 'n-gram of size 1 is', 'of size 1 is referred', 'size 1 is referred to', '1 is referred to as', 'is referred to as a', 'referred to as a unigram']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X