Код, используемый для предварительной обработки твитов, полученных из 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, вы можете настроить параметры в соответствии с вашими требованиями для задачи машинного обучения.
Я надеюсь, что это руководство ускорит предварительную обработку ваших текстовых данных для вашего следующего проекта НЛП. Не стесняйтесь оставлять любые мысли и идеи.