替换稀有单词标记:Python
我希望能够用语料库中的标识符“UNK”替换所有稀有词。下面的代码可以工作,但速度相当慢。有更好更聪明的方法吗?编辑:瓶颈是替换稀有单词标记:Python,python,pandas,Python,Pandas,我希望能够用语料库中的标识符“UNK”替换所有稀有词。下面的代码可以工作,但速度相当慢。有更好更聪明的方法吗?编辑:瓶颈是rareWordstoUNK功能-前面的部分速度非常快。我的熊猫系列大约有80000行 X_train是一个pandas系列,其中每个“行”都是单词标记的列表,例如[“this”、“is”、“my”、“first”、“句子]]。我循环浏览并创建一个词频字典,然后创建一个非稀有词列表(本例中为frequency>1)。然后我想把这个应用到未来的数据中,如果这个词很少见或者以前没
rareWordstoUNK
功能-前面的部分速度非常快。我的熊猫系列大约有80000行
X_train
是一个pandas系列,其中每个“行”都是单词标记的列表,例如[“this”、“is”、“my”、“first”、“句子]]
。我循环浏览并创建一个词频字典,然后创建一个非稀有词列表(本例中为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'))
我认为方法上的一个小小的改变将导致性能的大幅度提高。您的
keeplist
中很可能包含大量项目,因此,keeplist中的w
比较可能很慢。根据这是一个O(n)操作。所以在rareWordstoUNK中实际上有一个嵌套循环
为什么不建立一个不常用的单词列表,并与之进行比较呢?该列表可能更小,所以O(m)正如@ChrisP所建议的那样,您可以使用列表而不是列表<根据上面的链接,s中的代码>x操作为O(1) 我认为方法上的一点小小改变将导致性能的大幅提高。您的
keeplist
中很可能包含大量项目,因此,keeplist中的w
比较可能很慢。根据这是一个O(n)操作。所以在rareWordstoUNK中实际上有一个嵌套循环
为什么不建立一个不常用的单词列表,并与之进行比较呢?该列表可能更小,所以O(m)正如@ChrisP所建议的那样,您可以使用列表而不是列表<根据上面的链接,s中的代码>x操作为O(1) 正如@e4c5已经提到的: keeplist中的
w
比较可能很慢
从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'))
正如@e4c5已经提到的: keeplist中的
w
比较可能很慢
从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'))
检查-这与您的任务非常相似。您还可以使用
frozenset
对示例计算单词的keeplist
@MaxU进行检查,但这不是问题所在-痛点在于替换。检查-这与您的任务非常相似您可能还受益于使用frozenset
对keeplist
@MaxU进行示例计算字数,但这不是问题所在-痛点在于替换。感谢您的建议。问题是,我需要说“任何不在大列表中的单词都需要重新编码”。这包括在培训数据中未看到但可能在未来数据中出现的单词。感谢您的建议。问题是,我需要说“任何不在大列表中的单词都需要重新编码”。这包括在培训数据中未看到但可能在未来数据中出现的单词。