Занятие 4
RSS и NER
Парсинг RSS-лент
Распознавание именованных сущностей
Частотные словосочетания
RSS
RSS (Rich Site Summary, обогащённая сводка сайта) — это краткое содержание новостной ленты сайта с актуальными новостями. По специальной ссылке можно получить xml-файл с краткой информацией о ключевых инфоповодах последних часов. У разных изданий разное наполнение RSS-ленты, но чаще всего оттуда можно получить:
  • заголовок статьи;
  • дату публикации;
  • ссылку на полную версию статьи.
Получение данных упрощено: не нужно продумывать сложные алгоритмы для парсинга. Наиболее быстро и просто обработать данные RSS-лент с помощью библиотеки feedparser.

Чтобы найти RSS-ленту издания, просто наберите в поисковике «Название издания RSS».



Примеры русских RSS-лент:

Примеры зарубежных RSS-лент:
Lambda X
Если нам нужно создать новый столбец в датафрейме на основе другого столбца, нам понадобится lambda-функция. По сути она говорит: возьми вместо x что угодно и сделай с ним вот это.

Вы можете назвать переменную не x, а как угодно. Главное, чтобы она стояла после слова lambda и перед двоеточием, а затем встречалась в выражении, которое нужно применить к изначальному столбцу.



Пример использования lambda-функции:

df ['В два раза больше'] = df['Изначальный столбец'].apply (lambda x: x*2)

Код умножит каждое из значений в колонке «Изначальный столбец» и сохранит результаты произведений в столбце «В два раза больше».
Именованные сущности
NER — Named Entity Recognition — распознавание именованных сущностей в тексте. К именованным сущностям относятся:

  • PERSON — Люди, включая выдуманных персонажей
  • NORP — Национальные, религиозные и политические группы
  • FACILITY — Здания, аэропорты, дороги, мосты и т.д.
  • ORGANIZATION — Компании, институции и др.
  • GPE — Страны, города, штаты
  • LOCATION — Локации, не относящиеся к GPE, горные массивы, водоёмы
  • PRODUCT — Транспорт, оружие, еда и др. — но не услуги
  • EVENT — Ураганы с названием, битвы, войны, спортивные мероприятия и др.
  • WORK OF ART — Названия книг, песен и др.





  • LAW — Документы с названием, принятые как законы
  • LANGUAGE — Язык
  • DATE — Абсолютные или относительные даты и периоды
  • TIME — Время, меньшее, чем день
  • PERCENT — Процент, включая %
  • MONEY — Денежные значения, включая обозначение валюты
  • QUANTITY — Измерения, такие как вес или расстояние
  • ORDINAL — Порядковые числительные
  • CARDINAL — Числовые значения, которые не попадают в другие категории
Для распознавания именованных сущностей нужно выбрать библиотеку в зависимости от языка, с которым вы работаете:
  • английский язык — spacy;
  • русский язык — natasha.
Загрузка natasha
Segmenter — разбивает строку на предложения и токены:
  • doc.tokens — токены;
  • doc.sents — предложения.

MorphVocab — морфологический анализатор. Определяет:
  • pos — часть речи;
  • feats — другие характеристики словоформы, например:
  • Animacy — одушевлённость;
  • Case — падеж;
  • Gender — гендер;
  • Mood — эмоциональная окрашенность;
  • Number — число (единственное или множественное);
  • Person — лицо;
  • Tense — время глагола;
  • Voice — активный, пассивный, средний залог (я делаю, со мной делают, я сам себе делаю).
NERTagger — находит именованные сущности и присваивает им лейблы.

!pip install natasha

from natasha import MorphVocab, Doc, NewsNERTagger, NewsMorphTagger, NewsEmbedding, Segmenter

segmenter = Segmenter()
morph_vocab = MorphVocab()
emb = NewsEmbedding()
ner_tagger = NewsNERTagger(emb)
morph_tagger = NewsMorphTagger(emb)
В тексте могут встречаться мнемоники — разные служебные символы, которые проставляются при вёрстке. Обычно они начинаются с & и заканчиваются ;

  • & laquo ; — левая кавычка-ёлочка;
  • & raquo ; — правая кавычка-ёлочка;
  • & mdash ; — длинное тире;
  • & nbsp ; — неразрывный пробел.

Убирайте эти символы из текста с помощью регулярного выражения

Тэги в natasha
Natasha основана на pymorphy, поэтому морфологические тэги (род, число, падеж, одушевлённость) и способы их достать похожи, но не идентичны. В частности, нужные параметры надо прописывать с большой буквы, а прилагательные не делятся на полные и краткие.

