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

Мы можем разделить весь конвейер НЛП на 3 части

  1. Предварительная обработка текста
  2. Функциональная инженерия
  3. Построение и оценка модели

В этой статье я расскажу о первых двух частях, а потом вы сможете построить свою модель на их основе.

Предварительная обработка текста

Текст в основном в неструктурированной форме. В нем будет много шумов. При предварительной обработке данных мы удалим шумы, связанные с ними. Невозможно проанализировать данные без надлежащей предварительной обработки.

Этапы очистки текста:

  1. Удаление шумового объекта
  2. Нормализация текста
  3. Стандартизация слов

1. Удаление шумового объекта:

На этом этапе мы удалим html-теги, стоп-слова, знаки препинания, пробелы и т. Д. В предложении много лишних слов. Пример: to, is и т. Д. Эти слова не добавляют никакого значения предложению. Они называются стоп-словами. Итак, мы можем их удалить. В следующем коде мы удалим стоп-слова .Также мы удалим знаки препинания, числа и ненужные пробелы. Мы используем библиотеку nltk для удаления стоп-слов и библиотеку re для удаления знаков препинания, чисел и пробелов.

Перед удалением шумовой сущности я расскажу о токенизации, которая является важным аспектом в NLP.

  • Токенизация. Токенизация - это процесс преобразования текста в токены. Токенами могут быть предложения или слова. У нас есть токенизация предложений и токенизация слов. Продемонстрирую это на Python.
dataset = """I have to  thank everyone from the very onset of my career … To my parents; none of this would be possible without you. And to my friends, I love you dearly; you know who you are. Making The Revenant was aboutman's relationship to the natural world. A world that we collectively felt in 2015 as the hottest year in recorded history#."""
sentences = nltk.sent_tokenize(dataset)
words = nltk.word_tokenize(dataset)
print('sentences: {}'.format(sentences))
print('************************')
print('words: {}'.format(words))

Выход:

sentences: ['I have to  thank everyone from the very onset of my career … To my parents; none of this would be possible without you.', 'And to my friends, I love you dearly; you know who you are.', "Making The Revenant was aboutman's relationship to the natural world.", 'A world that we collectively felt in 2015 as the hottest year in recorded history#.']
************************
words: ['I', 'have', 'to', 'thank', 'everyone', 'from', 'the', 'very', 'onset', 'of', 'my', 'career', '…', 'To', 'my', 'parents', ';', 'none', 'of', 'this', 'would', 'be', 'possible', 'without', 'you', '.', 'And', 'to', 'my', 'friends', ',', 'I', 'love', 'you', 'dearly', ';', 'you', 'know', 'who', 'you', 'are', '.', 'Making', 'The', 'Revenant', 'was', 'aboutman', "'s", 'relationship', 'to', 'the', 'natural', 'world', '.', 'A', 'world', 'that', 'we', 'collectively', 'felt', 'in', '2015', 'as', 'the', 'hottest', 'year', 'in', 'recorded', 'history', '#', '.']

В следующем коде мы удалим знаки препинания, стоп-слова и лишние пробелы и, таким образом, удаляем присутствующий шум.

nltk.download('stopwords')
from nltk.corpus import stopwords
import re
dataset = nltk.sent_tokenize(dataset)
for i in range(len(dataset)):
    dataset[i] = dataset[i].lower()
    dataset[i] = re.sub(r'\W',' ',dataset[i])# will remove non-word charecters like #,*,% etc
    dataset[i] = re.sub(r'\d',' ',dataset[i])#will remove digits
    dataset[i] = re.sub(r'\s+',' ',dataset[i])#will remove extra spaces
    words = nltk.word_tokenize(dataset[i])
    new = []
    for word in words:
        if word not in stopwords.words('english'):
            new.append(word)
    dataset[i] = ' '.join(new)
print(dataset)

Выход:

['thank everyone onset career parents none would possible without',
 'friends love dearly know',
 'making revenant aboutman relationship natural world',
 'world collectively felt hottest year recorded history']

2. Нормализация текста:

Другой тип шума - это многократное повторение одного слова. Например, бег, бег, бег и т. Д. - это разные варианты слова «бег». Нормализация помогает свести такие слова к одному слову, таким образом, помогает уменьшить размерность. В основном существует два метода нормализации.

  • Стебель:

