Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换稀有单词标记:Python_Python_Pandas - Fatal编程技术网

替换稀有单词标记:Python

替换稀有单词标记:Python,python,pandas,Python,Pandas,我希望能够用语料库中的标识符“UNK”替换所有稀有词。下面的代码可以工作,但速度相当慢。有更好更聪明的方法吗?编辑:瓶颈是rareWordstoUNK功能-前面的部分速度非常快。我的熊猫系列大约有80000行 X_train是一个pandas系列,其中每个“行”都是单词标记的列表,例如[“this”、“is”、“my”、“first”、“句子]]。我循环浏览并创建一个词频字典,然后创建一个非稀有词列表(本例中为frequency>1)。然后我想把这个应用到未来的数据中,如果这个词很少见或者以前没

我希望能够用语料库中的标识符“UNK”替换所有稀有词。下面的代码可以工作,但速度相当慢。有更好更聪明的方法吗?编辑:瓶颈是
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进行示例计算字数,但这不是问题所在-痛点在于替换。感谢您的建议。问题是,我需要说“任何不在大列表中的单词都需要重新编码”。这包括在培训数据中未看到但可能在未来数据中出现的单词。感谢您的建议。问题是,我需要说“任何不在大列表中的单词都需要重新编码”。这包括在培训数据中未看到但可能在未来数据中出现的单词。