Части речи:
  • ADJ: adjective — прилагательное
  • ADP: adposition — предлог
  • ADV: adverb — наречие
  • AUX: auxiliary — служебное слово
  • CCONJ: coordinating conjunction — соединительный союз
  • DET: determiner — артикли и указательные местоимения
  • INTJ: interjection — междометие



  • NOUN: noun — существительное
  • NUM: numeral — числительное
  • PART: particle — частица
  • PRON: pronoun — местоимение
  • PROPN: proper noun — имя собственное
  • PUNCT: punctuation — пунктуация
  • SCONJ: subordinating conjunction — подчинительный союз
  • SYM: symbol — эмодзи и другие символы
  • VERB: verb — глагол
  • X: other — другое

Другие параметры:
  • Одушевлённость — Animacy — Inan/Anim
  • Падеж — Case
  • Род — Gender — Masc/Fem/Neut
  • Число — Number — Sing/Plur
Общая функция natasha
Функция для извлечения именованных сущностей
def ner_extractor (text):
  doc = Doc (text)
  doc.segment(segmenter)
  doc.tag_morph (morph_tagger)
  for token in doc.tokens:
   token.lemmatize(morph_vocab)
  doc.tag_ner (ner_tagger)
  all_lemmas = []
  for span in doc.spans:
    span.normalize (morph_vocab)
    all_lemmas.append (span.normal)
  all_lemmas = list (set (all_lemmas))
  return all_lemmas
Относительная частота слова
  • Абсолютная частота — сколько раз слово N встречается в тексте.
  • Относительная частота — абсолютная частота слова N, разделённая на число всех токенов в тексте.
Spacy
Извлечение именованных сущностей на иностранных языках.

Список всех доступных языков
!pip install spacy

import spacy
from spacy import displacy

import en_core_web_sm
nlp = en_core_web_sm.load()

from collections import Counter
from pprint import pprint # визуально удобная печать списка кортежей

doc = nlp (english_text)
print (doc.ents)
pprint([(X.text, X.label_) for X in doc.ents])
Задание «The Guardians of the Galaxy»
  1. Зайдите на сайт The Guardian.
  2. Откройте любую новость.
  3. Скопируйте оттуда 1–2 абзаца основного текста (не лид) и сохраните как строку в переменную.
  4. Извлеките из этого текста именованные сущности с помощью spacy.
  5. Откройте файл «Англоязычные новости» и перейдите к разделу с вашим именем.
  6. Под заголовком «Ссылка на новость» скопируйте и вставьте ссылку на саму новость.





7. Под заголовком «Текст новости» вставьте те абзацы, которые вы скопировали и анализировали.
8. Под заголовком «Выделенные именованные сущности» вставьте те именованные сущности, которые удалось выделить с помощью spacy.
9. Прочитайте текст, который вы анализировали, и сравните его с полученными именованными сущностями.
10. Под заголовком «Ваши впечатления о качестве выделения именованных сущностей» напишите, довольны ли вы результатом распознавания. Есть ли ошибки или незамеченные именованные сущности?
Домашнее задание
Дедлайн: 29 сентября, понедельник, 18:00
Критерии оценивания
1. Соберите ленту новостей РБК на момент выполнения домашнего задания.

2. Сохраните её содержимое как xlsx файл и загрузите его в свою папку. Файл должен быть назван «Новости РБК от XX:XX XX.11.2024», где XX:XX — время получения новостей, а XX.11.2024 — дата выгрузки. Пример: «Новости РБК от 01:00 21.22.2024.xlsx».

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

3. Соберите все тексты в единую строку и предобработайте её (лемматизируйте, токенизируйте, проведите морфологический анализ, избавьтесь от стоп-слов).

4. Заполните таблицу напротив своего имени. В отличие от занятий на парах, вносите только значимые слова. Не нужно включать в результаты стоп-слова и леммы, частотные для русского языка в целом. Можно ориентироваться на топ-100 или топ-200 частотных лемм. Частотность также не нужна, напишите только слова.

5. Заведите в своей папке текстовый документ. Назовите его «Повестка дня РБК». Проанализируйте полученные результаты частотности и сделайте выводы, какие новости попадают на первую полосу издания и что можно сказать о повестке дня.

Пишите текст журналистским, качественным русским языком. Представьте, что это аналитическая заметка, которую вам нужно будет опубликовать для широкого круга читателей.
Объём — пост с картинкой в Telegram Premium (2 048 символов).

6. Оформите .ipynb-блокнот, в котором вы работали, так, чтобы даже спустя несколько лет вы смогли открыть его и понять, что нужно делать и как получить необходимый результат. Для этого можно использовать текстовые ячейки Markdown и комментарии внутри ячеек с кодом.

7. Сохраните .ipynb-блокнот, в котором вы работали, и загрузите его в вашу папку.
This site was made on Tilda — a website builder that helps to create a website without any code
Create a website