【问题标题】:Forming Bigrams of words in list of sentences and counting bigrams using python在句子列表中形成单词的二元组并使用python计算二元组
【发布时间】:2017-10-04 13:39:04
【问题描述】:

我需要: 1.形成二元对并将它们存储在列表中 2. 找出频率最高的前 3 个二元组的 id 总和

我有一个句子列表:

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

这是我所做的:

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)

产生:

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

我想要的是:

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

我想得到以下结果 结果:

频率最高的前 3 个二元组:

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

其中出现频率最高的前 3 个二元组的 id 总和:

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

感谢您的帮助!

【问题讨论】:

    标签: python python-3.x list-comprehension word-frequency


    【解决方案1】:

    首先我要指出的是,bigrams 是两个相邻元素的序列。

    例如,“狐狸跳过懒狗”的二元组是:

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

    可以使用 inverted index 对这个问题进行建模,其中二元组是帖子,ID 集是帖子列表。

    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]
    

    输出

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

    虽然这段代码可以优化很多,但它给了你想法。

    【讨论】:

      【解决方案2】:

      你在这一行有一个错误:

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

      在 zip 中的第一个参数中,您将在列表的第一个元素处停止,[:1]。您想获取除最后一个元素之外的所有元素,它对应于[:-1]

      所以这条线应该是这样的:

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

      【讨论】:

        猜你喜欢
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        • 2020-03-04
        • 2011-08-18
        • 2013-11-30
        • 1970-01-01
        • 2014-03-17
        • 2018-05-26
        相关资源
        最近更新 更多