Удалить подстроки \ xDD из Pandas Dataframe - PullRequest
1 голос
/ 04 марта 2020

У меня есть Pandas фрейм данных, в котором есть столбец Tweet, содержащий некоторые из его данных, например:

Tweet

 Ya bani taplak dkk \xf0\x9f\x98\x84\xf0\x9f\x98\x84\xf0\x9f\x98\x84
Setidaknya gw punya jari tengah buat lu, sebelom gw ukur nyali sama bacot lu \xf0\x9f\x98\x8f'
Ari sarua beki mah repeh monyet\xf0\x9f\x98\x86\xf0\x9f\x98\x86'
 Cerita silat lae \xf0\x9f\x98\x80 semacam Kho Ping Hoo yang dari Indonesia, tapi Liang Ie Shen penulis dari China

Как видите, эти коды являются байтовым кодом Emoji. Например, исходная форма первой строки: "Ya bani taplak dkk ???" , где ? обозначено как \ xf0 \ x9f \ x98 \ x84. Я создал список смайликов, который содержит код, основанный на этом сайте , и я хочу удалить эти коды из данных твитов, поэтому мой желаемый результат для первой строки - "Ya bani taplak dkk" .

Я пытался применить ответ эта проблема для фрейма данных, но он не работает. Сначала я подозревал, что, возможно, потому, что большинство байтовых кодов связаны без пробела, как вы можете видеть из первой и третьей строки. Однако даже второй и четвертый ряды тоже не изменились. Вот мой код:

df = pd.read_csv(tweet_data, sep='\t')
df2 = pd.read_csv(emoji_data, sep='\t')

emoji_list = df2['Code 2'].tolist()

df['Tweet'] = df['Tweet'].str.replace(r'\\n', '').str.replace(r'RT', '').str.replace(r'USER', '').str.replace(r'URL', '')

p = re.compile('|'.join(map(re.escape, emoji_list)))
df['Tweet'] = [p.sub('', text) for text in df['Tweet']] 

Любая помощь приветствуется, спасибо.

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Если вы обрабатываете данные твитов, у меня есть функция для их очистки.

import re
from nltk.tokenize import WordPunctTokenizer

def clean_tweets(tweet):
    user_removed = re.sub(r'@[A-Za-z0-9]+','',tweet)
    link_removed = re.sub('https?://[A-Za-z0-9./]+','',user_removed)
    only_alphanumeric = re.sub('[^a-zA-Z0-9]', ' ', user_removed)
    lower_case_tweet = only_alphanumeric .lower()
    tok = WordPunctTokenizer()
    words = tok.tokenize(lower_case_tweet)
    clean_tweet = (' '.join(words)).strip()
    return clean_tweet

Тогда вам нужно только применить эту функцию к столбцу, который содержит данные твитов.

df['Tweet'] = df['Tweet'].apply(clean_tweets)

Если вы хотите, чтобы указанный c код удалял эмодзи, то есть re.sub('[^a-zA-Z0-9]', ' ', tweet), он отфильтрует строку, так что он будет содержать только буквенный символ c. Надеюсь, это поможет.

0 голосов
/ 06 марта 2020

Чтобы удалить одно или несколько повторений литеральной подстроки \x, за которой следуют два шестнадцатеричных символа в Python, вы можете использовать

(?:\\x[A-Fa-f0-9]{2})+

См. Демонстрационный пример regex .

Вот несколько примеров:

import re
rx = r"\s*(?:\\x[A-Fa-f0-9]{2})+"
text = r"Ya bani taplak dkk \xf0\x9f\x98\x84\xf0\x9f\x98\x84\xf0\x9f\x98\x84"
print( re.sub(rx, '', text) )
# => Ya bani taplak dkk

\s* соответствует 0+ пробелам, используемым для обрезки по левому краю удаленного соответствия.

В Pandas используйте Series.str.replace:

df['Tweet'] = df['Tweet'].str.replace(r"\s*(?:\\x[A-Fa-f0-9]{2})+", "")
0 голосов
/ 04 марта 2020

Итак, я нашел ответ. Это заняло так много времени, потому что я пытался экспериментировать с решением без данных. Учтите это:

text = 'Ya bani taplak dkk \xf0\x9f\x98\x84'
removed = re.sub(r"\\x[A-Za-z0-9./]+", "", text)

Это не работает. Однако, если вы поставите r, чтобы указать необработанную строку перед текстом, как показано ниже:

removed = re.sub(r"\\x[A-Za-z0-9./]+", "", r'Ya bani taplak dkk \xf0\x9f\x98\x84')

, это сработает и выведет «Ya bani taplak dkk». Глупо, я потратил довольно много времени, чтобы найти способ реализовать этот подход для dataframe, и, наконец, я просто попробую этот код, чтобы увидеть, как он работает без больших ожиданий:

df['Tweet'] = df['Tweet'].str.replace(r'\\x[A-Za-z0-9./]+', '')

И он работает сразу. Возможно, pandas dataframe уже адаптирует текстовые данные, поэтому вам не нужно читать их по r (необработанная строка). Но это только мое слабое предположение. Если бы кто-нибудь мог дать здравое объяснение этому, я был бы признателен. Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...