<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%28python%29_%D0%B4%D0%BB%D1%8F_%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%BE%D0%B2_%D0%B4%D0%B7</id>
	<title>Программирование (python) для лингвистов дз - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%28python%29_%D0%B4%D0%BB%D1%8F_%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%BE%D0%B2_%D0%B4%D0%B7"/>
	<link rel="alternate" type="text/html" href="https://wikicshse.ru/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_(python)_%D0%B4%D0%BB%D1%8F_%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%BE%D0%B2_%D0%B4%D0%B7&amp;action=history"/>
	<updated>2026-06-07T10:14:23Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wikicshse.ru/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_(python)_%D0%B4%D0%BB%D1%8F_%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%BE%D0%B2_%D0%B4%D0%B7&amp;diff=1906&amp;oldid=prev</id>
		<title>imported&gt;Denaas: /* Assignment 10. */</title>
		<link rel="alternate" type="text/html" href="https://wikicshse.ru/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_(python)_%D0%B4%D0%BB%D1%8F_%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%BE%D0%B2_%D0%B4%D0%B7&amp;diff=1906&amp;oldid=prev"/>
		<updated>2018-01-16T16:24:34Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Assignment 10.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Assignment 1. == &lt;br /&gt;
&lt;br /&gt;
1. Реализовать функцию fibonacci(n) вычисления n-ого числа Фибоначчи со сложностью не хуже O(n) по вренени&lt;br /&gt;
&lt;br /&gt;
2. Реализуйте иерархию наследования с нетривиальной структурой (т.е. иерархия должна образовывать дерево / лес), не менее 6 классов. Например: группы языков, систематика животного мира и т.д. Продемонстрируйте на примере применение полиморфизма к решению какой то задачи. (Например, обслуживание зоопарка в случае животных).  &lt;br /&gt;
P.S. укажите в комментариях к коду (например, в реализации класса зоопарка), в каком месте вы применяете полиформизм&lt;br /&gt;
&lt;br /&gt;
3. Реализуйте средствами ООП паттерн поведения Singleton:&lt;br /&gt;
класс UniqObject реализует метод класса create_object, который возращает объект UniqObject. Объект UniqObject должен всегда существовать в единственном экземпляре.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сделанная домашняя работа выкладывается в репозиторий в папку homework_1, решение каждого задания - в отдельный файл task_&amp;lt;номер задания&amp;gt;.py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Assignment 2. == &lt;br /&gt;
&lt;br /&gt;
Цель задания - научится самостоятельно ориентроваться в документации к библиотекам.  &lt;br /&gt;
&lt;br /&gt;
[https://github.com/thedenaas/hse_seminars/blob/master/seminar_2/web%20mining.ipynb библиотека pattern]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/thedenaas/hse_seminars/blob/master/seminar_2/web%20mining.ipynb инструкция по установке]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0BzrfRHrbun42bWc1NjVIRlNKT1E/view?usp=sharing virtualbox image with preinstalled libraries] user: hse, password: hsepass&lt;br /&gt;
&lt;br /&gt;
Вам необходимо написать программу, которая парсит статьи википедии (language=en) и считает по ним некоторые статистики.  &lt;br /&gt;
&lt;br /&gt;
1. Реализовать класс WikiParser с конструктором без аргументов и методом get_articles, который принимает название исходной статьи start, обходит все статьи википедии, на которые она ссылается, и возвращает список содержимого статей (с выполнением парсинга).  &lt;br /&gt;
# При парсинге каждой статьи для того, чтобы убрать html теги, используется функция pattern.web.plaintext.&lt;br /&gt;
# В результате парсинга между соседними словами должно быть 1 пробел. &lt;br /&gt;
# В результате парсинга весь текст переводится в lowercase, знаки пунктуации выкидываются&lt;br /&gt;
&lt;br /&gt;
Интерфейс:&lt;br /&gt;
&lt;br /&gt;
   class WikiParser:&lt;br /&gt;
      def __init__(self):&lt;br /&gt;
         pass&lt;br /&gt;
      def get_articles(self, start, depth, max_count):&lt;br /&gt;
         return list_of_strings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Реализовать класс TextStatistics с конструктором, который принимает в качестве аргумента список содержимого статей:&lt;br /&gt;
# get_top_3grams - возвращает tuple, первым элемент которого - список 3-грамм в порядке убывания их частот, второй элемент - соотвественно список сколько раз встретилась каждая 3грамма. Подсчет идет по всему корпусу articles. При подсчете 3-грамм исключить из рассмотрения все числа и пунктуацию.&lt;br /&gt;
# get_top_words - возвращает tuple, первым элемент которого - список слов в порядке убывания их частот, второй элемент - соотвественно список сколько раз встретилась каждое слово. Подсчет идет по всему корпусу articles. При подсчете слов исключить из рассмотрения все числа, предлоги, артикли и пунктуацию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Интерфейс:&lt;br /&gt;
&lt;br /&gt;
   class TextStatistics:&lt;br /&gt;
      def __init___(self, articles):&lt;br /&gt;
         pass&lt;br /&gt;
&lt;br /&gt;
      def get_top_3grams(self, n):&lt;br /&gt;
         return (list_of_3grams_in_descending_order_by_freq, list_of_their_corresponding_freq)&lt;br /&gt;
&lt;br /&gt;
      def get_top_words(self, n):&lt;br /&gt;
         return (list_of_words_in_descending_order_by_freq, list_of_their_corresponding_freq)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Реализовать класс Experiment с методом show_results, который используя WikiParser и TextStatistics:&lt;br /&gt;
# Выполняет парсинг статей википедии для &amp;quot;Natural language processing&amp;quot;&lt;br /&gt;
# По полученному корпусу текстов считает топ-20 3-грамм и топ-20 слов.&lt;br /&gt;
# По статье &amp;quot;Natural language processing&amp;quot; (только по ней) считает топ-5 3-грамм и топ-5 слов.&lt;br /&gt;
# Печатает результаты эксперимента в структурированной форме&lt;br /&gt;
&lt;br /&gt;
4. В комментариях после класса Experiment привести результаты выполнения метода show_results.&lt;br /&gt;
&lt;br /&gt;
5. Результатом выполнения задания является код указанных классов и корректные результаты эксперимента&lt;br /&gt;
&lt;br /&gt;
== Assignment 3. ==&lt;br /&gt;
&lt;br /&gt;
Интерфейс&lt;br /&gt;
   class WikiParser:&lt;br /&gt;
      def __init__(self):&lt;br /&gt;
         pass&lt;br /&gt;
      def get_articles(self, start):&lt;br /&gt;
         return list_of_strings&lt;br /&gt;
&lt;br /&gt;
   class TextStatistics:&lt;br /&gt;
      def __init___(self, articles):&lt;br /&gt;
         pass&lt;br /&gt;
      def get_top_3grams(self, n, use_idf=False):&lt;br /&gt;
         return (list_of_3grams_in_descending_order_by_freq, list_of_their_corresponding_freq)&lt;br /&gt;
      def get_top_words(self, n, use_idf=False):&lt;br /&gt;
         return (list_of_words_in_descending_order_by_freq, list_of_their_corresponding_freq)&lt;br /&gt;
&lt;br /&gt;
Используя код из задания 2:  &lt;br /&gt;
# Изменить логику работы WikiParser.get_articles - оставить знаки пунктуации, которые разделяют предложения.  &lt;br /&gt;
# Изменить логику get_top_3grams - теперь под 3-граммами понимаются буквенные триграммы. Триграммы могут состоять из букв, цифр и не более 1 пробела подряд.  &lt;br /&gt;
# Добавить в метод get_top_words параметр use_idf, при выставлении которого частоты умножаются на коэффициент IDF и соотвественно сортируются. IDF = log(&amp;lt;общее кол-во статей в корпусе&amp;gt; / &amp;lt;кол-во статей, в которых встретилось данное слово&amp;gt;)  &lt;br /&gt;
# Добавить в метод get_top_3grams параметр use_idf, при выставлении которого частоты умножаются на коэффициент IDF и соотвественно сортируются. IDF = log (&amp;lt;общее кол-во предложений в корпусе&amp;gt; / &amp;lt;кол-во предложений, в которых встретилась данная триграмма&amp;gt;)  &lt;br /&gt;
# написать unit тесты к классу TextStatistics, которые проверяют соблюдение описанных условий и корректность подсчета частот. Тесты должны покрывать граничные условия и разные варианты (в разумных пределах) аргументов, передаваемые в методы.   &lt;br /&gt;
# выполнить эксперимент:  &lt;br /&gt;
 1 Выполнить парсинг статей википедии для &amp;quot;Natural language processing&amp;quot;&lt;br /&gt;
 2 По полученному корпусу текстов посчитать топ-20 3-грамм и топ-20 слов с use_idf=True.&lt;br /&gt;
 3 Печатает результаты эксперимента в структурированной форме&lt;br /&gt;
 4 В комментариях после класса Experiment привести результаты выполнения метода show_results.&lt;br /&gt;
 5 Результатом выполнения задания является код указанных классов в 1 файле *.py и корректные результаты эксперимента&lt;br /&gt;
&lt;br /&gt;
!! обратите внимание, что вы кладете 3 дз в новый каталог homework_3, не внося изменения в каталог homework_2&lt;br /&gt;
&lt;br /&gt;
!! обратите внимение, что теперь частоты - это действительные числа.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Assignment 4. == &lt;br /&gt;
&lt;br /&gt;
По материалам 4 семинара:  &lt;br /&gt;
# Модифицировать алгоритм Рабина-Карпа, чтобы он выполнял поиск нескольких паттернов в строке одновременно.  &lt;br /&gt;
# Дать асимптотическую верхнюю оценку сложности O() реализованного алгоритма в зависимости от параметров T (длина текста), P_1, P_2, ..., P_n (длины паттернов)  &lt;br /&gt;
# Написать юнит тесты к разработанному алгоритму  &lt;br /&gt;
# работу оформить в виде скрипта *.py&lt;br /&gt;
&lt;br /&gt;
Интерфейс:&lt;br /&gt;
&lt;br /&gt;
   def search_rabin_multi(text, patterns):&lt;br /&gt;
   &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   text - строка, в которой выполняется поиск&lt;br /&gt;
   patterns = [pattern_1, pattern_2, ..., pattern_n] - массив паттернов, которые нужно найти в строке text&lt;br /&gt;
   По аналогии с оригинальным алгоритмом, функция возвращает массив [indices_1, indices_2, ... indices_n]&lt;br /&gt;
   При этом indices_i - массив индексов [pos_1, pos_2, ... pos_n], с которых начинаетй pattern_i в строке text.&lt;br /&gt;
   Если pattern_i ни разу не встречается в строке text, ему соотвествует пустой массив, т.е. indices_i = []&lt;br /&gt;
   &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
      pass&lt;br /&gt;
&lt;br /&gt;
== Assignment 10. == &lt;br /&gt;
&lt;br /&gt;
По материалам 16 семинара провести исследование по тематическому моделированию и разработать рекомендательную систему. &lt;br /&gt;
# рекомендательная система обучается на корпусе текстов, в качестве корпуса текстов использовать 20 news groups из scikit-learn  &lt;br /&gt;
# пользователь предъявляет образец текста (не обязательно из обучающего корпуса) и просит показать k похожих по тематике текстов&lt;br /&gt;
# в качестве моделей для тематического моделирования рассмотреть NMF, LSA, LDA &lt;br /&gt;
# в качестве метрик topic coherence рассмотреть [https://www.insight-centre.org/sites/default/files/publications/15.010_eswa2014_final_submit.pdf TC-W2C], [http://svn.aksw.org/papers/2015/WSDM_Topic_Evaluation/public.pdf UCI, Umass] для топ-20 слов-дескрипторов тем&lt;br /&gt;
# для каждой тематической модели определить оптимальное кол-во тем, а затем сравнить сами модели с помощью метрик topic coherence&lt;br /&gt;
# при выборе оптимального кол-ва тем постройте проверяйте дескрипторы тем&lt;br /&gt;
# таким образом, для каждой метрики вы получите свою оптимальную модель. Сравните дескрипторы тем у этих моделей, и выберите  &lt;br /&gt;
# таким образом, вы получите тематическое представление для каждого документа. Выберите функцию расстояния между документами, посмотрите sklearn.metrics&lt;br /&gt;
# при поиске ближайших соседей используйте sklearn.neighbors&lt;br /&gt;
# работу оформить в виде ноутбука *.ipynb&lt;br /&gt;
# продемонстрируйте работу вашей рекомендательной системы на текстах из обучающего корпуса и текстах из bbc news за 2017 год &lt;br /&gt;
&lt;br /&gt;
Интерфейс рекомендательной ситемы:&lt;br /&gt;
&lt;br /&gt;
   class NewsRecommender:&lt;br /&gt;
      &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
      обучить систему на корпусе текстов  с помощью тематической модели и метрики, выбранных в результате исследования&lt;br /&gt;
      &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
      def train(self, texts):&lt;br /&gt;
         pass&lt;br /&gt;
      &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
      выдать k самых пожих новостей для заданного заголовка по функции расстояния, выбранной в результате исследования&lt;br /&gt;
      обратите внимание, что text_sample может содержать слова не из обучающего корпуса&lt;br /&gt;
      &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
      def recommend(self, text_sample, k):&lt;br /&gt;
         return [&amp;quot;news_1&amp;quot;, &amp;quot;news_2&amp;quot;, ... , &amp;quot;news_k&amp;quot;]&lt;/div&gt;</summary>
		<author><name>imported&gt;Denaas</name></author>
	</entry>
</feed>