Код, используемый для предварительной обработки твитов, полученных из Twitter

Ниже я обрисовал в общих чертах код, который я использовал для предварительной обработки моих проектов обработки естественного языка. Этот код в основном использовался в твитах, полученных из Twitter для классификаторов. Я надеюсь, что это руководство поможет начинающим специалистам по обработке данных и инженерам по машинному обучению, ознакомив их с некоторыми очень полезными инструментами и шагами НЛП, необходимыми для обработки естественного языка.

Пакеты для импорта

from nltk.stem import LancasterStemmer, SnowballStemmer, RegexpStemmer, WordNetLemmatizer 
#this was part of the NLP notebook
import nltk
nltk.download('punkt')
#import sentence tokenizer
from nltk import sent_tokenize
#import word tokenizer
from nltk import word_tokenize
#list of stopwords
from nltk.corpus import stopwords
import string

Работа со смайликами

import emoji
#checking if a character is an emoji
def char_is_emoji(character):
    return character in emoji.UNICODE_EMOJI
#does the text contain an emoji?
def text_has_emoji(text):
    for character in text:
        if character in emoji.UNICODE_EMOJI:
            return True
    return False
#remove the emoji
def deEmojify(inputString):
    return inputString.encode('ascii', 'ignore').decode('ascii')

Удаление знаков препинания

punct =[]
punct += list(string.punctuation)
punct += '’'
punct.remove("'")
def remove_punctuations(text):
    for punctuation in punct:
        text = text.replace(punctuation, ' ')
    return text

Следующая функция использовалась для предварительной обработки твитов для проекта классификатора, над которым я работал. Это должно быть аналогичным образом применимо и к другим проектам НЛП, над которыми вы, возможно, работаете. Вышеуказанные функции помогут ниже.

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

def nlp(df):
    # lowercase everything
    # get rid of '\n' from whitespace
    # regex remove hyperlinks
    # removing '>'
    # check for emojis
    # remove emojis
    # remove punctuation
    # remove ' s ' from removing punctuation
  
    # lowercase everything
    df['token'] = df['tweet'].apply(lambda x: x.lower())
    # get rid of '\n' from whitespace 
    df['token'] = df['token'].apply(lambda x: x.replace('\n', ' '))
    # regex remove hyperlinks
    df['token'] = df['token'].str.replace('http\S+|www.\S+', '', case=False)
    # removing '>'
    df['token'] = df['token'].apply(lambda x: x.replace('>', ''))
    # Checking if emoji in tokens column, use for EDA purposes otherwise not necessary to keep this column
    df['emoji'] = df['token'].apply(lambda x: text_has_emoji(x))
    # Removing Emojis from tokens
    df['token'] = df['token'].apply(lambda x: deEmojify(x))
    # remove punctuations
    df['token'] = df['token'].apply(remove_punctuations)
    # remove ' s ' that was created after removing punctuations
    df['token'] = df['token'].apply(lambda x: str(x).replace(" s ", " "))
    return df

Лемматизация с использованием простора

import spacy
from spacy.lemmatizer import Lemmatizer
from spacy.lookups import Lookups
sp = spacy.load('en')
lookups = Lookups()
lemm = Lemmatizer(lookups)

Создание и выполнение функции леммы

def lemma_function(text):
    dummy = []
    #this is just a test to see if it works
    for word in sp(text):
        dummy.append(word.lemma_)
    return ' '.join(dummy)
df['lemmatized'] = df['token'].apply(lambda x: lemma_function(x))

После лемматизации твитов я обнаружил, что в моем тексте появляется «-PRON-» - «фраза», которая появляется после того, как вы лемматизируете местоимение, используя простор. Это не имеет значения для информирования меня о содержании твита, поэтому я также удаляю эту фразу «-PRON-».

df['lemmatized'] = df['lemmatized'].apply(lambda x: x.replace('-PRON-', ' '))

Токенизация моих данных

df['final_text'] = df['lemmatized'].apply(word_tokenize)

Удаление стоп-слов из моих токенов

from nltk.corpus import stopwords
my_stopwords = set(stopwords.words('english'))
df['final_text'] = df['final_text'].apply(lambda text_list: [x for x in text_list if x not in stopwords.words('english')])

Удаление чисел из моих токенизированных текстовых данных

df['final_text'] = df['final_text'].apply(lambda list_data: [x for x in list_data if x.isalpha()])

Теперь, когда большая часть данных вашего твита была предварительно обработана, ваши данные должны быть намного чище. У вас есть более широкий спектр соображений, помимо того, что было показано выше. В своих проектах классификаторов я также использовал TextBlob для автоматического исправления любых орфографических ошибок в моем корпусе. Но помните, что TextBlob может быть дорогостоящим в вычислительном отношении. Кроме того, как только вы полностью предварительно обработали свои данные и будете готовы создать свой набор слов (векторизатор подсчета) или векторизатор TF-IDF, вы можете настроить параметры в соответствии с вашими требованиями для задачи машинного обучения.

Я надеюсь, что это руководство ускорит предварительную обработку ваших текстовых данных для вашего следующего проекта НЛП. Не стесняйтесь оставлять любые мысли и идеи.