Ich möchte alle seltenen Wörter mit einem Bezeichner 'UNK' in einem Korpus ersetzen können. Der folgende Code funktioniert, ist aber ziemlich langsam. Gibt es einen besseren, klügeren Weg? EDIT: Der Flaschenhals ist die rareWordstoUNK
Funktion - die vorherigen Teile sind sehr schnell. Es gibt ungefähr 80.000 Reihen in meiner Pandas-Reihe.Seltene Wort-Token ersetzen: Python
X_train
ist eine Pandas-Serie, bei der jede "Zeile" eine Liste von Wort-Token wie ['this','is','my','first', 'sentence']
ist. Ich durchlaufe und erstelle ein Wörterbuch der Worthäufigkeiten und erstelle dann eine Liste der nicht seltenen Wörter (frequency >1
in diesem Beispiel). Dann mag ich dies auf zukünftige Daten anzuwenden, wo, wenn das Wort selten oder vielleicht vor nicht gesehen worden war, wird das Token mit
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'))
Prüfung [diese] (http://stackoverflow.com/a/36310156/5741205) - es ist ziemlich ähnlich Ihrer Aufgabe – MaxU
Sie könnten auch von der Verwendung von 'frozenset' für die' keeplist' profitieren. – ChrisP
@MaxU Dieses Beispiel zählt Wörter, aber das ist nicht das Problem - der Schmerzpunkt ist der Ersatz. –