статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Python для NLP: токенизация, стемминг и лемматизация с библиотекой SpaCy
В предыдущей статье [/ python-for-nlp-working-with-text-and-pdf-files /] мы начали обсуждение того, как выполнять обработку естественного языка с помощью Python. Мы увидели, как читать и писать текстовые и PDF-файлы. В этой статье мы начнем работать с библиотекой spaCy [https://spacy.io/] для выполнения еще нескольких основных задач НЛП, таких как токенизация [https://en.wikipedia.org/wiki/Lexical_analysis#Tokenization] , стемминг и лемматизация [https://nlp.stanford.edu/IR-book/html/htmledition/stemming-
Время чтения: 9 мин.
В предыдущей статье мы начали обсуждение того, как выполнять обработку естественного языка с помощью Python. Мы увидели, как читать и писать текстовые и PDF-файлы. В этой статье мы начнем работать с библиотекой spaCy для выполнения еще нескольких основных задач НЛП, таких как токенизация , стемминг и лемматизация .
Урок по лемматизации (Школа наставников Яндекса)
Введение в SpaCy
Библиотека spaCy — одна из самых популярных библиотек NLP наряду с NLTK. Основное различие между двумя библиотеками заключается в том, что NLTK содержит широкий спектр алгоритмов для решения одной проблемы, тогда как spaCy содержит только один, но лучший алгоритм для решения проблемы.
NLTK был выпущен еще в 2001 году, в то время как spaCy является относительно новым и был разработан в 2015 году. В этой серии статей о NLP мы в основном будем иметь дело с spaCy из-за его современного состояния. Однако мы также коснемся NLTK, когда легче выполнить задачу, используя NLTK, а не spaCy.
Установка spaCy
Если вы используете установщик pip для установки библиотек Python, перейдите в командную строку и выполните следующую инструкцию:
$ pip install -U spacy
В противном случае, если вы используете Anaconda, вам необходимо выполнить следующую команду в командной строке Anaconda:
$ conda install -c conda-forge spacy
После загрузки и установки spaCy следующим шагом будет загрузка языковой модели. Мы будем использовать англоязычную модель. Языковая модель используется для выполнения множества задач НЛП, которые мы увидим в следующем разделе.
Следующая команда загружает языковую модель:
$ python -m spacy download en
Базовая функциональность
Прежде чем мы углубимся в различные функции spaCy, давайте вкратце посмотрим, как с ним работать.
В качестве первого шага вам необходимо импортировать spacy библиотеку следующим образом:
import spacy
Далее нам нужно загрузить языковую модель spaCy.
sp = spacy.load(‘en_core_web_sm’)
В приведенном выше скрипте мы используем функцию load spacy библиотеки для загрузки базовой английской языковой модели. Модель хранится в переменной sp
Давайте теперь создадим небольшой документ, используя эту модель. Документ может быть предложением или группой предложений и может иметь неограниченную длину. Следующий скрипт создает простой документ spaCy.
Лекция 7 Введение в NLP, часть 2: Стемминг, лемматизация, стоп-слова
sentence = sp(u’Manchester United is looking to sign a forward for $90 million’)
SpaCy автоматически разбивает ваш документ на токены, когда документ создается с использованием модели.
Токен просто относится к отдельной части предложения, имеющей некоторое семантическое значение. Посмотрим, какие токены есть в нашем документе:
for word in sentence: print(word.text)
Результат выполнения сценария выше выглядит следующим образом:
Manchester United is looking to sign a forward for $ 90 million
Как видите, в нашем документе есть следующие токены. Мы также можем увидеть части речи каждого из этих токенов, используя .pos_ показанный ниже:
for word in sentence: print(word.text, word.pos_)
Выход:
Manchester PROPN United PROPN is VERB looking VERB to PART sign VERB a DET forward NOUN for ADP $ SYM 90 NUM million NUM
Вы можете видеть, что каждому слову или символу в нашем предложении была отведена часть речи. Например, «Манчестер» был помечен как существительное собственное, «Смотрю» — как глагол и так далее.
Наконец, помимо частей речи, мы также можем видеть зависимости.
Создадим еще один документ:
sentence2 = sp(u»Manchester United isn’t looking to sign any forward.»)
Для синтаксического анализа зависимостей используется атрибут dep_ как показано ниже:
for word in sentence2: print(word.text, word.pos_, word.dep_)
Результат выглядит так:
Manchester PROPN compound United PROPN nsubj is VERB aux n’t ADV neg looking VERB ROOT to PART aux sign VERB xcomp any DET advmod forward ADV advmod . PUNCT punct
Из выходных данных вы можете видеть, что spaCy достаточно умен, чтобы найти зависимость между токенами, например, в предложении, которое у нас есть, есть слово is’nt . Синтаксический анализатор зависимостей разбил его на два слова и указывает, что n’t на самом деле является отрицанием предыдущего слова.
Для подробного понимания синтаксического анализа зависимостей обратитесь к этой статье .
Помимо печати слов, вы также можете распечатать предложения из документа.
document = sp(u’Hello from Stackabuse. The site with the best Python Tutorials. What are you looking for?’)
Теперь мы можем перебирать каждое предложение, используя следующий сценарий:
for sentence in document.sents: print(sentence)
Результат скрипта выглядит так:
Hello from Stackabuse. The site with the best Python Tutorials. What are you looking for?
Вы также можете проверить, начинается ли предложение с определенного токена или нет. Вы можете получить отдельные токены, используя индекс и квадратные скобки, как массив:
document[4]
В приведенном выше сценарии мы ищем 5-е слово в документе. Имейте в виду, что индекс начинается с нуля, а период считается токеном. На выходе вы должны увидеть:
Теперь, чтобы увидеть, начинается ли какое-либо предложение в документе с The , мы можем использовать is_sent_start как показано ниже:
document[4].is_sent_start
На выходе вы увидите True поскольку токен The используется в начале второго предложения.
В этом разделе мы увидели несколько основных операций библиотеки spaCy. Давайте теперь копнем глубже и подробно рассмотрим токенизацию, стемминг и лемматизацию.
Токенизация
Как объяснялось ранее, токенизация — это процесс разбиения документа на слова, знаки препинания, числовые цифры и т. Д.
Рассмотрим подробнее токенизацию spaCy. Создайте новый документ, используя следующий скрипт:
sentence3 = sp(u'»They’re leaving UK for USA»‘) print(sentence3)
Вы можете видеть, что предложение содержит кавычки в начале и в конце. Он также содержит знаки препинания в сокращениях «UK» и «USA».
Посмотрим, как spaCy токенизует это предложение.
for word in sentence3: print(word.text)
Выход:
» They ‘re leaving UK for USA »
В выходных данных вы можете видеть, что spaCy разметила начальную и конечную двойные кавычки. Тем не менее, он достаточно умен, чтобы не размечать точку пунктуации между аббревиатурами, такими как UK и USA.
Посмотрим еще один пример токенизации:
sentence4 = sp(u»Hello, I am non-vegetarian, email me the menu at [email protected] «) print(sentence4)
Здесь, в предложении выше, у нас есть тире в слове «невегетарианец» и в адресе электронной почты. Посмотрим, как spaCy это токенизирует:
for word in sentence4: print(word.text)
Выход:
Hello , I am non — vegetarian , email me the menu at [email protected]
Из выходных данных видно, что spaCy действительно смог обнаружить электронное письмо и не токенизировал его, несмотря на наличие знака «-». С другой стороны, слово «невегетарианец» было символическим.
Давайте теперь посмотрим, как мы можем подсчитать слова в документе:
len(sentence4)
На выходе вы увидите 14 — количество токенов в sentence4 .
Обнаружение сущностей
Помимо токенизации документов в слова, вы также можете узнать, является ли слово сущностью, такой как компания, место, здание, валюта, учреждение и т. Д.
Давайте посмотрим на простой пример распознавания именованных сущностей:
sentence5 = sp(u’Manchester United is looking to sign Harry Kane for $90 million’)
Давайте сначала попробуем просто токенизировать его:
for word in sentence5: print(word.text)
Выход:
Manchester United is looking to sign Harry Kane for $ 90 million
Основы НЛП для текста
Токенизация предложения (также называемаясегментация предложения) это проблемаделение строкиписьменного языкавего составляющаяпредложения, Идея здесь выглядит очень просто. В английском и некоторых других языках мы можем разделять предложения всякий раз, когда видим знак препинания.
Однако даже на английском языке эта проблема не является тривиальной из-за использования символа полной остановки для сокращений. При обработке простого текста таблицы сокращений, которые содержат точки, могут помочь нам предотвратить неправильное присвоениеграницы предложения, Во многих случаях мы используем библиотеки, чтобы выполнить эту работу за нас, поэтому не стоит слишком беспокоиться о деталях.
пример:
Давайте посмотрим фрагмент текста об известной настольной игре под названием нарды.
Нарды — одна из старейших известных настольных игр. Его история восходит к почти 5 000 лет назад к археологическим открытиям на Ближнем Востоке. Это игра для двух игроков, в которой у каждого игрока есть пятнадцать шашек, которые перемещаются между 24 очками в соответствии с броском двух костей.
Чтобы применить токенизацию предложений с помощью NLTK, мы можем использовать nltk.sent_tokenize функция.
Стоп-слова — это слова, которыеотфильтрованыдо или после обработки текста. При применении машинного обучения к тексту, эти слова могут добавить многошум, Вот почему мы хотим удалить этинеуместные слова,
Стоп словаобычнообратитесь кнаиболее распространенные словатакие как «а также»,« »,« На языке, но естьнет единого универсального спискастоп-слов. Список стоп-слов может меняться в зависимости от вашего приложения.
Инструмент NLTK имеет предопределенный список стоп-слов, который относится к наиболее распространенным словам. Если вы используете его впервые, вам нужно скачать стоп-слова, используя этот код: nltk.download(“stopwords”) , После завершения загрузки мы можем загрузить stopwords пакет из nltk.corpus и использовать его для загрузки стоп-слов.
регулярное выражение,регулярное выражение, илирегулярное выражениеэто последовательность символов, которые определяютшаблон поиска, Давайте посмотрим на некоторые основы
- . — совпадениелюбой персонажкроме новой строки
- w — совпадениеслово
- d — совпадениецифра
- s — совпадениепробельные
- W — совпадениене слово
- D — совпадениене цифра
- S — совпадениене пробел
- [abc] — совпадениелюбойиз а, б или в
- [^abc] -несоответствует a, b или c
- [a-g] — сопоставить персонажамеждуа например, чтобы соответствовать буквальному обратному слешу, можно написать ‘\\’ в качестве строки шаблона, потому что регулярное выражение должно быть \ и каждый обратный слеш должен быть выражен как \ внутри обычного строкового литерала Python.
Решение заключается в использовании Pythonнеобработанная строкадля шаблонов регулярных выражений; обратные слеши не обрабатываются каким-либо особым образом в строковый литералс префиксом ‘r’ , Так r»n» является двухсимвольной строкой, содержащей » а также ‘n’ , в то время как «n» является односимвольной строкой, содержащей символ новой строки. Обычно шаблоны будут выражаться в коде Python с использованием этой необработанной строковой записи.
Предобработка текста в NLP
В предыдущий раз мы говорили о векторизации текстовых данных в NLP. Однако прежде чем преобразовать слова в числа, их следует обработать. Читайте в нашей статье о методах предобработки текста: токенизации, удалении стоп-слов, стемминге и лемматизации с Python-библиотеками pymorphy2 и NLTK.
Разбиваем текст на токены
Токенизация – процесс разбиения текста на текстовые единицы, например, слова или предложения. В случае разбиений на предложения задача кажется тривиальной, нужно просто найти точку, вопросительный или восклицательный знак. Но в русском языке существует сокращения, в которых есть точка, например, к.т.н. — кандидат технических наук или т.е. — то есть.
Поэтому такой путь может привести к ошибкам. К счастью, Python-библиотека NLTK позволяет избежать этой проблемы. Рассмотрим пример:
>>> from nltk.tokenize import sent_tokenize >>> text = «Я — к.т.н, т.е. проучился долгое время. Имею образование.» >>> sent_tokenize(text, language=»russian») [‘Я — к.т.н, т.е. проучился долгое время.’, ‘Имею образование.’]
Как видим, функция sent_tokenize разбила исходное предложения на два, несмотря на присутствие слов к.т.н. и т.е.
Помимо разбиения на предложения в NLTK можно в качестве токенов использовать слова:
>>> from nltk.tokenize import sent_tokenize, word_tokenize >>> text = «Я — к.т.н. Сижу на диван-кровати.» >>> word_tokenize(text, language=»russian») [‘Я’, ‘-‘, ‘к.т.н.’, ‘Сижу’, ‘на’, ‘диван-кровати’, ‘.’]
Здесь к.т.н. и диван-кровать были определены как отдельные слова.
Исключаем стоп-слова из исходного текста
Иногда одних слов в тексте больше, чем других, к тому же они встречаются почти в каждом предложении и не несут большой информативной нагрузки. Такие слова являются шумом для последующего глубокого обучения (Deep Learning) и называются стоп-словами. Библиотека NLTK также имеет список стоп-слов, который предварительно необходимо скачать. Это можно сделать следующим образом:
>>> import nltk >>> nltk.download(‘stopwords’)
После этого доступен список стоп-слов для русского языка:
>>> from nltk.corpus import stopwords >>> stopwords.words(«russian»)
Всего их насчитывается в этом списке 151. Вот некоторые из них:
и, в, во, не, что, он, на, я, с, со, как, а, то, все, чтоб, без, будто, впрочем, хорошо, свою, этой, перед, иногда, лучше, чуть, том, нельзя, такой, им, более, всегда, конечно, всю, между
Поскольку это список, то к нему можно добавить дополнительные слова или, наоборот, удалить из него те, которые будут информативными для вашего случая. Для последующего исключения слов из токенизированного текста можно написать следующее:
for token in tokens: if token not in stop_words: filtered_tokens.append(token)
Стемминг: удаляем окончания
Русский язык обладает богатой морфологической структурой. Слово хороший и хорошая имеют тот же смысл, но разную форму, например, хорошая мебель и хороший стул. Поэтому для машинного обучения (Machine Learning) лучше привести их к одной форме для уменьшения размерности.
Одним из таких методов является стемминг (stemming). В частности, он опускает окончания слова. В Python-библиотеке NLTK для этого есть Snowball Stemmer , который поддерживает русский язык:
>>> from nltk.stem import SnowballStemmer . >>> snowball = SnowballStemmer(language=»russian») >>> snowball.stem(«Хороший») хорош >>> snowball.stem(«Хорошая») хорош
Проблемы могут возникнуть со словами, которые значительно изменяются в других формах:
>>> snowball.stem(«Хочу») хоч >>> snowball.stem(«Хотеть») хотет
Хотеть и хочу — грамматические формы одного и то же слова, но стемминг обрубает окончания согласно своему алгоритму. Поэтому возможно следует применить другой метод — лемматизацию.
Приведение к начальной форме с лемматизацией
Над словом можно провести морфологический анализ и выявить его начальную форму. Например, хочу, хотят, хотели имеют начальную форму хотеть. Тогда можем воспользоваться pymorphy2 — инструмент для морфологического анализа русского и украинского языков.
Рассмотрим пример для слова “хочу”:
>>> import pymorphy2 >>> morph = pymorphy2.MorphAnalyzer() >>> morph.parse(«хочу») [Parse(word=’хочу’, tag=OpencorporaTag(‘VERB,impf,tran sing,1per,pres,indc’), normal_form=’хотеть’, score=1.0, methods_stack=((, ‘хочу’, 2999, 1),))]
Метод parse возвращает список объектов Parse, которые обозначают виды грамматических форм анализируемого слова. Такой объект обладает следующими атрибутами:
- tag обозначает набор граммем. В данном случае слово хочу — это глагол (VERB) несовершенного вида (impf), переходный (tran), единственного числа (sing), 1 лица (1per), настоящего времени (pres), изъявительного наклонения (indc);
- normal_form — нормального форма слова;
- score — оценка вероятности того, что данный разбор правильный;
- methods_stack — тип словаря распарсенного слова с его индексом.
Нас больше всего интересует нормальная форма слова. По умолчанию объекты Parse сортированы в порядке убывания значения score . Поэтому из списка лучше всего брать 1-й элемент:
>>> morph.parse(«хотеть»)[0].normal_form хотеть >>> morph.parse(«хочу»)[0].normal_form хотеть >>> morph.parse(«хотят»)[0].normal_form хотеть
Таким образом, мы получили одно слово из разных его форм.
Как обрабатывать текстовые данные и применять их в реальных проектах Data Science для моделей Machine Learning с помощью Python, вы узнаете на наших курсах в лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве.
Источник: python-school.ru