Удаление нежелательных слов (символов) из твитов в CSV-файле в python - PullRequest
0 голосов
/ 18 января 2020

У меня есть CSV-файл с 60000+ твитов. Я очистил файл в определенной степени. Но в нем по-прежнему есть слова (вероятно, смешанные символы, пропущенные после очистки URL), которые не имеют никакого смысла. Я не могу публиковать изображения. Итак, я публикую часть файла. "" "

Fintech Bitcoin crowdfunding and cybersecurity fintech bitcoin crowdfunding and cybersecurity
monster has left earned total satoshi monstercoingame Bitcoin
Bitcoin TCH bitcoin btch
bitcoin iticoin SPPL BXsAJ
coindesk The latest Bitcoin Price Index USD pic twitter com aKk
Trends For Bitcoin Regulation ZKdFZS via CoinDeskpic twitter com KNKgFcdxYD
Now there Mike Tyson Bitcoin app theres mike tyson bitcoin app
BitcoinBet Positive and negative proofs blockchain audits Bitcoin Bitcoin via
The latest Bitcoin Price Index USD pic twitter com CivXlPj
Bitcoin price index pic twitter com xhQQ mbRIb

Как видите, некоторые символы (например, aKk, KNKgFcdxYD, xhQQ) не имеют никакого смысла, поэтому я хочу удалить их. Они хранятся в столбец с именем [clean_tweet].

Я собрал следующий код для всей цели очистки (от сырых твитов до текущей версии, которую я разместил), но не знаю, как я могу удалить эти "символы". Мой код выглядит следующим образом. Любые предложения будут оценены. Спасибо.

import re
import pandas as pd 
import numpy as np 
import string
import nltk
from nltk.stem.porter import *
import warnings 
from datetime import datetime as dt

warnings.filterwarnings("ignore", category=DeprecationWarning)

tweets = pd.read_csv(r'myfilepath.csv')
df = pd.DataFrame(tweets, columns = ['date','text'])

df['date'] = pd.to_datetime(df['date']).dt.date #changing date to datetime format from time-series

#removing pattern from tweets

def remove_pattern(input_txt, pattern):
    r = re.findall(pattern, input_txt)
    for i in r:
        input_txt = re.sub(i, '', input_txt)
    return input_txt   

# remove twitter handles (@user)
tweets['clean_tweet'] = np.vectorize(remove_pattern)(tweets['text'], "@[\w]*")
#remove urls    
tweets['clean_tweet'] = np.vectorize(remove_pattern)(tweets['text'], "https?://[A-Za-z./]*")

## remove special characters, numbers, punctuations
tweets['clean_tweet'] = tweets['clean_tweet'].str.replace("[^a-zA-Z#]", " ")
#      
tweets['clean_tweet'] = tweets['clean_tweet'].apply(lambda x: ' '.join([w for w in x.split() if len(w)>2]))  

Ответы [ 3 ]

0 голосов
/ 18 января 2020

Следуя моим комментариям, я полагаю, что ваша задача станет легче, если вы воспользуетесь библиотекой проверки орфографии, чтобы проверить, действительны ли слова на английском языке sh или нет.

Примерно так (с помощью enchant, например):

import enchant
from pprint import pprint

en_us = enchant.Dict("en_US")
text = '''
Fintech Bitcoin crowdfunding and cybersecurity fintech bitcoin crowdfunding and cybersecurity
monster has left earned total satoshi monstercoingame Bitcoin
Bitcoin TCH bitcoin btch
bitcoin iticoin SPPL BXsAJ
coindesk The latest Bitcoin Price Index USD pic twitter com aKk
Trends For Bitcoin Regulation ZKdFZS via CoinDeskpic twitter com KNKgFcdxYD
Now there Mike Tyson Bitcoin app theres mike tyson bitcoin app
BitcoinBet Positive and negative proofs blockchain audits Bitcoin Bitcoin via
The latest Bitcoin Price Index USD pic twitter com CivXlPj
Bitcoin price index pic twitter com xhQQ mbRIb
'''
phrases = text.split('\n')
print('BEFORE')
pprint(phrases)

