我希望能够用标识符替换所有罕见的单词' 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'))
答案 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'))