it-swarm.com.de

Bigramme von Wörtern in der Satzliste mit Python bilden

Ich habe eine Liste von Sätzen:

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

Ich muss Bigram-Paare bilden und in einer Variablen speichern. Das Problem ist, dass ich, wenn ich das tue, ein Paar Sätze anstelle von Wörtern bekomme. Folgendes habe ich getan: 

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

was ergibt 

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

Der Bahnhof und das Zitadellenhotel können nicht zu einem Bigram gehören. Was ich will ist 

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

Das letzte Wort des ersten Satzes sollte nicht mit dem ersten Wort des zweiten Satzes verschmelzen. Was soll ich tun, damit es funktioniert?

14

Verwenden von Listenverständnissen und 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')]
32
butch

Beginnen Sie Ihren Text nicht in eine Liste von Zeichenfolgen, sondern beginnen Sie mit jedem Satz separat als Zeichenfolge. Ich habe auch Satzzeichen und Stoppwörter entfernt. Entfernen Sie einfach diese Teile, wenn sie für Sie irrelevant sind:

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

So verwenden Sie es:

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

Beachten Sie, dass dies etwas weiter geht und statistisch die Bigramme statistisch bewertet (was sich beim Trainieren des Modells als nützlich erweisen wird).

6
Dan

Ohne 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']]]
4
alfasin
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
3
gurinder
>>> 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')]

Verwenden der Aufzählungs- und Aufteilungsfunktion.

1
Tanveer Alam

Einfach den Code von Dan reparieren:

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
1
Jay Marm

Lesen Sie den Datensatz

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

Sammeln Sie alle verfügbaren Monate

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

Erstellen Sie Token aller Tweets pro Monat

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

Erstellen Sie Bigrams pro Monat

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

Zählen Sie Bigrams pro Monat

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

Fassen Sie das Ergebnis in ordentlichen Datenrahmen zusammen

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

Es gibt eine Anzahl von Möglichkeiten , um es zu lösen, aber ich habe es so gelöst:

>>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')]
0
saicharan