Стемминг - это подход, основанный на правилах, который удаляет суффиксы (ing, ly, s и т. Д.). некоторые из примеров:

Есть много алгоритмов, которые сделают стемминг. но наиболее распространенным в английском языке является стеммер Портера. Я проиллюстрирую его на примере с помощью python

# Stemming
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
for i in range(len(dataset)):
    words = nltk.word_tokenize(dataset[i])
    words = [stemmer.stem(word) for word in words]
    dataset[i] = ' '.join(words)
print(dataset)

выход:

['thank everyon onset career parent none would possibl without', 'friend love dearli know', 'make reven aboutman relationship natur world', 'world collect felt hottest year record histori']

Мы видим, что такие слова, как очень изменено на вери, история на истори и т. Д. Это удивительная работа алгоритма Портера Стеммера.

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

Подобно выделению корней, лемматизация также преобразует слово в его корневую форму. Это пошаговая процедура получения корневой формы слова с использованием словарного запаса (словарная важность слов) и морфологического анализа (структура слова и грамматические отношения). Ключом к этому методу является лингвистика. В лемматизации корневое слово называется леммой. Вывод стеммеров может быть бессмысленным, но вывод лемматизаторов всегда будет значимым. Вот некоторые из примеров лемматизации слов:

Мы применим лемматизацию к тому же набору данных, который мы использовали до использования python.

from nltk.stem.wordnet import WordNetLemmatizer 
lem = WordNetLemmatizer()
for i in range(len(dataset)):
    words = nltk.word_tokenize(dataset[i])
    words = [lem.lemmatize(word,pos='v') for word in words]
    dataset[i] = ' '.join(words)
print(dataset)

выход:

['thank everyone onset career parent none would possible without', 'friends love dearly know', 'make revenant aboutman relationship natural world', 'world collectively felt hottest year record history']

3. Стандартизация слов:

Текст может содержать слова, которых нет в словаре. Например, в твитах или комментариях он может содержать такие слова, как 're', представляющие are, 's', для is, 'awsm' для awesome и т. Д. Такие слова не распознаются нашими model. поэтому мы должны это исправить. Я попытаюсь продемонстрировать это с помощью твита из твиттера. Мы создадим для этого таблицу поиска.

tweet = 'its an awsm day and my friends re superb'
lookup = {'s': 'is', 're':'are', 'awsm': 'awesome', 'superb': 'super'}
data = []
for word in dataset.split():
    if word in lookup.keys():
        word = lookup[word]
    data.append(word)
tweet = ' '.join(data)
print(tweet)

выход:

its an awesome day and my friends are super

Разработка функций

Чтобы проанализировать предварительно обработанные данные, их необходимо преобразовать в функции. Чтобы преобразовать их в функции, мы используем различные методы, такие как модель пакета слов, ngrams-model, tf-idf, word2vector и т. Д. Мы рассмотрим некоторые из них. методы.

Модель мешка слов

Мы работаем с большим набором данных. Мы не можем напрямую передать их в нашу модель. Компьютеры будут понимать только числа, поэтому мы должны преобразовать этот текст в векторы. Мы можем выполнять математические операции с этими векторами. Один из этих методов. мешок слов.

Считайте следующие предложения отзывами о фильме.

'Movie is good and movie is worth watch'
'Movie is average but story is really good'
'I like the movie and the fight'

После предварительной обработки данных мы можем представить это как:

'movie good movie worth watch'
'movie average story really good'
'i like movie fight'

Три отзыва можно представить в виде набора слов.

['movie', 'good', 'movie', 'worth', 'watch']
['movie', 'average', 'story', 'really', 'good']
['I', 'like', 'movie', 'fight']

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

'movie', 'good', 'worth', 'watch','average', 'story', 'really', 'I', 'like', 'fight'

Следующим шагом будет создание векторов. Векторы преобразуют текст, который может использоваться алгоритмом машинного обучения. Мы возьмем первый документ "фильм хорош, а фильм стоит посмотреть". Теперь мы проверим частоту каждого слова из 10 уникальных слов, которые мы перечислили выше,

