2017-10-04 2 views
1

ich brauche: 1. Paare zu bilden Bigramm und speichern sie in der Liste 2. find Summe von id, in dem es аrе Top-3-Bigramm mit der höchsten FrequenzBigramme von Wörtern in der Liste der Sätze Forming und das Zählen Bigrams Python mit

ich habe eine Liste von Sätzen:

[['22574999', 'your message communication sent'] 
, ['22582857', 'your message be delivered'] 
, ['22585166', 'message has be delivered'] 
, ['22585424', 'message originated communication sent']] 

Hier ist, was ich tat:

for row in messages: 
    sstrm = list(row) 
    bigrams=[b for l in sstrm for b in zip(l.split(" ")[:1], l.split(" ")[1:])] 
    print(sstrm[0],bigrams) 

, die ergibt:

22574999 [('your', 'message')] 
22582857 [('[your', 'message')] 
22585166 [('message', 'has')] 
22585424 [('message', 'originated')] 

Was ich will, ist:

22574999 [('your', 'message'),('communication','sent')] 
22582857 [('[your', 'message'),('be','delivered')] 
22585166 [('message', 'has'),('be','delivered')] 
22585424 [('message', 'originated'),('communication','sent')] 

Ich möchte folgendes Ergebnis Ergebnis erhalten:

Top-3-Bigramme mit höchster Frequenz:

('your', 'message') :2 
('communication','sent'):2  
('be','delivered'):2 

Summe aus id in dem es oben 3 bigrams mit der höchsten Frequenz gibt:

('your', 'message'):2   Is included (22574999,22582857)  
('communication','sent'):2  Is included(22574999,22585424) 
('be','delivered'):2   Is included (22582857,22585166) 

Danke für Ihre Hilfe!

Antwort

1

Das erste, was Ich mag würde, darauf hinzuweisen ist, dass Bigrams sind Sequenzen von zwei benachbarten Elementen.

Zum Beispiel können die Bigramme von „der Fuchs sprang über den faulen Hund“ sind:

[("the", "fox"),("fox", "jumped"),("jumped", "over"),("over", "the"),("the", "lazy"),("lazy", "dog")]

Dieses Problem modelliert werden kann ein inverted index verwendet wird, wo die Bigramme die Buchungen sind und die Menge der IDs sind die Buchungslisten.

def bigrams(line): 
    tokens = line.split(" ") 
    return [(tokens[i], tokens[i+1]) for i in range(0, len(tokens)-1)] 


if __name__ == "__main__": 
    messages = [['22574999', 'your message communication sent'], ['22582857', 'your message be delivered'], ['22585166', 'message has be delivered'], ['22585424', 'message originated communication sent']] 
    bigrams_set = set() 

    for row in messages: 
     l_bigrams = bigrams(row[1]) 
     for bigram in l_bigrams: 
      bigrams_set.add(bigram) 

    inverted_idx = dict((b,[]) for b in bigrams_set) 

    for row in messages: 
     l_bigrams = bigrams(row[1]) 
     for bigram in l_bigrams: 
      inverted_idx[bigram].append(row[0]) 

    freq_bigrams = dict((b,len(ids)) for b,ids in inverted_idx.items()) 
    import operator 
    top3_bigrams = sorted(freq_bigrams.iteritems(), key=operator.itemgetter(1), reverse=True)[:3] 

Ausgabe

[(('communication', 'sent'), 2), (('your', 'message'), 2), (('be', 'delivered'), 2)] 

Obwohl dieser Code durch ein hohes Maß optimiert werden kann, gibt es Ihnen die Idee.

0

Sie haben einen Fehler in dieser Zeile:

bigrams=[b for l in sstrm for b in zip(l.split(" ")[:1], l.split(" ")[1:])] 

In Ihrem ersten Argumente in der Zip Dich mit den [:1] am ersten Elemente der Liste zu stoppen. Sie möchten jedes Element außer dem letzten erhalten, das [:-1] entspricht.

So sollte die Zeile aussehen:

bigrams=[b for l in sstrm for b in zip(l.split(" ")[:-1], l.split(" ")[1:])] 
Verwandte Themen