首页 > 解决方案 > 如何摆脱我的标记化输出中的空字符串?

问题描述

预处理推文后,我得到一个空字符串作为最常见的标记之一。我已经用“”(空格)和“”(空字符串)尝试了 re.sub 函数,但无法摆脱空字符串。
我认为它可能会在连续三个空格时发生。所以我尝试re.sub(r'(?<= ) (?= )'了,但没有奏效。
我还尝试使用获取空字符串的索引tokens.index('')并获取输出ValueError: '' is not in list,但是当从输出中复制粘贴空字符串时,它返回了索引。

有什么想法吗?

#Join all Tweets
tweets_joined = " ".join(all_tweets)
   
#Safe urls and remove them
no_links = re.sub(r'https://t.co/\w{10}', ' ', tweets_joined)


#Remove emojis
emojis = re.compile("(["
u"\U0001F600-\U0001F64F"  # emoticons
u"\U000025B0-\U000025BF"  # geometric shapes
u"\U00002190-\U000021FF"  # arrows
u"\U000027A0-\U000027AF"  # arrows
u"\U0001F300-\U0001F5FF"  # symbols & pictographs
u"\U0001F680-\U0001F6FF"  # transport & map symbols
u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
                "])", flags= re.UNICODE)

no_emojis = re.sub(emojis, ' ', no_links)

#put together big numbers (german writing)
safe_numbers = re.sub(r'(?<=\d)\.(?=\d)', '', no_emojis)

#remove html tags
no_newlines = re.sub(r'\n', ' ', safe_numbers)
no_amp = re.sub(r'&amp;', ' ', no_newlines)


#remove punctuation
interpunkt = string.punctuation + "„“–»«´’&quot;
interpunkt = interpunkt.replace("#","")
interpunkt = interpunkt.replace("@","")
no_punct_text = no_amp
for punct in interpunkt:  # durch Interpunktionszeichen in string.punctuation iterieren
        no_punct_text = no_punct_text.replace(punct, ' ')  # Satzzeichen entfernen
        
#remove empty strings (this attempt failed)
no_empty_string = re.sub(r'(?<= ) (?= )', '', no_punct_text)
        
#casefold
text_lower = no_empty_string.casefold()

#tokenize
tokens = nltk.tokenize.word_tokenize(text_lower)


以下是 `tokens` 输出的一部分:
 '#berlin',
 '#bundestag',
 '#brandner',
 '️',
 'wer',
 'hält',
 'sie',
 'auf'

标签: pythonpython-3.xnltk

解决方案


你的工作流程……很复杂。但有时最简单或最好的标记化正则表达式只会生成空标记以及好东西。而不是跳过箍来避免空令牌,只需通过后处理摆脱它们:

clean_tokens = [ tok for tok in tokens if tok ]

推荐阅读