Calcolare N grammi usando Python

2022-07-29 11:00:04

Avevo bisogno di calcolare Unigram, BiGrams e Trigram per un file di testo contenente testo come:

"La fibrosi cistica colpisce 30.000 bambini e giovani adulti solo negli Stati Uniti L'inalazione delle nebbie dell'acqua salata può ridurre il pus e l'infezione che riempie le vie aeree dei malati di fibrosi cistica, anche se gli effetti collaterali includono un brutto attacco di tosse e un sapore aspro. Questa è la conclusione di due studi pubblicati nel numero di questa settimana del New England Journal of Medicine."

Ho iniziato in Python e ho utilizzato il seguente codice:

#!/usr/bin/env python
# File: n-gram.py
def N_Gram(N,text):
NList = []                      # start with an empty list
if N> 1:
    space = " " * (N-1)         # add N - 1 spaces
    text = space + text + space # add both in front and back
# append the slices [i:i+N] to NList
for i in range( len(text) - (N - 1) ):
    NList.append(text[i:i+N])
return NList                    # return the list
# test code
for i in range(5):
print N_Gram(i+1,"text")
# more test code
nList = N_Gram(7,"Here is a lot of text to print")
for ngram in iter(nList):
print '"' + ngram + '"'

http:// www.daniweb.com/software-development/python/threads/39109/generating-n-grams-from-a-word

Ma funziona per tutti gli n-grammi all'interno di una parola, quando lo voglio tra le parole come in CISTICO e FIBROSI o FIBROSI CISTICA. Qualcuno può aiutarmi su come posso ottenere questo fatto?

- gran_profaci

Source
Risposta


32
  • Supponendo che l'input sia una stringa contenente parole separate da spazi, come x = "a b c d" puoi usare la seguente funzione (modifica: vedi l'ultima funzione per una soluzione possibilmente più completa):

    def ngrams(input, n):
        input = input.split(' ')
        output = []
        for i in range(len(input)-n+1):
            output.append(input[i:i+n])
        return output
    
    ngrams('a b c d', 2) # [['a', 'b'], ['b', 'c'], ['c', 'd']]
    

    Se vuoi che siano uniti nuovamente in stringhe, potresti chiamare qualcosa del tipo:

    [' '.join(x) for x in ngrams('a b c d', 2)] # ['a b', 'b c', 'c d']
    

    Infine, questo non riassume le cose in totali, quindi se il tuo input è stato 'a a a a', devi contarli in un dict:

    for g in (' '.join(x) for x in ngrams(input, 2)):
        grams.setdefault(g, 0)
        grams[g] += 1
    

    Mettendo tutto insieme in un'unica funzione finale si ottiene:

    def ngrams(input, n):
       input = input.split(' ')
       output = {}
       for i in range(len(input)-n+1):
           g = ' '.join(input[i:i+n])
           output.setdefault(g, 0)
           output[g] += 1
       return output
    
    ngrams('a a a a', 2) # {'a a': 3}