27-го октября (в 9:00), в репозитории должен лежать готовый код, который умеет делать всё, что перечислено ниже, а также в файле Readme.md в папке с проектом должна находиться ссылка на скачанные и обработанные файлы вашей газеты, лежащие одним архивом на Яндекс.Диске, Google Drive, Облаке@Мэйл.ру или на чём угодно подобном (но, пожалуйста, не надо заливать эти архивы на гитхаб).
При этом
- Общий объём скачанных текстов должен быть не меньше 100 тыс. слов.
- В именах файлов не должно быть не-ascii символов (убираем их из url - stackoverflow).
- Структура каталогов, в которых хранятся файлы, должна быть следующей: корень/год/месяц/файлы с материалами за этот месяц
- В корне также должна лежать 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"
Таким образом, со страницы со статьей нужно еще извлечь, если возможно, имя автора, дату публикации, название публикации, приписанные категории.
Кроме того, коллекция текстов с сайта газеты должна быть представлена в трёх видах (каждый вид в отдельной папке):
-
Неразмеченный текст в формате "для чтения" (текст разделен на абзацы тэгами
+ картинки, но ничего кроме этого).
В нём перед текстом должны быть такие строки (после собаки и примыкающего к ней слова через пробел нужно написать релевантную информацию):
@au имя автора (если автора нет, пишем Noname)
@ti Название статьи
@da дата в формате 12.02.2012
@topic категория, если мы её можем найти на странице со статьёй
@url URL, откуда мы скачали страницу -
Размеченный mystem текст в формате XML
-
Размеченный mystem текст в формате plain text
Соответственно, сама программа (в одном или в нескольких файлах) должна уметь:
- Скачивать страницы с выбранного сайта, обходя его по принципу краулера. При этом программа не должна заходить на одни и те же страницы несколько раз.
- Извлекать со страниц информацию для метатаблицы (если она доступна) и сам текст.
- Генерировать вид "для чтения", убирая со страницы всю лишнюю информацию.
- Раскладывать скачанные тексты по папкам.
- Вызывать 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'))