НЛП: построение конвейера очистки текста и предварительной обработки

Обработка естественного языка, сокращенно НЛП, - это подполе машинного обучения / ИИ, которая занимается лингвистикой и человеческими языками. НЛП занимается взаимодействием между компьютерами и человеческими языками. Другими словами, он позволяет и программирует компьютеры, чтобы понимать человеческие языки, а также обрабатывать и анализировать большие объемы данных на естественном языке.

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

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

Удаление тегов HTML

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

# imports
from bs4 import BeautifulSoup
# function to remove HTML tags
def remove_html_tags(text):
    return BeautifulSoup(text, 'html.parser').get_text()
# call function
remove_html_tags( ‘<html> \
 <h1>Article Heading</h1> \
 <p>First sentence of some important article. And another one. And then the last one</p></html>’)

Вывод:

' Article Heading First sentence of some important article. And another one. And then the last one'

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

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

Акценты могут возникать из-за настроек клавиатуры по умолчанию или стиля набора текста. Работа с акцентированными символами становится все более важной, особенно если вы хотите анализировать только английский язык. Следовательно, нам нужно убедиться, что эти символы преобразованы и стандартизированы в символы ASCII. Простой пример - преобразование é в e.

# imports
import unicodedata
# function to remove accented characters
def remove_accented_chars(text):
    new_text = unicodedata.normalize('NFKD', text).encode('ascii', 'ignore').decode('utf-8', 'ignore')
    return new_text
# call function
remove_accented_chars('Sómě Áccěntěd těxt. Some words such as résumé, café, prótest, divorcé, coördinate, exposé, latté.')

Вывод:

'Some Accented text. Some words such as resume, cafe, protest, divorce, coordinate, expose, latte.'

Расширяющиеся схватки

Сокращения - это сокращенные версии слов или слогов. Они создаются путем удаления одной или нескольких букв из слов. Часто более слов объединяются, чтобы создать сокращение. В письменной форме апостроф используется для обозначения места пропущенных букв. В английском языке / тексте сокращения часто встречаются в письменной или устной форме.

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

Для устранения сокращений я использую стандартный набор сокращений, доступный в библиотеке сокращений.

# imports
from contractions import CONTRACTION_MAP # from contractions.py
import re 
# function to expand contractions
def expand_contractions(text, map=CONTRACTION_MAP):
    pattern = re.compile('({})'.format('|'.join(map.keys())), flags=re.IGNORECASE|re.DOTALL)
    def get_match(contraction):
        match = contraction.group(0)
        first_char = match[0]
        expanded = map.get(match) if map.get(match) else map.get(match.lower())
        expanded = first_char+expanded[1:]
        return expanded 
    new_text = pattern.sub(get_match, text)
    new_text = re.sub("'", "", new_text)
    return new_text
# call function 
expand_contractions(“Y’all i’d contractions you’re expanded don’t think.”)

Вывод:

'You all i would contractions you are expanded do not think.'

Другой способ может быть:

# imports
from pycontractions import Contractions
cont = Contractions(kv_model=model)
cont.load_models()
# function to expand contractions
def expand_contractions(text):
    text = list(cont.expand_texts([text], precise=True))[0]
    return text

Удаление специальных символов

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

# imports
import re
# function to remove special characters
def remove_special_characters(text):
    # define the pattern to keep
    pat = r'[^a-zA-z0-9.,!?/:;\"\'\s]' 
    return re.sub(pat, '', text)
 
