Рубрики
Без рубрики

Python для НЛП: Введение в библиотеку паттернов

Автор оригинала: Usman Malik.

Это восьмая статья в моей серии статей по 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-документов.