替换稀有字标记:Python

时间:2016-04-15 21:09:57

标签: python pandas

我希望能够用标识符替换所有罕见的单词' UNK'在语料库中。下面的代码有效,但速度很慢。有更聪明的方法吗?编辑:瓶颈是rareWordstoUNK功能 - 先前的部分非常快。我的熊猫系列中有大约80,000行。

X_train是一个大熊猫系列,其中每个'行'是一个单词标记列表,例如['this','is','my','first', 'sentence']。我循环并创建一个单词频率字典,然后创建一个非罕见单词列表(在此示例中为frequency >1)。然后我想将此应用于未来的数据,如果这个词很少或者之前没有见过,那么令牌将替换为' UNK'

    wordFreqDict={}

#dictionary of word counts    
    for tokenlist in X_train:
        for token in tokenlist:
            if token in wordFreqDict:
                wordFreqDict[token]=wordFreqDict[token]+1
            else:
                wordFreqDict[token]=1

    #non rare tokens        
    FreqWordsGT1=[k for k,v in wordFreqDict.iteritems() if v >1]

    #pass in list and replace those not in keeplist with 'UNK'
    def rareWordstoUNK(tokenlist,keeplist, replaceToken='UNK'):
        return [w if w in keeplist else replaceToken for w in tokenlist  ]

#apply pandas series 


       X_train=X_train.apply(rareWordstoUNK, args=(FreqWordsGT1,'UNK'))

2 个答案:

答案 0 :(得分:0)

我认为方法略有改变会导致性能大幅提升。您的keeplist很可能包含大量项目,因此w in keeplist比较可能会很慢。根据{{​​3}},这是O(n)操作。所以你有效地在rareWordstoUNK中有一个嵌套循环。

为什么不建立不常用的单词列表并与之进行比较呢?该列表可能较小,因此O(m)<为O(n)

同样根据@ChrisP的建议,您可以使用python time complexity data代替列表。根据上面的链接,x in s操作是O(1)。

答案 1 :(得分:0)

正如@ e4c5已经提到的那样:

  

w in keeplist比较可能很慢

从dict获取物品将花费你:O(1)

所以我会用以下方式重写你的功能:

from collections import defaultdict

# change your `wordFreqDict` to defaultdict
wordFreqDict = defaultdict(lambda: 0)

填写wordFreqDict

的代码
def rareWordstoUNK(tokenlist, wordfreq, replaceToken='UNK'):
    """
    will replace all words with frequency <= 1,
    including those which haven't been seen yet (i.e. if this word is not in `wordfreq`)
    """
    return [w if w in wordfreq[w] > 1 else replaceToken for w in tokenlist]

X_train=X_train.apply(rareWordstoUNK, args=(wordFreqDict,'UNK'))

然后像这样调用它:

X_train=X_train.apply(rareWordstoUNK, args=(wordFreqDict,'UNK'))