# call function
remove_special_characters(“007 Not sure@ if this % was #fun! 558923 What do# you think** of it.? $500USD!”)

Вывод:

'007 Not sure if this  was fun! 558923 What do you think of it.? 500USD!'

Удаление чисел

Как вы видели выше, текст сохраняется. Но иногда это может не потребоваться. Поскольку мы имеем дело с текстом, число может не добавить много информации для обработки текста. Итак, числа можно убрать из текста. Мы можем использовать регулярные выражения (regex), чтобы избавиться от чисел. Этот шаг можно комбинировать с предыдущим, чтобы достичь за один шаг.

# imports
import re
# function to remove numbers
def remove_numbers(text):
    # define the pattern to keep
    pattern = r'[^a-zA-z.,!?/:;\"\'\s]' 
    return re.sub(pattern, '', text)
 
# call function
remove_numbers(“007 Not sure@ if this % was #fun! 558923 What do# you think** of it.? $500USD!”)

Вывод:

' Not sure if this  was fun!  What do you think of it.? USD!'

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

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

# imports
import string
# function to remove punctuation
def remove_punctuation(text):
    text = ''.join([c for c in text if c not in string.punctuation])
    return text
# call function
remove_punctuation('Article: @First sentence of some, {important} article having lot of ~ punctuations. And another one;!')

Вывод:

'Article First sentence of some important article having lot of  punctuations And another one'

Стемминг

Stemming - это процесс сокращения измененных / производных слов до их основы, основы или корневой формы. Основа не обязательно должна совпадать с исходным словом. Существует множество способов выполнения стемминга, таких как таблица поиска, алгоритмы удаления суффиксов и т.д. > и т.д. с конца слова и иногда преобразование нежелательно. Но, тем не менее, стемминг помогает нам стандартизировать текст.

# imports
import nltk
# function for stemming
def get_stem(text):
    stemmer = nltk.porter.PorterStemmer()
    text = ' '.join([stemmer.stem(word) for word in text.split()])
    return text
# call function
get_stem("we are eating and swimming ; we have been eating and swimming ; he eats and swims ; he ate and swam ")

Вывод:

'we are eat and swim ; we have been eat and swim ; he eat and swim ; he ate and swam'

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

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

Прежде чем использовать лемматизацию, мы должны знать, что она значительно медленнее, чем стемминг, поэтому следует помнить о производительности, прежде чем выбирать стемминг или лемматизацию.

# imports
import spacy
nlp = spacy.load('en',parse=True,tag=True, entity=True)
# function to remove special characters
def get_lem(text):
    text = nlp(text)
    text = ' '.join([word.lemma_ if word.lemma_ != '-PRON-' else word.text for word in text])
    return text
# call function
get_lem("we are eating and swimming ; we have been eating and swimming ; he eats and swims ; he ate and swam ")

Вывод:

'we be eat and swim ; we have be eat and swim ; he eat and swim ; he eat and swam'

Удаление игнорируемых слов

Стоп-слова часто добавляются к предложениям, чтобы сделать их грамматически правильными, например такие слова, как a, is, an, the и и т. Д. Эти игнорируемые слова имеют минимальное значение или не имеют значения и доступны в большом количестве в открытых текстах, статьях, комментариях и т. Д. Их следует удалить, чтобы алгоритмы машинного обучения могли лучше сосредоточиться на словах, которые определяют значение / идею текста. Мы используем список из nltk.corpus, и этот список может быть дополнительно расширен путем добавления или удаления пользовательских слов в зависимости от ситуации.

# imports
import nltk
from nltk.tokenize import ToktokTokenizer
tokenizer = ToktokTokenizer()
stopword_list = nltk.corpus.stopwords.words('english')
# custom: removing words from list
stopword_list.remove('not')
# function to remove stopwords
def remove_stopwords(text):
    # convert sentence into token of words
    tokens = tokenizer.tokenize(text)
    tokens = [token.strip() for token in tokens]
    # check in lowercase 
    t = [token for token in tokens if token.lower() not in stopword_list]
    text = ' '.join(t)    
    return text
# call function
remove_stopwords("i am myself you the stopwords list and this article is not should removed")

Выход:

'stopwords list article not removed'

Удаление лишних пробелов и табуляции

Лишние пробелы и табуляции не добавляют никакой информации в обработку текста. Работать с ними должно быть довольно легко.

# imports
import re
# function to remove special characters
def remove_extra_whitespace_tabs(text):
    #pattern = r'^\s+$|\s+$'
    pattern = r'^\s*|\s\s*'
    return re.sub(pattern, ' ', text).strip()
# call function
remove_extra_whitespace_tabs('  This web line  has \t some extra  \t   tabs and whitespaces  ')

Выход:

'This web line has some extra tabs and whitespaces'

Строчные буквы

Изменить регистр на более низкий можно, используя функцию lower.

# function to remove special characters
def to_lowercase(text):
    return text.lower()
# call function
to_lowercase('ConVert THIS string to LOWER cASe.')

Выход:

'convert this string to lower case.'

Заключение

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

Надеюсь, вам понравилась эта статья, и если да, то сообщите об этом в комментариях. Если вы хотите поделиться какими-либо предложениями по любому подходу, не стесняйтесь говорить об этом в комментариях, и я сразу же вернусь.