Примерно то, что требуется в задании, продемонстрировано в статье на хабре по ссылке.
Продемонстрируем некоторые отдельные вопросы, которые возможно возникнут при выполнении задания.
Необходимо использовать магические ячейки и установить некоторые библиотеки, которых в базовом наборе библиотек колаба, нет.
%%sh
pip install yargy # для обработки текста
pip install natasha # для обработки текста
pip install wordcloud # для создания изображения с облаком тегов
Можно использовать механизм, используемый в прошлой ЛР (BeautifulSoup) или что-то другое.
Предлагается использовать регулярные выражения, поскольку все новости на сайте ведут на подраздел /news/*
Извлекаем ссылки на конкретные новости и открываем каждую страницу аналогичным образом получаем текст новости полностью.
Не забыть выполнить предварительную очистку и токенизацию текста по словам. После очистки текста требуется положить его в отдельный текстовый файл или сохранить в строковую переменную. В конце — склеить весь текст в единый текстовый файл.
Затем, используя библиотеку natasha извлекаем имена упоминаемых в тексте людей и добавляем их в json-файл. Далее, для имён требуется сериализовать данные из json-файла, убрав имена и оставив только фамилии. После этого сделать из фамилий текст и визуализировать информацию о статистики встречаемости в виде облака тегов. Аналогично, сделать облако тегов для ключевых понятий.
import re
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('https://www.herzen.spb.ru/main/news/')
bs = BeautifulSoup(html, "html.parser")
# news3.jpg
div = bs.find('div', {'class':'news_container'})
print(div)
# news_p_array = image.parent.parent.children
Для примера визуализируем наиболее часто встречаемые слова из текста А. С. Пушкина "Метель".
%%capture
!wget https://raw.githubusercontent.com/Metafiz/nlp-course-20/master/pushkin-metel.txt
%matplotlib inline
from wordcloud import WordCloud
import matplotlib.pyplot as plt
f = open('pushkin-metel.txt', "r", encoding="utf-8")
text = f.read()
# wordcloud = WordCloud().generate(text)
text2 = """
Lorem ipsum dolor sit amet,
Lorem ipsum dolor
Lorem ipsum
Lorem
"""
wordcloud = WordCloud().generate(text)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
Получилось плохо, потому что мы не предобработали текст (в частности: не убрали стоп-слова, не провели лемматизацию текста, не сегментировали текст).
Сделаем это и визуализируем с помощью облака слов содержимое текста еще раз.
%%sh
pip install natasha # для обработки текста
%%capture
!wget https://raw.githubusercontent.com/Metafiz/nlp-course-20/master/pushkin-metel.txt
from natasha import (
Segmenter,
MorphVocab,
NewsEmbedding,
NewsMorphTagger,
NewsSyntaxParser,
NewsNERTagger,
PER,
NamesExtractor,
Doc
)
segmenter = Segmenter()
morph_vocab = MorphVocab()
emb = NewsEmbedding()
morph_tagger = NewsMorphTagger(emb)
syntax_parser = NewsSyntaxParser(emb)
ner_tagger = NewsNERTagger(emb)
names_extractor = NamesExtractor(morph_vocab)
f = open('pushkin-metel.txt', "r", encoding="utf-8")
text = f.read()
doc = Doc(text)
doc.segment(segmenter)
doc.tag_morph(morph_tagger)
doc.parse_syntax(syntax_parser)
doc.tag_ner(ner_tagger)
for span in doc.spans:
span.normalize(morph_vocab)
# print({_.text: _.normal for _ in doc.spans})
for span in doc.spans:
if span.type == PER:
span.extract_fact(names_extractor)
{_.normal: _.fact.as_dict for _ in doc.spans if _.fact}
Семестр7-ЛР6
%%sh
pip install yargy # для обработки текста
pip install natasha # для обработки текста
pip install wordcloud # для создания изображения с облаком тегов
HERZEN_MAIN = 'https://www.herzen.spb.ru'
import re
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('https://www.herzen.spb.ru/main/news/')
bs = BeautifulSoup(html, "html.parser")
# news3.jpg
blockwh = bs.find('td', {'class':'blockwh'}).find_all('a', {'class':'news_header_link'}, limit=30) # 30 = the amount of news on one page.
# print(blockwh)
# news_p_array = image.parent.parent.children
links_list = []
for el in blockwh:
links_list.append(HERZEN_MAIN + el['href'])
print(links_list)
complete_news_page_list = []
for el in links_list:
temp_html = urlopen(el)
temp_bs = BeautifulSoup(temp_html, "html.parser")
another_blockwh = temp_bs.find('td', {'class':'blockwh'})
another_blockwh_title = another_blockwh.h1.get_text()
another_blockwh_contentblock = another_blockwh.find_all('p')
another_blockwh_content_stripped = another_blockwh_title
for el in another_blockwh_contentblock:
stripped = el.strings
for inner_el in stripped:
another_blockwh_content_stripped += inner_el
# print(inner_el)
complete_news_page_list.append(another_blockwh_content_stripped)
# print(another_blockwh_content_stripped[0])
print(complete_news_page_list[0])
from natasha import (
Segmenter,
MorphVocab,
NewsEmbedding,
NewsMorphTagger,
NewsSyntaxParser,
NewsNERTagger,
PER,
NamesExtractor,
Doc
)
segmenter = Segmenter()
morph_vocab = MorphVocab()
emb = NewsEmbedding()
morph_tagger = NewsMorphTagger(emb)
syntax_parser = NewsSyntaxParser(emb)
ner_tagger = NewsNERTagger(emb)
names_extractor = NamesExtractor(morph_vocab)
%matplotlib inline
from wordcloud import WordCloud
import matplotlib.pyplot as plt
plt.figure(figsize=(2, 2), dpi=1000)
i = 1
full_wordcloud = ''
for el in complete_news_page_list:
doc = Doc(el)
doc.segment(segmenter)
doc.tag_morph(morph_tagger)
doc.parse_syntax(syntax_parser)
doc.tag_ner(ner_tagger)
for token in doc.tokens:
token.lemmatize(morph_vocab)
for span in doc.spans:
span.normalize(morph_vocab)
words_for_cloud_str = ''
for span in doc.spans:
words_for_cloud_str += span.normal + ' '
full_wordcloud += words_for_cloud_str + ' '
wordcloud = WordCloud().generate(words_for_cloud_str)
plt.subplot(5, 6, i)
i += 1
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.figure(figsize=(2, 2), dpi=2000)
full_wordcloud_cloud = WordCloud().generate(full_wordcloud)
plt.imshow(full_wordcloud_cloud, interpolation='bilinear')
plt.axis("off")