Formando bigtwigs de palabras en la lista de oraciones con Python

Tengo una lista de oraciones:

text = ['cant railway station','citadel hotel',' police stn']. 

Necesito formar pares de bigram y almacenarlos en una variable. El problema es que cuando hago eso, obtengo un par de oraciones en lugar de palabras. Aquí esta lo que hice:

 text2 = [[word for word in line.split()] for line in text] bigrams = nltk.bigrams(text2) print(bigrams) 

cuyos rendimientos

 [(['cant', 'railway', 'station'], ['citadel', 'hotel']), (['citadel', 'hotel'], ['police', 'stn']) 

La estación de tren y el hotel de la ciudadela no pueden formar un bigtwig Lo que quiero es

 [([cant],[railway]),([railway],[station]),([citadel,hotel]), and so on... 

La última palabra de la primera oración no debe fusionarse con la primera palabra de la segunda oración. ¿Qué debo hacer para que funcione?

Usando listas de comprensión y zip :

 >>> text = ["this is a sentence", "so is this one"] >>> bigrams = [b for l in text for b in zip(l.split(" ")[:-1], l.split(" ")[1:])] >>> print(bigrams) [('this', 'is'), ('is', 'a'), ('a', 'sentence'), ('so', 'is'), ('is', 'this'), ('this', 'one')] 

En lugar de convertir su texto en listas de cadenas, comience con cada oración por separado como una cadena. También he eliminado la puntuación y las palabras de parada, solo elimine estas partes si son irrelevantes para usted:

 import nltk from nltk.corpus import stopwords from nltk.stem import PorterStemmer from nltk.tokenize import WordPunctTokenizer from nltk.collocations import BigramCollocationFinder from nltk.metrics import BigramAssocMeasures def get_bigrams(myString): tokenizer = WordPunctTokenizer() tokens = tokenizer.tokenize(myString) stemmer = PorterStemmer() bigram_finder = BigramCollocationFinder.from_words(tokens) bigrams = bigram_finder.nbest(BigramAssocMeasures.chi_sq, 500) for bigram_tuple in bigrams: x = "%s %s" % bigram_tuple tokens.append(x) result = [' '.join([stemmer.stem(w).lower() for w in x.split()]) for x in tokens if x.lower() not in stopwords.words('english') and len(x) > 8] return result 

Para usarlo, hazlo así:

 for line in sentence: features = get_bigrams(line) # train set here 

Tenga en cuenta que esto va un poco más allá y en realidad puntúa estadísticamente los bigtwigs (lo que será útil para entrenar el modelo).

Sin nltk:

 ans = [] text = ['cant railway station','citadel hotel',' police stn'] for line in text: arr = line.split() for i in range(len(arr)-1): ans.append([[arr[i]], [arr[i+1]]]) print(ans) #prints: [[['cant'], ['railway']], [['railway'], ['station']], [['citadel'], ['hotel']], [['police'], ['stn']]] 
 from nltk import word_tokenize from nltk.util import ngrams text = ['cant railway station', 'citadel hotel', 'police stn'] for line in text: token = nltk.word_tokenize(line) bigram = list(ngrams(token, 2)) # the '2' represents bigram...you can change it to get ngrams with different size 
 >>> text = ['cant railway station','citadel hotel',' police stn'] >>> bigrams = [(ele, tex.split()[i+1]) for tex in text for i,ele in enumerate(tex.split()) if i < len(tex.split())-1] >>> bigrams [('cant', 'railway'), ('railway', 'station'), ('citadel', 'hotel'), ('police', 'stn')] 

Usando la función de enumerar y dividir.

Solo arreglando el código de Dan:

 def get_bigrams(myString): tokenizer = WordPunctTokenizer() tokens = tokenizer.tokenize(myString) stemmer = PorterStemmer() bigram_finder = BigramCollocationFinder.from_words(tokens) bigrams = bigram_finder.nbest(BigramAssocMeasures.chi_sq, 500) for bigram_tuple in bigrams: x = "%s %s" % bigram_tuple tokens.append(x) result = [' '.join([stemmer.stem(w).lower() for w in x.split()]) for x in tokens if x.lower() not in stopwords.words('english') and len(x) > 8] return result 

Leer el conjunto de datos

 df = pd.read_csv('dataset.csv', skiprows = 6, index_col = "No") 

Recoge todos los meses disponibles

 df["Month"] = df["Date(ET)"].apply(lambda x : x.split('/')[0]) 

Crea tokens de todos los tweets al mes.

 tokens = df.groupby("Month")["Contents"].sum().apply(lambda x : x.split(' ')) 

Crea bigtwigs al mes.

 bigrams = tokens.apply(lambda x : list(nk.ngrams(x, 2))) 

Contar bigtwigs por mes

 count_bigrams = bigrams.apply(lambda x : list(x.count(item) for item in x)) 

Envuelva el resultado en marcos de datos ordenados

 month1 = pd.DataFrame(data = count_bigrams[0], index= bigrams[0], columns= ["Count"]) month2 = pd.DataFrame(data = count_bigrams[1], index= bigrams[1], columns= ["Count"]) 

Hay varias maneras de resolverlo, pero resolví de esta manera:

 >>text = ['cant railway station','citadel hotel',' police stn'] >>text2 = [[word for word in line.split()] for line in text] >>text2 [['cant', 'railway', 'station'], ['citadel', 'hotel'], ['police', 'stn']] >>output = [] >>for i in range(len(text2)): output = output+list(bigrams(text2[i])) >>#Here you can use list comphrension also >>output [('cant', 'railway'), ('railway', 'station'), ('citadel', 'hotel'), ('police', 'stn')]