【问题标题】:Efficiently replacing in a python triple-nested list在 python 三重嵌套列表中有效替换
【发布时间】:2016-04-12 23:56:01
【问题描述】:

我有一个 twitter 数据列表,其中包含单词和相关的词性标签,例如:

[  
   [  
      [  
         'word1.1',
         'tag1.1'
      ],
      [  
         'word1.2',
         'tag1.2'
      ]
   ],
   [  
      [  
         'word2.1',
         'tag2.1'
      ],
      [  
         'word2.2',
         'tag2.2'
      ]
   ]
]

其中word1.1 是第一条推文的第一个词,tag1.1 是它的关联标签,等等。我想在所有推文中替换所有出现少于阈值(比如 2)次的词未知单词令牌<unknown>

我正在使用collections.Counter 快速获取出现次数少于此阈值的单词列表,但我正在寻找一种方法来快速替换出现次数少于此阈值的单词。我现在正在做的是让所有单词都被替换,并遍历每条推文的每个单词,检查单词是否在要替换的单词列表中,如果是则替换它。然而,这是非常昂贵的;有没有更好的方法来做到这一点?

如果我将替换的阈值设置为 2(也就是替换所有单例),则有 97956 个单词要替换。我不确定总共有多少字,但有 50,000 条推文。

谢谢!

【问题讨论】:

  • 您没有指明是否将标签作为单词身份的一部分。也就是说,如果一个词以不同的方式被标记(例如,“play”可以是名词或动词),这算作出现一次还是两次?

标签: python algorithm performance


【解决方案1】:

使这更快的一种方法是使list 的事物删除set

【讨论】:

    【解决方案2】:

    如果可能的话,我建议将这些词合并为具有多个引用的常见项目组。考虑一下:

    tweets = [
        [ ['hello'], ['how'], ['are'], ['you?'], ],
        [ ['hello'], ['i'], ['am'], ['fine'] ],
    ]
    

    您可以这样合并它们:

    one_true_hello = tweets[0][0]
    
    tweets[1][0] = one_true_hello
    

    此时,第一条推文和第二条推文实际上都引用了同一个['hello'] 列表。 (这是通过引用/按值传递问题中常见的混淆来源。)因此,如果您对 one_true_hello 列表进行更改,它将出现在这两个位置。

    如果您可以在计数时执行合并(可能通过将计数作为列表的第三个元素,在单词和标签之后?),那么您可以转换您的 O(n) 问题(n=使用的单词数)进入一个 O(m) 问题(m = 使用的不同单词)并一次性完成替换(只需重置 'hello' -> '' 当 count

    【讨论】:

      【解决方案3】:

      也许你可以用json来做,例如:

      import json
      a = [
          [
              [
                  'word1.1',
                  'tag1.1',
              ]
          ],
      ]
      b = json.dumps(a)
      b = b.replace('"word1.1"', '"<unknown>"')
      a = json.loads(b)
      

      【讨论】:

        猜你喜欢
        • 2021-12-01
        • 2013-01-29
        • 1970-01-01
        • 2021-11-12
        • 2018-08-16
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多