Это восьмая статья в моей серии статей по Python для НЛП. В моей предыдущей статье я объяснил , как библиотека TextBlob Python может использоваться для выполнения различных задач НЛП, начиная от токенизации и заканчивая POS-тегированием, а также классификацией текста и анализом настроений. В этой статье мы рассмотрим библиотеку Python Pattern , которая является еще одной чрезвычайно полезной библиотекой обработки естественного языка.
Библиотека шаблонов – это универсальная библиотека, способная решать следующие задачи:
- Обработка естественного языка: Выполнение таких задач, как токенизация, стемминг, POS-тегирование, анализ настроений и т. Д.
- Интеллектуальный анализ данных: Он содержит API для сбора данных с таких сайтов, как Twitter, Facebook, Wikipedia и т. Д.
- Машинное обучение: Содержит модели машинного обучения, такие как SVM, KNN и восприятие, которые могут быть использованы для задач классификации, регрессии и кластеризации.
В этой статье мы рассмотрим первые два приложения библиотеки шаблонов из приведенного выше списка. Мы изучим использование Библиотеки паттернов для НЛП, выполняя такие задачи, как токенизация, стемминг и анализ настроений. Мы также увидим, как библиотека шаблонов может быть использована для веб-майнинга.
Установка библиотеки
Чтобы установить библиотеку, вы можете использовать следующую команду pip:
$ pip install pattern
В противном случае, если вы используете дистрибутив Anaconda Python, вы можете использовать следующую команду Anaconda для загрузки библиотеки:
$ conda install -c asmeurer pattern
Функции библиотеки паттернов для НЛП
В этом разделе мы рассмотрим некоторые из приложений НЛП Библиотеки паттернов.
Токенизация, POS-маркировка и фрагментация
В библиотеках NLTK и space у нас есть отдельная функция для токенизации, POS-тегов и поиска именных фраз в текстовых документах. С другой стороны, в библиотеке шаблонов есть метод all-in-one parse
, который принимает текстовую строку в качестве входного параметра и возвращает соответствующие токены в строке вместе с тегом POS.
Метод parse
также сообщает нам, является ли токен именной фразой или глагольной фразой, субъектом или объектом. Вы также можете получить лемматизированные токены, установив параметр lemmata
в значение Правда
. Синтаксис метода parse
вместе со значениями по умолчанию для различных параметров выглядит следующим образом:
parse(string, tokenize=True, # Split punctuation marks from words? tags=True, # Parse part-of-speech tags? (NN, JJ, ...) chunks=True, # Parse chunks? (NP, VP, PNP, ...) relations=False, # Parse chunk relations? (-SBJ, -OBJ, ...) lemmata=False, # Parse lemmata? (ate => eat) encoding='utf-8', # Input string encoding. tagset=None # Penn Treebank II (default) or UNIVERSAL. )
Давайте посмотрим на метод parse
в действии:
from pattern.en import parse from pattern.en import pprint pprint(parse('I drove my car to the hospital yesterday', relations=True, lemmata=True))
Чтобы использовать метод parse
, необходимо импортировать модуль en
из библиотеки pattern
. Модуль en
содержит функции НЛП на английском языке. Если вы используете метод print
для печати выходных данных метода parse
на консоли, вы должны увидеть следующие выходные данные:
WORD TAG CHUNK ROLE ID PNP LEMMA I PRP NP SBJ 1 - i drove VBD VP - 1 - drive my PRP$ NP OBJ 1 - my car NN NP ^ OBJ 1 - car to TO - - - - to the DT NP - - - the hospital NN NP ^ - - - hospital yesterday NN NP ^ - - - yesterday
В выходных данных вы можете увидеть маркированные слова вместе с их POS-тегом, фрагментом, которому принадлежат токены, и ролью. Вы также можете увидеть лемматизированную форму лексем.
Если вы вызовете метод split
для объекта, возвращаемого методом parse
, то результатом будет список предложений, где каждое предложение-это список токенов, а каждый токен-это список слов вместе с тегами, связанными со словами.
Например, посмотрите на следующий сценарий:
from pattern.en import parse from pattern.en import pprint print(parse('I drove my car to the hospital yesterday', relations=True, lemmata=True).split())
Вывод приведенного выше скрипта выглядит следующим образом:
[[['I', 'PRP', 'B-NP', 'O', 'NP-SBJ-1', 'i'], ['drove', 'VBD', 'B-VP', 'O', 'VP-1', 'drive'], ['my', 'PRP$', 'B-NP', 'O', 'NP-OBJ-1', 'my'], ['car', 'NN', 'I-NP', 'O', 'NP-OBJ-1', 'car'], ['to', 'TO', 'O', 'O', 'O', 'to'], ['the', 'DT', 'B-NP', 'O', 'O', 'the'], ['hospital', 'NN', 'I-NP', 'O', 'O', 'hospital'], ['yesterday', 'NN', 'I-NP', 'O', 'O', 'yesterday']]]
Плюрализация и сингуляризация токенов
Методы pluralize
и singularize
используются для преобразования сингулярных слов во множественное число и наоборот соответственно.
from pattern.en import pluralize, singularize print(pluralize('leaf')) print(singularize('theives'))
Вывод выглядит следующим образом:
leaves theif
Преобразование прилагательного в Сравнительную и Превосходную степени
Вы можете получить сравнительную и превосходную степени прилагательного, используя функции comparative
и superlative
. Например, сравнительная степень добра лучше, а превосходная степень добра лучше. Давайте посмотрим на это в действии:
from pattern.en import comparative, superlative print(comparative('good')) print(superlative('good'))
Выход:
better best
Нахождение N-граммов
N-Граммы относятся к “n” сочетаниям слов в предложении. Например, для предложения “Он идет в больницу” 2 грамма будут (Он идет), (идет) и (в больницу). N-граммы могут играть решающую роль в классификации текста и языковом моделировании.
В библиотеке шаблонов метод ngram
используется для поиска всех n-грамм в текстовой строке. Первым параметром метода n gram
является текстовая строка. Число n-грамм передается в параметр n
метода. Посмотрите на следующий пример:
from pattern.en import ngrams print(ngrams("He goes to hospital", n=2))
Выход:
[('He', 'goes'), ('goes', 'to'), ('to', 'hospital')]
Поиск чувств
Сентиментальность относится к мнению или чувству по отношению к определенной вещи. Библиотека шаблонов предлагает функциональные возможности для поиска настроений из текстовой строки.
В паттерне объект sentiment
используется для определения полярности (позитивности или негативности) текста наряду с его субъективностью.
В зависимости от наиболее часто встречающихся положительных (хороший, лучший, отличный и т. Д.) и отрицательных (плохой, ужасный, жалкий и т. Д.) прилагательных тексту присваивается оценка настроения от 1 до -1. Эта оценка настроений также называется полярностью.
В дополнение к оценке настроений возвращается также субъективность. Значение субъективности может быть от 0 до 1. Субъективность количественно определяет количество личного мнения и фактической информации, содержащейся в тексте. Более высокая субъективность означает, что текст содержит личное мнение, а не фактическую информацию.
from pattern.en import sentiment print(sentiment("This is an excellent movie to watch. I really love it"))
При запуске приведенного выше скрипта вы должны увидеть следующие выходные данные:
(0.75, 0.8)
Предложение “Это отличный фильм для просмотра. Я действительно люблю его” имеет отношение 0,75, что показывает, что он очень позитивен. Точно так же субъективность 0.8 относится к тому, что предложение является личным мнением пользователя.
Проверка того, является ли утверждение фактом
Функция modality
из библиотеки шаблонов может быть использована для определения степени достоверности в текстовой строке. Функция modality
возвращает значение от -1 до 1. Для фактов функция modality
возвращает значение больше 0,5.
Вот пример этого в действии:
from pattern.en import parse, Sentence from pattern.en import modality text = "Paris is the capital of France" sent = parse(text, lemmata=True) sent = Sentence(sent) print(modality(sent))
1.0
В приведенном выше скрипте мы сначала импортируем метод parse
вместе с классом Sentence
. Во второй строке мы импортируем функцию modality
. Метод parse
принимает текст в качестве входных данных и возвращает маркированную форму текста, которая затем передается конструктору класса Sentence
. Метод modality
принимает объект класса Sentence
и возвращает модальность предложения.
Поскольку текстовая строка “Париж-столица Франции” является фактом, в выходных данных вы увидите значение 1.
Аналогично, для предложения, которое не является определенным, значение, возвращаемое методом modality
, составляет около 0.0.:
text = "I think we can complete this task" sent = parse(text, lemmata=True) sent = Sentence(sent) print(modality(sent))
0.25
Поскольку строка в приведенном выше примере не очень определенна, модальность приведенной выше строки будет равна 0,25.
Орфографические исправления
Метод suggest
можно использовать для определения того, правильно ли написано слово или нет. Метод suggest
возвращает 1, если слово написано на 100% правильно. В противном случае метод suggest
возвращает возможные исправления для слова вместе с их вероятностью правильности.
Посмотрите на следующий пример:
from pattern.en import suggest print(suggest("Whitle"))
В приведенном выше сценарии у нас есть слово While
, которое неправильно пишется. В выходных данных вы увидите возможные предложения для этого слова.
[('While', 0.6459209419680404), ('White', 0.2968881412952061), ('Title', 0.03280067283431455), ('Whistle', 0.023549201009251473), ('Chile', 0.0008410428931875525)]
Согласно методу suggest
, существует вероятность 0,64, что слово “While”, аналогично существует вероятность 0,29, что слово “White”, и так далее.
Теперь давайте правильно напишем слово:
from pattern.en import suggest print(suggest("Fracture"))
Выход:
[('Fracture', 1.0)]
Из выходных данных вы можете видеть, что существует 100% – ная вероятность того, что слово написано правильно.
Работа с числами
Библиотека шаблонов содержит функции, которые можно использовать для преобразования чисел в виде текстовых строк в их числовые аналоги и наоборот. Для преобразования текста в числовое представление используется функция number
. Аналогично для обратного преобразования чисел в соответствующее им текстовое представление используется функция numerals
. Посмотрите на следующий сценарий:
from pattern.en import number, numerals print(number("one hundred and twenty two")) print(numerals(256.390, round=2))
Выход:
122 two hundred and fifty-six point thirty-nine
В выходных данных вы увидите 122, который является числовым представлением текста “сто двадцать два”. Точно так же вы должны увидеть “двести пятьдесят шесть и тридцать девять десятых”, что является текстовым представлением числа 256.390.
Помните, что для функции numerals
мы должны предоставить целочисленное значение, до которого мы хотим округлить наше число.
Функция quantify
используется для получения оценки количества слов элементов в списке, которая предоставляет фразу для ссылки на группу. Если список содержит 3-8 похожих элементов, функция quantify
количественно определит его как “несколько”. Два элемента количественно определяются как “пара”.
from pattern.en import quantify print(quantify(['apple', 'apple', 'apple', 'banana', 'banana', 'banana', 'mango', 'mango']))
В списке у нас есть три яблока, три банана и два манго. Вывод функции quantify
для этого списка выглядит следующим образом:
several bananas, several apples and a pair of mangoes
Аналогично, следующий пример демонстрирует другие оценки количества слов.
from pattern.en import quantify print(quantify({'strawberry': 200, 'peach': 15})) print(quantify('orange', amount=1200))
Выход:
hundreds of strawberries and a number of peaches thousands of oranges
Функции библиотеки шаблонов для интеллектуального анализа данных
В предыдущем разделе мы рассмотрели некоторые из наиболее часто используемых функций библиотеки паттернов для НЛП. В этом разделе мы рассмотрим, как библиотека шаблонов может использоваться для выполнения различных задач интеллектуального анализа данных.
Модуль web
библиотеки шаблонов используется для задач веб-майнинга.
Доступ к Веб-Страницам
Объект URL
используется для извлечения содержимого с веб-страниц. Он имеет несколько методов, которые можно использовать для открытия веб-страницы, загрузки содержимого с веб-страницы и чтения веб-страницы.
Вы можете напрямую использовать метод download
для загрузки HTML-содержимого любой веб-страницы. Следующий скрипт загружает исходный код HTML для статьи Википедии об искусственном интеллекте.
from pattern.web import download page_html = download('https://en.wikipedia.org/wiki/Artificial_intelligence', unicode=True)
Вы также можете загружать файлы с веб-страниц, например изображения, используя метод URL:
from pattern.web import URL, extension page_url = URL('https://upload.wikimedia.org/wikipedia/commons/f/f1/RougeOr_football.jpg') file = open('football' + extension(page_url.page), 'wb') file.write(page_url.download()) file.close()
В приведенном выше сценарии мы сначала устанавливаем соединение с веб-страницей с помощью метода URL
. Далее мы вызываем метод extension
на открывшейся странице, который возвращает расширение файла. Расширение файла добавляется в конце строки “футбол”. Метод open вызывается для чтения этого пути, и, наконец, метод download()
загружает изображение и записывает его в путь выполнения по умолчанию.
Поиск URL-адресов в тексте
Вы можете использовать метод find url
для извлечения URL-адресов из текстовых строк. Вот пример:
from pattern.web import find_urls print(find_urls('To search anything, go to www.google.com', unique=True))
В выходных данных вы увидите URL-адрес веб-сайта Google, как показано ниже:
['www.google.com']
Выполнение асинхронных запросов к веб-страницам
Веб-страницы могут быть очень большими, и это может занять довольно много времени, чтобы загрузить полное содержимое веб-страницы, что может заблокировать пользователя от выполнения любой другой задачи в приложении до тех пор, пока полная веб-страница не будет загружена. Однако модуль web
библиотеки шаблонов содержит функцию asynchronous
, которая параллельно загружает содержимое веб-страницы. Метод асинхронный
работает в фоновом режиме, так что пользователь может взаимодействовать с приложением во время загрузки веб-страницы.
Возьмем очень простой пример метода asynchronous
:
from pattern.web import asynchronous, time, Google asyn_req = asynchronous(Google().search, 'artificial intelligence', timeout=4) while not asyn_req.done: time.sleep(0.1) print('searching...') print(asyn_req.value) print(find_urls(asyn_req.value, unique=True))
В приведенном выше скрипте мы извлекаем результат поиска Google на странице 1 по поисковому запросу “искусственный интеллект”, вы можете видеть, что во время загрузки страницы мы выполняем цикл while параллельно. Наконец, результаты, полученные запросом, печатаются с использованием атрибута value
объекта, возвращаемого модулем asynchronous
. Далее мы извлекаем URL-адреса из поиска, которые затем печатаются на экране.
Получение результатов поиска с помощью API
Библиотека шаблонов содержит класс SearchEngine
, производный от классов, которые могут быть использованы для подключения к вызовам API различных поисковых систем и веб-сайтов, таких как Google, Bing, Facebook, Wikipedia, Twitter и т. Д. Конструкция объекта Search Engine
принимает три параметра:
лицензия
: Лицензионный ключ разработчика для соответствующего органического веб-сайта поисковой системыдроссель
: Соответствует разнице во времени между последовательными запросами к серверуlanguage
: Указывает язык для результатов
Метод search
класса SearchEngine
используется для запроса в поисковую систему определенного поискового запроса. Метод search
может принимать следующие параметры:
запрос
: Строка поискатип:
Тип данных, которые вы хотите найти, может принимать три значения:ПОИСК
,НОВОСТИ
иИЗОБРАЖЕНИЕ
.start
: Страница, с которой вы хотите начать поискcount
: Количество результатов на странице.
Классы поисковых систем, наследующие класс SearchEngine
вместе с его методом search
, следующие: Google
, Bing
, Twitter
, Facebook
, Wikipedia
и Flickr
.
Поисковый запрос возвращает объекты для каждого элемента. Затем объект result
может быть использован для получения информации о результатах поиска. Атрибутами объекта result
являются url
, title
, text
, language
, author
, date
.
Теперь давайте рассмотрим очень простой пример того, как мы можем искать что-то в Google с помощью библиотеки шаблонов. Помните, чтобы этот пример работал, вам придется использовать лицензионный ключ разработчика для API Google.
from pattern.web import Google google = Google(license=None) for search_result in google.search('artificial intelligence'): print(search_result.url) print(search_result.text)
В приведенном выше скрипте мы создаем объект класса Google. В конструкторе Google передайте свой собственный лицензионный ключ в параметр license
. Далее мы передаем сильный искусственный интеллект
методу поиска
. По умолчанию будут возвращены первые 10 результатов с первой страницы, которые затем повторяются, а URL-адрес и текст каждого результата отображаются на экране.
Процесс аналогичен для поисковой системы Bing, вам нужно только заменить класс Big
на Google
в приведенном выше скрипте.
Давайте теперь поищем в Твиттере три последних твита, содержащих текст “искусственный интеллект”. Выполните следующий сценарий:
from pattern.web import Twitter twitter = Twitter() index = None for j in range(3): for tweet in twitter.search('artificial intelligence', start=index, count=3): print(tweet.text) index = tweet.id
В приведенном выше скрипте мы сначала импортируем класс Twitter
из модуля pattern.web
. Далее мы перебираем твиты, возвращаемые классом Twitter
, и выводим текст твита на консоль. Для запуска описанного выше скрипта вам не нужен лицензионный ключ.
Преобразование HTML – данных в обычный текст
Метод download
класса URL
возвращает данные в виде HTML. Однако если вы хотите провести семантический анализ текста, например классификацию тональностей, вам понадобятся очищенные данные без HTML-тегов. Вы можете очистить данные с помощью метода plaintext
. Метод принимает в качестве параметра HTML-содержимое, возвращаемое методом download
, и возвращает очищенный текст.
Посмотрите на следующий сценарий:
from pattern.web import URL, plaintext html_content = URL('https://stackabuse.com/python-for-nlp-introduction-to-the-textblob-library/').download() cleaned_page = plaintext(html_content.decode('utf-8')) print(cleaned_page)
В выходных данных вы должны увидеть очищенный текст с веб-страницы:
https://stackabuse.com/python-for-nlp-introduction-to-the-textblob-library/.
Важно помнить, что если вы используете Python 3, вам нужно будет вызвать метод decode('utf-8')
для преобразования данных из байтового формата в строковый.
Разбор PDF-документов
Библиотека шаблонов содержит объект PDF, который можно использовать для анализа PDF-документа. PDF (Portable Document Format)-это кросс-платформенный файл, содержащий изображения, тексты и шрифты в отдельном документе.
Давайте посмотрим, как PDF-документ может быть проанализирован с помощью объекта PDF:
from pattern.web import URL, PDF pdf_doc = URL('http://demo.clab.cs.cmu.edu/NLP/syllabus_f18.pdf').download() print(PDF(pdf_doc.decode('utf-8')))
В скрипте мы загружаем документ с помощью функции download
. Затем загруженный HTML-документ передается в класс PDF, который, наконец, печатает его на консоли.
Очистка кэша
Результаты, возвращаемые такими методами, как Search Engine.search()
и URL.download ()
, по умолчанию хранятся в локальном кэше. Чтобы очистить кэш после загрузки HTML-документа, мы можем использовать метод clear
класса cache, как показано ниже:
from pattern.web import cache cache.clear()
Вывод
Библиотека шаблонов-одна из самых полезных библиотек обработки естественного языка в Python. Хотя он не так хорошо известен, как space или NLTK, он содержит такие функции, как поиск превосходных степеней и сравнений, а также обнаружение фактов и мнений, что отличает его от других библиотек НЛП.
В этой статье мы изучили применение библиотеки шаблонов для обработки естественного языка, а также интеллектуального анализа данных и веб-скрейпинга. Мы видели, как выполнять базовые задачи НЛП, такие как токенизация, лемматизация и анализ настроений с помощью библиотеки паттернов. Наконец, мы также увидели, как использовать шаблон для создания поисковых запросов, майнинга онлайн-твитов и очистки HTML-документов.