Это восьмая статья из моей серии статей о Python для НЛП. В моей предыдущей статье я объяснил, как можно использовать библиотеку Python TextBlob для выполнения множества задач НЛП, начиная от токенизации и заканчивая тегированием POS и классификацией текста до анализа тональности. В этой статье мы рассмотрим библиотеку Python Pattern , которая является еще одной чрезвычайно полезной библиотекой обработки естественного языка.
Библиотека шаблонов - это многоцелевая библиотека, способная решать следующие задачи:
- Обработка естественного языка: выполнение таких задач, как токенизация, стемминг, теги POS, анализ настроений и т. Д.
- Data Mining: он содержит API-интерфейсы для сбора данных с таких сайтов, как Twitter, Facebook, Wikipedia и т. Д.
- Машинное обучение: содержит модели машинного обучения, такие как SVM, KNN и персептрон, которые можно использовать для задач классификации, регрессии и кластеризации.
В этой статье мы увидим первые два приложения библиотеки Pattern из приведенного выше списка. Мы рассмотрим использование библиотеки шаблонов для НЛП, выполняя такие задачи, как токенизация, стемминг и анализ настроений. Мы также увидим, как можно использовать библиотеку Pattern для веб-майнинга.
Установка библиотеки
Чтобы установить библиотеку, вы можете использовать следующую команду pip:
$ pip install pattern
В противном случае, если вы используете дистрибутив Python для Anaconda, вы можете использовать следующую команду Anaconda для загрузки библиотеки:
$ conda install -c asmeurer pattern
Функции библиотеки паттернов для НЛП
В этом разделе мы увидим некоторые приложения НЛП библиотеки шаблонов.
Токенизация, POS-теги и разбиение на части
В библиотеках NLTK и spaCy у нас есть отдельная функция для токенизации,
маркировки POS и поиска словосочетаний в текстовых документах. С другой
стороны, в библиотеке Pattern есть parse
который принимает текстовую
строку в качестве входного параметра и возвращает соответствующие токены
в строке вместе с тегом POS.
Метод parse
также сообщает нам, является ли токен именной или
глагольной фразой, субъектом или объектом. Вы также можете получить
лемматизированные токены, установив lemmata
параметра True
.
Синтаксис 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
содержит функции НЛП на английском
языке. Если вы используете pprint
для вывода 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
метод ngram используется для поиска всех n-граммов
в текстовой строке. Первым параметром ngram
является текстовая строка.
Количество n-грамм передается n
метода. Взгляните на следующий пример:
from pattern.en import ngrams
print(ngrams("He goes to hospital", n=2))
Выход:
[('He', 'goes'), ('goes', 'to'), ('to', 'hospital')]
В поисках настроений
Настроение относится к мнению или чувству по отношению к определенной вещи. Библиотека шаблонов предлагает функциональные возможности для поиска тональности текстовой строки.
В Pattern 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
из библиотеки Pattern можно использовать для определения
степени достоверности текстовой строки. Функция 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"))
В приведенном выше скрипте у нас есть слово Whitle
которое написано
неправильно. В выводе вы увидите возможные варианты этого слова.
[('While', 0.6459209419680404), ('White', 0.2968881412952061), ('Title', 0.03280067283431455), ('Whistle', 0.023549201009251473), ('Chile', 0.0008410428931875525)]
Согласно suggest
, существует вероятность 0,64, что слово будет
«Пока», аналогично существует вероятность 0,29, что это слово «белый», и
так далее.
Теперь давайте правильно произнесем слово:
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-адресов в тексте
Вы можете использовать findurl
для извлечения 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
метод работает в фоновом
режиме, чтобы пользователь мог взаимодействовать с приложением во время
загрузки веб-страницы.
Возьмем очень простой пример 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 и т. Д. Конструкция SearchEngine
принимает три
параметра:
license
: лицензионный ключ разработчика для соответствующей поисковой системы или веб-сайта.throttle
: соответствует разнице во времени между последовательными запросами к серверуlangauge
: указывает язык результатов
Метод search
SearchEngine
используется для выполнения запроса к
поисковой системе по определенному поисковому запросу. Метод search
может принимать следующие параметры:
query
: строка поискаtype:
тип данных, которые вы хотите найти, может принимать три значения:SEARCH
,NEWS
иIMAGE
.start
: страница, с которой вы хотите начать поискcount
: количество результатов на странице.
Классы поисковых систем, которые наследуют SearchEngine
вместе с его
методом search
Google
, Bing
, Twitter
, Facebook
,
Wikipedia
и Flickr
.
Поисковый запрос возвращает объекты для каждого элемента. Затем result
можно использовать для получения информации о найденном результате.
Атрибуты объекта result
url
, title
, text
, language
,
author
, date
.
Теперь давайте посмотрим на очень простой пример того, как мы можем искать что-то в Google через библиотеку шаблонов. Помните, что для того, чтобы этот пример работал, вам нужно будет использовать лицензионный ключ разработчика для Google API.
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
Далее мы передаем строковый artificial intelligence
search
методу. По умолчанию будут возвращены первые 10 результатов с первой
страницы, которые затем повторяются, а URL-адрес и текст каждого
результата отображаются на экране.
Процесс аналогичен поисковой системе Bing, вам нужно только заменить
класс Bing
Google
в приведенном выше сценарии.
Теперь давайте поищем в Twitter три последних твита, содержащих текст «искусственный интеллект». Выполните следующий скрипт:
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, который, наконец,
распечатывает его на консоли.
Очистка кеша
Результаты, возвращаемые такими методами, как SearchEngine.search()
и
URL.download()
, по умолчанию сохраняются в локальном кэше. Чтобы
очистить кеш после загрузки HTML-документа, мы можем использовать
clear
класса cache, как показано ниже:
from pattern.web import cache
cache.clear()
Заключение
Библиотека шаблонов - одна из самых полезных библиотек обработки естественного языка в Python. Хотя он не так известен как spaCy или NLTK, он содержит такие функции, как поиск превосходных степеней и сравнений, а также обнаружение фактов и мнений, что отличает его от других библиотек NLP.
В этой статье мы изучили применение библиотеки шаблонов для обработки естественного языка, интеллектуального анализа данных и веб-скрейпинга. Мы увидели, как выполнять основные задачи НЛП, такие как токенизация, лемматизация и анализ настроений, с помощью библиотеки шаблонов. Наконец, мы также увидели, как использовать Pattern для выполнения поисковых запросов, анализа онлайн-твитов и очистки HTML-документов.