'movie' : 2
'good' : 1 
'worth': 1
'watch' : 1
'average' : 0
'story': 0
'really': 0
'I': 0
'like': 0
'fight' : 0

Таким образом, для обзора 1 наше векторное представление [2,1,1,1,0,0,0,0,0,0]

аналогично другие обзоры представлены как:

'movie good worth watch'' = [2,1,1,1,0,0,0,0,0,0]
'movie average story really good' =  [1,1,0,0,1,1,1,0,0,0]
'I like movie fight' = [1,0,0,0,0,0,0,1,1,1]

В этом подходе каждое слово или жетон называется «грамм». Комбинации этих документов образуют корпус. Большой документ, в котором сгенерированный словарь огромен, может привести к вектору с множеством значений 0. Это называется разреженный вектор. Для разреженных векторов требуется больше памяти и вычислительных ресурсов при моделировании. Вместе разреженные векторы объединяются в матрицу разрезов. Создание словаря из пар из двух слов называется моделью биграмм. Например, биграмм первого отзыва будет:

'movie good'
'worth watch'

На основе этих биграмм мы создадим разреженный вектор для каждого документа. Точно так же существуют триграммы и n-граммы (n-граммы - это не что иное, как граммы с n ›1)

CountVectorizer работает на основе частоты терминов, т. е. подсчитывает количество вхождений токенов и строит разреженную матрицу документов. Мы будем использовать CountVectorizer для преобразования наших обзоров в векторы. CountVectorizer доступен в обучающей библиотеке Sci-Kit (sklearn).

dataset = ['movie good movie worth watch',
 'movie average story really good',
 'I like movie fight']
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer(ngram_range=(0,1)) #in scikit-learn
final_counts = count_vect.fit_transform(dataset)
print(count_vect.get_feature_names())
print(final_counts.toarray())

Выход:

['average', 'fight', 'good', 'like', 'movie', 'really', 'story', 'watch', 'worth']
[[0 0 1 0 2 0 0 1 1]
 [1 0 1 0 1 1 1 0 0]
 [0 1 0 1 1 0 0 0 0]]

Ограничения модели Bag Of Words:

  • Набор моделей слов не учитывает семантику слова. Например: слова «автомобиль» и «автомобиль» часто используются в одном и том же контексте. Однако векторы, соответствующие этим словам, ортогональны в модели мешка слов. Проблема усугубляется при моделировании предложений с использованием набора слов.
  • При моделировании фраз с использованием набора слов порядок слов во фразе не соблюдается. Пример: «Это плохо» и «Это плохо» имеют одно и то же векторное представление.

Векторизатор TF-IDF

TF-IDF расшифровывается как частота документа с обратной частотой. Значение TF-IDF получается путем умножения оценки TF и ​​оценки IDF.

Частота использования (TF):

Частота термина слова - это частота слова в документе. Для нормализации термин "частота" часто делят на длину документа.

Частота обратных документов (IDF): это оценка того, насколько редко слово встречается в документах. Он отражает важность слова для документа в коллекции или корпусе.

Мы будем использовать TfidfVectorizer для преобразования наших обзоров в векторы Tfidf. TfidfVectorizer доступен в обучающей библиотеке Sci-Kit (sklearn).

from sklearn.feature_extraction.text import TfidfVectorizer
vector = TfidfVectorizer()
count = vector.fit_transform(dataset)
print(vector.get_feature_names())
print(count.toarray())

Выход:

['average', 'fight', 'good', 'like', 'movie', 'really', 'story', 'watch', 'worth']
[[0.         0.         0.38151877 0.         0.59256672 0.
  0.         0.50165133 0.50165133]
 [0.50461134 0.         0.38376993 0.         0.29803159 0.50461134
  0.50461134 0.         0.        ]
 [0.         0.65249088 0.         0.65249088 0.38537163 0.
  0.         0.         0.        ]]

Ограничения модели TF-IDF:

  • TF-IDF основан на модели набора слов (BoW), поэтому он не фиксирует позицию в тексте и семантику слов.

Чтобы решить эту проблему, мы можем использовать модель word2vector, которую я объясню в другой статье. После разработки функций мы можем построить модель на ее основе. Для этого мы можем использовать такие алгоритмы, как navien bias.