Skip to content

Latest commit

 

History

History
169 lines (127 loc) · 9.93 KB

File metadata and controls

169 lines (127 loc) · 9.93 KB

Собери корпус из газет

Про проект

27-го октября (в 9:00), в репозитории должен лежать готовый код, который умеет делать всё, что перечислено ниже, а также в файле Readme.md в папке с проектом должна находиться ссылка на скачанные и обработанные файлы вашей газеты, лежащие одним архивом на Яндекс.Диске, Google Drive, Облаке@Мэйл.ру или на чём угодно подобном (но, пожалуйста, не надо заливать эти архивы на гитхаб).

При этом

  1. Общий объём скачанных текстов должен быть не меньше 100 тыс. слов.
  2. В именах файлов не должно быть не-ascii символов (убираем их из url - stackoverflow).
  3. Структура каталогов, в которых хранятся файлы, должна быть следующей: корень/год/месяц/файлы с материалами за этот месяц
  4. В корне также должна лежать csv-таблица с такими полями (разделитель - знак табуляции):
path	author	sex	birthday	header	created	sphere	genre_fi	type	topic	chronotop	style	audience_age	audience_level	audience_size	source	publication	publisher	publ_year	medium	country	region	language

Имена полей означают следующее:

path -- это путь к чистому неразмеченному файлу со статьёй,
author -- имя автора, если его можно достать со страницы (и вообще если оно есть),
sex -- поле оставить пустым,
birthday -- оставить пустым
header -- название статьи
created -- дата в формате 07.01.2012 (день.месяц.год)
sphere -- слово "публицистика"
genre_fi -- оставить пустым
type -- оставить пустым
topic -- категория, если мы её можем найти на странице со статьёй
chronotop -- оставить пустым
style -- слово "нейтральный"
audience_age -- слово "н-возраст"
audience_level -- слово "н-уровень"
audience_size -- "районная", если газета районная, "республиканская", если газета республиканская, "городская" -- если городская
source -- URL, откуда статья была скачана
publication -- название газеты
publisher -- оставить пустой
publ_year -- год публикации
medium -- слово "газета"
country -- слово "Россия"
region -- Название региона, откуда ваша газета
language -- слово "ru"

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

Кроме того, коллекция текстов с сайта газеты должна быть представлена в трёх видах (каждый вид в отдельной папке):

  1. Неразмеченный текст в формате "для чтения" (текст разделен на абзацы тэгами

    + картинки, но ничего кроме этого).

    В нём перед текстом должны быть такие строки (после собаки и примыкающего к ней слова через пробел нужно написать релевантную информацию):

    @au имя автора (если автора нет, пишем Noname)
    @ti Название статьи
    @da дата в формате 12.02.2012
    @topic категория, если мы её можем найти на странице со статьёй
    @url URL, откуда мы скачали страницу

  2. Размеченный mystem текст в формате XML

  3. Размеченный mystem текст в формате plain text

Соответственно, сама программа (в одном или в нескольких файлах) должна уметь:

  1. Скачивать страницы с выбранного сайта, обходя его по принципу краулера. При этом программа не должна заходить на одни и те же страницы несколько раз.
  2. Извлекать со страниц информацию для метатаблицы (если она доступна) и сам текст.
  3. Генерировать вид "для чтения", убирая со страницы всю лишнюю информацию.
  4. Раскладывать скачанные тексты по папкам.
  5. Вызывать mystem и делать морфологическую разметку текста (таким образом, чтобы каждому слову была присвоена информация о лемме и грамматическая информация с учётом контекстно снятой омонимии).

Про каталог еще раз

Каталог должен выглядеть вот так:

📂газета
|
|____ metadata.csv
|
|____📂html
|    |
|    |____📂2016
|    |    |
|    |    |____📂1
|    |    |    |
|    |    |    |____ статья1.html
|    |    |    |
|    |    |    |____ статья2.html
|    |    |
|    |    |____📁2
|    |
|    |____📁2015
|
|____📂mystem-xml<br>
|    |
|    |____📂2016
|    |    |
|    |    |____📂1
|    |    |    |
|    |    |    |____ статья1.xml
|    |    |    |
|    |    |    |____ статья2.xml
|    |    |
|    |    |____📁2
|    |
|    |____📁2015
|
|____📂mystem-plain
     |
     |____📂2016
     |    |
     |    |____📂1
     |    |    |
     |    |    |____ статья1.txt
     |    |    |
     |    |    |____ статья2.txt
     |    |
     |    |____📁2
     |
     |____📁2015

Про устройство программы

Подумаем, как может быть устроена ваша программа.

Путь первый

Для каждой задачи написать отдельную функцию. Написать главную функцию, которая запускает программу.

Путь второй

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

Про папки

Вспомним, как на питоне работать с папками. Для этого используется модуль os.

Создать папку: os.mkdir(dirname) или os.makedirs(dirname). mkdir создает директорию и вызывает ошибку, если она существует. makedirs создает директории и все несуществующие директории в указанном пути (например, если в dirname указан путь ./dir1/dir2/dir3, и при этом dir1 и dir2 не существуют, то функция их создаст).

Проверить, существует ли папка: os.path.exists(dirname) (возвращает True или False). Пройтись по каталогу: os.walk(dirname).

Вот такой маленький сниппет, возможно, вам пригодится:

import os

if not os.path.exists(directory):
    os.makedirs(directory)

Как просто вставить куски строки в шаблон

Для такого форматирования можно использовать оператор %.

%s в строке значит, что в это место вставится строка. %d значит, что в это место вставится число. Эти последовательности пишутся в том месте строки, куда нужно что-то вставить.

После строки пишется знак % и затем кортеж (в круглых скобочках) из элементов, которые нужно вставить:

row = '%s\t%s\t\t\t%s\t%s\tпублицистика\t\t\t%s\t\tнейтральный\tн-возраст\tн-уровень\tрайонная(если районная)\t%s\tназвание газеты\t\t%s\tгазета\tРоссия\tкакой-то регион\tru'

print(row % ('тут ссылка', 'Петя', 'Название статьи', '26.09.2016', 'образование', 'url', '2016'))
print(row % ('тут другая ссылка', 'Автор', 'Другая статья', '27.09.2016', 'спорт', 'url2', '2016'))