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

Это восьмая статья из моей серии статей о Python для НЛП. В моей предыдущей статье [/ python-for-nlp-Introduction-to-the-textblob-library /] я объяснил, как библиотеку Python TextBlob можно использовать для выполнения множества задач NLP, начиная от токенизации и заканчивая тегами POS и классификацией текста. к анализу настроений. В этой статье мы рассмотрим библиотеку Python Pattern [https://github.com/clips/pattern], которая является еще одной чрезвычайно полезной библиотекой обработки естественного языка. В

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

comments powered by Disqus