"Обработка естественного языка"

Основные методы предварительной обработки

Методы предварительной обработки текстовых данных объясняются с помощью кода, который улучшает ваши результаты только путем предварительной обработки данных.

Используемые данные, безусловно, являются одним из самых важных элементов в задаче машинного обучения. Конечно, используемые методы следует выбирать в зависимости от типа данных (например, текстовые данные, такие как онлайн-сообщения или разговоры, изображения или audio), но также и от цели проекта (например, классификация, анализ).

Цель этапа предварительной обработки - очистить данные и преобразовать их так, чтобы модель имела наилучшие возможные результаты. Поскольку текстовые данные представлены на естественном языке, они могут содержать нерелевантную и бесполезную информацию, которую следует удалить. Другой аспект заключается в том, что данные должны быть унифицированы, чтобы модель извлекала как можно больше информации.

Лучшие библиотеки для НЛП

Во-первых, для выполнения этих приемов необходимо импортировать и использовать определенные библиотеки. Вероятно, одной из самых популярных библиотек для НЛП является Natural Language Toolkit, известный как NLTK. Это одна из самых сложных библиотек, специализирующихся на обработке естественного языка.

Более новый и более ориентированный на оптимизацию, spaCy - еще один хороший выбор, если вы хотите работать с текстовыми данными. Эта библиотека намного быстрее и точнее, чем NLTK.

Один из способов работы с текстовыми данными - использование регулярного выражения, известного как RegEx. Python имеет встроенный пакет, созданный специально для операций с регулярными выражениями, точнее re.

Scikit-learn - одна из наиболее часто используемых библиотек машинного обучения. Он не специализируется на НЛП, но имеет множество инструментов для предварительной обработки данных. Помимо множества методов подготовки данных перед классификацией, в нем также есть специализированные инструменты для работы с текстовыми данными (например, CountVectorizer, TfidfVectorizer).

Подходы для текстовых данных

  • Токенизация

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

from nltk.tokenize import word_tokenize
text = "This is an example of A phrase WIth lowercase and UPPERCASE"
tokens = word_tokenize(text)
print(tokens)
[‘This’, ‘is’, ‘an’, ‘example’, ‘of’, ‘A’, ‘phrase’, ‘WIth’, ‘lowercase’, ‘and’, ‘UPPERCASE’]
  • Нижний регистр

Компьютер воспринимает слова как числа, поэтому одно и то же слово, написанное в нижнем регистре или в верхнем регистре, интерпретируется по-разному. Поскольку в большинстве случаев каждое предложение начинается с верхнего регистра, могут возникнуть определенные проблемы. Вот пример того, как преобразовать фразу в нижний регистр с помощью встроенного метода Python.

text = "This is an example of A phrase WIth lowercase and UPPERCASE"
text_lower = text.lower() 
print(text_lower)
"this is an example of a phrase with lowercase and uppercase"
  • Удалите знаки препинания

Устранение знаков препинания - один из наиболее часто используемых методов предварительной обработки текста, поскольку он может очищать данные. В большинстве случаев используются знаки препинания, каждая фраза содержит как минимум одну или две. С другой стороны, в некоторых задачах знаки препинания несут релевантную информацию. Например, в анализе настроений многие точки приостановки «…» могут указывать на депрессивное отношение, а множество восклицательных знаков «!» могут указывать на радость или даже гнев. Ниже вы можете увидеть два примера, в одном из которых используется модуль string, а в другом - библиотека re.

# example 1
import string
text = "This is an example; of a phrase with a lot, of punctuation?         marks!!"
text_without_punctuations = text.translate(text.maketrans('', '', string.punctuation))
print(text_without_punctuations)
"This is an example of a phrase with a lot of punctuation marks"
# example 2
import re
text = "This is an example; of a phrase with a lot, of punctuation? marks!!"
text_without_punctuations = re.sub(r'[^\w\s]','',text)
print(text_without_punctuations)
"This is an example of a phrase with a lot of punctuation marks"
  • Удалить лишние пробелы

В некоторых фразах есть лишние пробелы просто по ошибке или после преобразования некоторых символов в пробелы, как я объяснил в предыдущем пункте, поэтому количество пробелов значительно увеличится без добавления информации. Как и в предыдущем примере, я представлю два метода для удаления лишних пробелов, один с использованием только специфичных для строки методов, а другой с использованием библиотеки re.

# example 1
text = "This is  an    example of a phrase    with a  lot of spaces!"
text_without_extra_spaces = " ".join(text.split())
print(text_without_extra_spaces)
"This is an example of a phrase with a lot of spaces!"
# example 2
import re
text = "This is  an    example of a phrase    with a  lot of spaces!"
text_without_extra_spaces = re.sub("\s\s+" , " ", text)
print(text_without_extra_spaces)
"This is an example of a phrase with a lot of spaces!"
  • Удалить цифры

Помимо самих чисел, они также могут появляться в некоторых словах, особенно в онлайн-сообщениях или сообщениях в социальных сетях. Например, «ME2» или «4EVER» эквивалентно «мне тоже», соответственно, «навсегда». для людей, но компьютер видит их совершенно иначе. Вот пример, в котором из текста удаляются только числа, а ниже - пример, в котором удаляются как числа, так и слова, содержащие цифры. Для каждого случая я представлю два примера, один с использованием только специфичных для строки методов, а другой с использованием библиотеки re.