for i, phrase in enumerate(phrases):
    phrases[i] = ' '.join(w for w in phrase.split() if en_us.check(w))

print('AFTER')
pprint(phrases)

Приведенный выше код будет выглядеть примерно так:

BEFORE
['',
 'Fintech Bitcoin crowdfunding and cybersecurity fintech bitcoin crowdfunding '
 'and cybersecurity',
 'monster has left earned total satoshi monstercoingame Bitcoin',
 'Bitcoin TCH bitcoin btch',
 'bitcoin iticoin SPPL BXsAJ',
 'coindesk The latest Bitcoin Price Index USD pic twitter com aKk',
 'Trends For Bitcoin Regulation ZKdFZS via CoinDeskpic twitter com KNKgFcdxYD',
 'Now there Mike Tyson Bitcoin app theres mike tyson bitcoin app',
 'BitcoinBet Positive and negative proofs blockchain audits Bitcoin Bitcoin '
 'via',
 'The latest Bitcoin Price Index USD pic twitter com CivXlPj',
 'Bitcoin price index pic twitter com xhQQ mbRIb',
 '']
AFTER
['',
 'Bitcoin and bitcoin and',
 'monster has left earned total Bitcoin',
 'Bitcoin bitcoin',
 'bitcoin',
 'The latest Bitcoin Price Index pic twitter com',
 'Trends For Bitcoin Regulation via twitter com',
 'Now there Mike Tyson Bitcoin app mike bitcoin app',
 'Positive and negative proofs audits Bitcoin Bitcoin via',
 'The latest Bitcoin Price Index pic twitter com',
 'Bitcoin price index pic twitter com',
 '']

НО, как вы можете видеть, такие слова, как Fintech, crowdfunding и cybersecurity (чтобы перечислить несколько) были помечены как недействительные в Engli sh, поэтому вам нужно будет настроить код под свои нужды.

Надеюсь, это поможет.

Обновление: чтобы добавить исключения слов в свою программу проверки орфографии, сделайте что-то вроде этого:

exceptions = [
    'Fintech',
    'crowdfunding',
    'cybersecurity',
    'fintech',
    'crowdfunding',
    'cybersecurity',
    'satoshi',
    'monstercoingame',
    'TCH',
    'coindesk',
    'USD',
    'CoinDeskpic',
    'theres',
    'tyson',
    'BitcoinBet',
    'blockchain',
    'USD'
]

for word in exceptions:
    # add word to personal dictionary
    #en_us.add(word)
    # or add word just for this session only
    en_us.add_to_session(word)
0 голосов
/ 18 января 2020

есть способ сделать это, используя nltk, он также удалит URL.

url сначала нужно перезапустить, иначе вы удалите некоторые слова из url и сделаете его хуже

nltk.download('words') # if its needed
words = set(nltk.corpus.words.words())

def clean_tweets(text):
    text= re.sub(r'https.?://[^\s]+[\s]?', '', text)
    return " ".join(w for w in nltk.wordpunct_tokenize(text) \
     if w.lower() in words or not w.isalpha())

это уберет бессмысленные слова пример

test = 'this is a  test KNKgFcdxYD to check https://stackoverflow.com/questions/295 xhQQ'
ret = clean_tweets(test)
print(ret)
# output
#this is a test to check
0 голосов
/ 18 января 2020

Может быть проще квалифицировать персонажей, которых вы хотите, вместо вселенной нежелательных. Отрицательное совпадение с регулярным выражением?

    if (re.match(r'[A-Za-z0-9@#$%^&*()!-+='";:?', char) is not None) is False:
         replace(char, '')

Очистите что-то вроде этого регулярного выражения немного вверх для того, что вы ищете, и просто l oop через символы каждой строки. А потом, слава Богу, что компьютеры сделали всю работу за вас!

...