Время прочтения: 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)
В данном примере, мы посылаем 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)
Дальше нужно разбить текст на токены (отдельные части), но т.к. мы анализируем текст, нам не интересны сокращения и другие составные части предложений, поэтому ставим минимальную длину слов (наших токенов).
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)
Подсчитать частоту слов нам поможет библиотека 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))
Так же мы построим график для повторяющихся слов на страницах интернет ресурсов, чтобы получить понять тематику данного сайта.
freq.plot(20, cumulative=False)
В дополнении к материалу, для наглядности, создадим облако слов (тегов) при помощи библиотеки WordCloud.
from wordcloud import WordCloud
import matplotlib.pyplot as plt
%matplotlib inline
Строим облако слов, передаем строку с нашим топом слов, в котором отражены самые часто встречающиеся слова.
text_raw = " ".join(freq)
wordcloud = WordCloud().generate(text_raw)
plt.imshow(wordcloud)
Итак, мы получили наглядную картину, в которой отображены самые частные слова на нашей страничке, благодаря чему мы можем сделать вывод о тематике данного сайта.