# example 1
text = "Th1s 1s 1 exampl3 of a phras3 conta1n1ng 12 d1g1ts and 11 numb3rs"
text_without_numbers = ''.join([i for i in text if not i.isdigit()])
print(text_without_numbers)
"Ths s exampl of a phras contanng dgts and numbrs"
# example 2
import re
text = "Th1s 1s 1 exampl3 of a phras3 conta1n1ng 12 d1g1ts and 11 numb3rs"
pattern = r'[0-9]'
text_without_numbers = re.sub(pattern, '', text)
print(text_without_numbers)
"Ths s exampl of a phras contanng dgts and numbrs"
# example 3
text = "Th1s 1s 1 exampl3 of a phras3 conta1n1ng 12 d1g1ts and 11 numb3rs"
text_without_numbers = ' '.join(s for s in words.split() if not any(c.isdigit() for c in s))

print(text_without_numbers)
"of a and"
# example 4
import re
text = "Th1s 1s 1 exampl3 of a phras3 conta1n1ng 12 d1g1ts and 11 numb3rs"
text_without_numbers = re.sub(r'\w*\d\w*', '', text).strip()
print(text_without_numbers)
"of a and"
  • Удалить стоп-слова

Стоп-слова - это самые распространенные слова в языке, они хранятся в списке и, поскольку используются очень часто, не несут никакой информации. В английских примерах остановки слова могут быть такими: the, as, of, и т. Д. Вот пример того, как удалить стоп-слова с помощью пакета corpus из библиотеки NLTK. Следует отметить, что NLTK содержит списки стоп-слов для 23 языков, включая голландский, французский или испанский. Перед удалением стоп-слов текст следует токенизировать, чтобы слова можно было фильтровать.

from nltk.tokenize import word_tokenize
text = "This is an example of a phrase with a lot of stop words"
tokens = word_tokenize(text)
for word in tokens:
    if word not in stopwords.words("english"):
        without_stop_words.append(word)
text_without_stop_words = ' '.join(without_stop_words)
print(text_without_stop_words)
[‘This’, ‘example’, ‘phrase’, ‘lot’, ‘stop’, ‘words’]

Помимо очистки данных, удаление всех этих слов, пробелов или знаков препинания также сокращает время, поскольку объем данных уменьшается.

  • Расширьте схватки

Чтобы лучше понимать и анализировать текст, компьютер должен знать, что не и не означают одно и то же. Сокращения можно решить с помощью словаря с сокращениями и развернутыми формами типа это. Более удобный метод - это использование библиотеки Python, например pycontractions или сжатия, как я представляю ниже .

!pip install contractions
import contractions
text = "This is an example of a phrase with contractions such as: I'll, he'd, and she's."
expanded_words = []
for word in text.split():
    expanded_words.append(contractions.fix(word))
text_without_contractions = ' '.join(expanded_words)
print(text_without_contractions)
"This is an example of a phrase with contractions such as: I will, he would, and she is."

Наконец, давайте объясним, что такое лемматизация и основание, и в чем разница между ними.

  • Лемматизация

При лемматизации слово заменяется корневым словом или словом с похожим контекстом путем извлечения из него леммы. Его основная цель - сокращение родственных словоизменительных и словообразовательных форм. Ниже вы можете увидеть лемматизацию с помощью WordNetLemmatizer из библиотеки NLTK.

import nltk
from nltk.stem import WordNetLemmatizer
  
wnl = WordNetLemmatizer()
words = ['oxen', 'mice', 'cats', 'flying', 'singing', 
         'amazing', 'jumping', 'boring', 'went']
lemmatized_words = []
for word in words:
    lemmatized_words.append(wnl.lemmatize(word))
print(lemmatized_words)
[‘ox’, ‘mouse’, ‘cat’, ‘flying’, ‘singing’, ‘amazing’, ‘jumping’, ‘boring’, ‘went’]
  • Основание

Построение сокращает словоформы до (псевдо) основы, что означает, что оно просто удаляет последние несколько символов слова с риском неправильного значения и орфографии. Ниже вы можете увидеть лемматизацию с помощью PorterStemmer из библиотеки NLTK.

import nltk
from nltk.stem import PorterStemmer
ps = PorterStemmer()
words = ['oxen', 'mice', 'cats', 'flying', 'singing', 
         'amazing', 'jumping', 'boring', 'went']
stemmed_words = []
for word in words:
    stemmed_words.append(ps.stem((word)))
print(stemmed_words)
[‘oxen’, ‘mice’, ‘cat’, ‘fli’, ‘sing’, ‘amaz’, ‘jump’, ‘bore’, ‘went’]

Одним из преимуществ лемматизации является то, что этот метод учитывает контекст и параметры POS (часть речи), в отличие от стемминга, поэтому он имеет лучшую точность. Из представленного примера видно, что лемматизация дает более точные результаты, чем стемминг. С другой стороны, поскольку стемминг не принимает во внимание контекст, его легче реализовать и запустить быстрее.

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

Спасибо за чтение! Надеюсь, вам понравилась эта статья!