NLP, Python

Анализ естественного языка (NLP)

Время прочтения: 4 мин.

В 1913 году ученые математики, используя ручной подсчет определили, что 43% гласных и 57% согласных содержит роман А.С. Пушкина «Евгений Онегин». Основной задачей было — построить первую модель генерирования языка и доказать, что статистические свойства языка можно моделировать. Сегодня расскажу, как, используя современные методы обработки языка, научить машину определять тематику текста.

Благодаря развитию голосовых помощников и чат-ботов, обработка естественного языка (NLP) стала одним из важных направлений искусственного интеллекта. Основная задача NLP обучить машину понимать человеческий язык. Но сложность заключается в том, что человеческая речь – это не только экзогенный сигнал, но и осознанная передача информации. Поэтому компьютерам трудно ее интерпретировать и использовать.
NLP также применяется в поиске устной или письменной речи, авто-переводе, анализе настроений пользователей и других задачах.
В данной статье, мы рассмотрим, как анализировать текст, полученный с любого сайта, чтобы получить представление о его тематике и основных объектах обсуждения при помощи библиотек: nltk, urllib3 и BeautifulSoup.

С такими библиотеками, как nltk и BeautifulSoup знакомы многие, сейчас же уделим внимание urllib3.

Библиотека urllib3 – это мощный HTTP-клиент на Python с простым для понимания и продуманным кодом.

import urllib3.request 
import string
import nltk
#nltk.download('stopwords')
import pymorphy2
morph = pymorphy2.MorphAnalyzer()
from bs4 import BeautifulSoup
http = urllib3.PoolManager()
url = 'https://vetugolok.ru/piton-foto/'
html = (http.request('GET', url).data.decode('utf-8'))
print(html)
Рисунок 1 – Пример результата Get-запроса.

В данном примере, мы посылаем GET-запрос по нашему адресу. После чего выводим на экран результат запроса.

Теперь нам нужно удалить определенные символы.

def remove_chars_from_text(text, chars):
    return "".join([ch for ch in text if ch not in chars])

Используем библиотеку BeautifulSoup, чтобы очистить текст нашей веб-страницы от основных HTML-тегов.

soup = BeautifulSoup(html,'html5lib')
text = soup.get_text(strip = True).lower()

string.punctuation – это строка (можно увеличить количество символов, которые нужно удалить)

Далее нужно проанализировать текст и найти символы для удаления (а также: запятые и другие знаки препинания).

spec_chars = string.punctuation + '\n\xa0«»\t—…' 

Теперь нам нужно удалить символы. Для этого разделим нужную строку на символы. Оставляем те, которые не входят в spec_chars. А затем получившийся набор объединить в строку.

text = "".join([ch for ch in text if ch not in spec_chars])

Используем ранее объявленную функцию как для удаления спецсимволов, так и для удаления цифр из текста.

text = remove_chars_from_text (text, spec_chars)
text = remove_chars_from_text (text, string.digits)
print(text)
Рисунок 2  — После первичной обработки текста

Дальше нужно разбить текст на токены (отдельные части), но т.к. мы анализируем текст, нам не интересны сокращения и другие составные части предложений, поэтому ставим минимальную длину слов (наших токенов).

tokens = [t for t in text.split() if len(t)>2]

В дальнейшем преобразуем каждое слово к его нормальной форме, чтобы избежать повторений слов в различных его склонениях.

for i in range(0,len(tokens)):
    tokens[i] = (morph.parse(tokens[i])[0]).normal_form
print(tokens)
Рисунок 3 – Результат токенизации

Подсчитать частоту слов нам поможет библиотека nltk имеющую функцию FreqDist(), которая сделает эту работу за нас. Кроме того, мы удалим стоп-слова.

from nltk.corpus import stopwords
russian_stopwords = stopwords.words("russian")
clean_tokens = tokens[:]
for token in tokens:
    if token in stopwords.words('russian'):
        clean_tokens.remove(token) 
freq = nltk.FreqDist(clean_tokens)
for key,val in freq.items():
    print(str(key) + ':' + str(val))
Рисунок 4 – Результат функции FreqDist()

Так же мы построим график для  повторяющихся слов на страницах интернет ресурсов, чтобы получить понять тематику данного сайта.

freq.plot(20, cumulative=False)
Рисунок 5 – График для наиболее часто встречающихся слов

В дополнении к материалу, для наглядности, создадим облако слов (тегов) при помощи библиотеки WordCloud.

from wordcloud import WordCloud
import matplotlib.pyplot as plt
%matplotlib inline

Строим облако слов, передаем строку с нашим топом слов, в котором отражены самые часто встречающиеся слова.

text_raw = " ".join(freq)
wordcloud = WordCloud().generate(text_raw)
plt.imshow(wordcloud)

Итак, мы получили наглядную картину, в которой отображены самые частные слова на нашей страничке, благодаря чему мы можем сделать вывод о тематике данного сайта.

Рисунок 6 – Результат работы библиотеки wordcloud


Советуем почитать