有效地替换python三重嵌套列表

时间:2016-04-12 23:56:02

标签: python algorithm performance

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

[  
   [  
      [  
         '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条推文。

谢谢!

3 个答案:

答案 0 :(得分:0)

提高速度的方法是让list项内容删除set

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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 =使用不同的单词)并在一次通过中进行替换(只需重置&#39;你好&#39; - &gt;&#39;&#39;当计数&lt; 2时)