2017-10-04 3 views
1

j'ai besoin: 1. pour former bigramme paires et de les stocker dans la liste 2. trouver somme id dans laquelle il êtes top 3 bigramme avec la plus haute fréquenceLa formation bigrammes de mots dans la liste des phrases et de comptage bigrammes en utilisant python

J'ai une liste de phrases:

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

Voici ce que je l'ai fait:

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) 

qui donne:

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

Ce que je veux:

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

Je voudrais obtenir le résultat suivant RÉSULTAT:

top 3 bigrams avec la plus haute fréquence:

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

somme de id dans lequel il y a top 3 bigrams avec la fréquence la plus élevée:

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

Merci pour votre aide.

Répondre

1

première chose que je voudrais souligner est que bigrams sont des séquences de deux éléments adjacents.

Par exemple, les bigrammes de « le renard a sauté sur le chien paresseux » sont:

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

Ce problème peut être modélisé en utilisant un inverted index, où les bigrammes sont les messages et l'ensemble des identifiants sont les listes d'envoi.

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] 

Sortie

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

Bien que ce code peut être optimisé par beaucoup, il vous donne l'idée.

0

Vous avez une erreur dans cette ligne:

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

Dans votre premier argument dans le zip que vous vous arrêtez au premier élément de la liste avec le [:1]. Vous voulez obtenir tous les éléments sauf le dernier, ce qui correspond à [:-1].

Ainsi, la ligne devrait être comme ça:

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