Vraag Vormen van Bigrams van woorden in de lijst van zinnen met Python


Ik heb een lijst met zinnen:

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

Ik moet bigram-paren vormen en deze in een variabele opslaan. Het probleem is dat als ik dat doe, ik een paar zinnen krijg in plaats van woorden. Dit is wat ik deed:

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

welke opbrengsten

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

Kan station en citadelhotel geen bigram vormen. Wat ik wil is

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

Het laatste woord van de eerste zin mag niet samengaan met het eerste woord van de tweede zin. Wat moet ik doen om het te laten werken?


12
2018-02-18 04:41


oorsprong


antwoorden:


Gebruik makend van lijst begrijpt en ritssluiting:

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

28
2018-02-18 05:04



In plaats van dat je je tekst in lijsten met strings verandert, begin je met elke zin apart als een string. Ik heb interpunctie en stopwoorden ook verwijderd, verwijder deze gedeelten als het niet relevant voor u is:

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

Om het te gebruiken, doe als volgt:

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

Merk op dat dit een beetje verder gaat en eigenlijk statistisch de bigrammen scoort (wat handig kan zijn bij het trainen van het model).


6
2018-02-18 04:55



Zonder 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
2018-02-18 05:00



import nltk

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 for as many as you want 

2
2018-02-19 18:30



Alleen de code van Dan repareren:

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
2017-10-02 20:34



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

Gebruiken van enumerate en split-functie.


0
2018-02-18 06:21



Lees de dataset

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

Verzamel alle beschikbare maanden

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

Maak tokens van alle tweets per maand

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

Maak bigrams per maand

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

Count bigrams per maand

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

Verpak het resultaat in overzichtelijke dataframes

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
2018-05-09 20:00