Skip to content

Commit 497dfc6

Browse files
committed
Init.
0 parents  commit 497dfc6

28 files changed

+534
-0
lines changed

README.md

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Курс ИТМО по автоматической обработке естественного языка (2023)
2+
3+
Репозиторий содержит файлы, используемые для реализации курса по Автоматической обработки текстов в ИТМО.
4+
5+
## Лекции
6+
7+
Лекции и вспомогательные материалы приведены в директории [lectures](/lectures).
8+
9+
## Задания к лабораторным работам
10+
11+
Ресурсы для выполнения лабораторных работ расположены в директории [tasks](/tasks), каждой лабораторной работе соответствует отдельный каталог. Общие указания к выполнению лабораторных работ приведены в файле `README.md`, расположенном в директории [tasks](/tasks). Инструкции к выполнению отдельных лабораторных работ приведены в файлах `README.md`, расположенных в директориях `/tasks/task-<TASK_NUMBER>`, где `<TASK_NUMBER>` - номер соответствующей лабораторной работы:
12+
13+
- [Сегментация и аннотация текста](/tasks/task-01/README.md)
14+
- [N-grams](/tasks/task-02/README.md)
15+
- [Векторизация текста](/tasks/task-03/README.md)
16+
- [Классификация текстов](/tasks/task-04.1/README.md) или [Тематическое моделирование](/tasks/task-04.2/README.md)
17+
- [Распознавание и синтез речи](/tasks/task-05/README.md)
18+
19+
20+
## Результаты выполнения лабораторных работ
21+
22+
Результаты выполнения лабораторных работ оформляются в виде проектов и размещаются в отдельных директориях внутри каталога [projects](/projects) (также см. [указания по выполнению лабораторных работ](/tasks/README.md)). В качестве названия директории испоьзуется название соответствующего проекта, которое необходимо указывать в соответствии с конвенцией `kebab-case`. Соответствие между названием проекта и ФИО студента задается в следующей таблице:
23+
24+
| Project name | Student name |
25+
| --- | --- |
26+
| [emoji-labeller](/projects/emoji-labeller) | Иванов Иван Иванович |
27+

lectures/README.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Лекции
2+
3+
[Папка с лекциями на drive.google](https://drive.google.com/drive/u/0/folders/1xxKTvCYbfR6rAA7fq232bOB6n4T1HpTP).

projects/README.md

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Директория с проектами студентов
2+
3+
Данная директория содержит результаты выполнения лабораторных работ студентами. Каждый каталог содержит результаты прохождения курса конкретным студентом, внутренняя структура каталогов унифицирована и выглядит следующим образом:
4+
5+
```sh
6+
.
7+
├── assets
8+
├── README.md
9+
└── source
10+
11+
2 directories, 1 file
12+
```
13+
14+
Так, назначение приведенных файлов и директорий следующее:
15+
1. директория `assets` содержит вспомогательные и конфигурационные файлы проекта (не являющиеся исходным кодом), в том числе - результаты обработки исходных датасетов. **Сами исходные датасеты загружать не нужно**. Внутренняя структура файлов и каталогов в данной директории не регламентируется, за исключением уточнений в инструкции по выполнению той или иной лабораторной работы. При создании файлов и каталогов рекомендуется следовать конвенции **kebab-case**, поддерживаемой в данном репозитории;
16+
1. файл `README.md` содержит общее описание проекта, инструкцию по запуску программных модулей и тестов для них. Рекомендуется соблюдать структуру, приведенную в [примере оформления проекта](/projects/emoji-labeller/README.md);
17+
1. директория `source` содержит файлы с исходным кодом проекта. Внутренняя структура файлов и каталогов в данной директории зависит от правил наименования и организации файлов при разработке систем с использованием той или иной программной платформы, фреймворка и экосистемы. Для языка программирования `python` необходимо соблюдать структуру, реализованную в [примере проекта](/projects/emoji-labeller).
18+
19+
Пример полной структуры файлов и каталогов проекта:
20+
21+
```sh
22+
.
23+
├── assets
24+
│   ├── emoji-to-label.yml
25+
│   └── environment.yml
26+
├── README.md
27+
└── source
28+
├── classifier
29+
│   ├── __init__.py
30+
│   ├── __main__.py
31+
│   ├── reader.py
32+
│   └── tokenizer.py
33+
├── __init__.py
34+
└── tests
35+
├── __init__.py
36+
├── test_classification.py
37+
└── test_tokenization.py
38+
39+
4 directories, 11 files
40+
```

projects/emoji-labeller/README.md

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Emoji labeller
2+
3+
Данный проект предназначен для демонстрации структуры директорий и организации исходного кода в целом. Подобную структуру необходимо поддерживать при выполнении лабораторных работ.
4+
5+
Проект состоит из модуля `classifier`, в котором:
6+
1. файл `__main__.py` содержит реализацию интерфейса командной строки;
7+
2. файл`reader.py` - реализацию функциональности по считыванию данных об отображении `emoji` на метки текста;
8+
3. файл `tokenizer.py` - реализацию функциональности по разбиению текста на токены по пробельным символам, сегментации текста на предложения не предусмотрено.
9+
10+
## Настройка окружения
11+
12+
Для создания окружения и установки зависимостей требуется выполнить следующую команду из корневой директории проекта (должна быть установлена `anaconda`):
13+
14+
```sh
15+
conda env create -f assets/environment.yml; conda activate emoji-labeller
16+
```
17+
18+
## Запуск проекта
19+
20+
В данном проекте реализована возможность определения метод для произвольного текста по `emoji`, упоминаемым в нем.
21+
22+
### Определение меток для текста
23+
24+
С целью определения меток для произвольного текста требуется выполнить следующую команду из корневой директории проекта:
25+
26+
```sh
27+
PYTHONPATH=source python -m classifier label "люблю 🌩 в начале мая"
28+
```
29+
30+
Система отображает сообщение, содержащее список тем, затрагиваемых в тексте:
31+
32+
```sh
33+
Provided text mentions weather
34+
```
35+
36+
## Запуск тестов
37+
38+
Для системы разработан набор модульных тестов, позволяющих оценить корректность генерируемых результатов. Для запуска тестов используется следующая команда, которую необходимо выполнять из коревой директории проекта:
39+
40+
```sh
41+
PYTHONPATH=source python -m unittest
42+
```
43+
44+
Система отображает стандартный отчет о результатах выполненя тестов:
45+
46+
```sh
47+
.......
48+
----------------------------------------------------------------------
49+
Ran 7 tests in 0.002s
50+
51+
OK
52+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
😊: positive-attitude
2+
🐦: birds
3+
🌩: weather
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
name: emoji-labeller
2+
channels:
3+
- defaults
4+
dependencies:
5+
- _libgcc_mutex=0.1=main
6+
- _openmp_mutex=4.5=1_gnu
7+
- ca-certificates=2021.10.26=h06a4308_2
8+
- certifi=2021.10.8=py39h06a4308_2
9+
- click=8.0.3=pyhd3eb1b0_0
10+
- ld_impl_linux-64=2.35.1=h7274673_9
11+
- libffi=3.3=he6710b0_2
12+
- libgcc-ng=9.3.0=h5101ec6_17
13+
- libgomp=9.3.0=h5101ec6_17
14+
- libstdcxx-ng=9.3.0=hd4cf53a_17
15+
- ncurses=6.3=h7f8727e_2
16+
- openssl=1.1.1m=h7f8727e_0
17+
- pip=21.2.4=py39h06a4308_0
18+
- python=3.9.7=h12debd9_1
19+
- pyyaml=6.0=py39h7f8727e_1
20+
- readline=8.1.2=h7f8727e_1
21+
- setuptools=58.0.4=py39h06a4308_0
22+
- sqlite=3.37.0=hc218d9a_0
23+
- tk=8.6.11=h1ccaba5_0
24+
- tzdata=2021e=hda174b7_0
25+
- wheel=0.37.1=pyhd3eb1b0_0
26+
- xz=5.2.5=h7b6447c_0
27+
- yaml=0.2.5=h7b6447c_0
28+
- zlib=1.2.11=h7f8727e_4

projects/emoji-labeller/source/__init__.py

Whitespace-only changes.

projects/emoji-labeller/source/classifier/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from yaml import safe_load
2+
from .tokenizer import tokenize
3+
4+
class EmojiBasedClassifier:
5+
def __init__(self, mapping: dict):
6+
self.mapping = mapping
7+
8+
def _classify(self, text: str):
9+
for token in tokenize(text):
10+
if (label := self.mapping.get(token)) is not None:
11+
yield label
12+
13+
def classify(self, text: str):
14+
return tuple(self._classify(text))
15+
16+
def read_emoji_to_label_mapping(path):
17+
with open(path) as file:
18+
return EmojiBasedClassifier(safe_load(file))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import re
2+
3+
space_regexp = re.compile("\s+")
4+
5+
def tokenize(text: str):
6+
return tuple(filter(lambda token: len(token) > 0, space_regexp.split(text)))

projects/emoji-labeller/source/tests/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import unittest
2+
3+
from classifier.tokenizer import tokenize
4+
5+
class TestTokenization(unittest.TestCase):
6+
def test_on_empty_string(self):
7+
self.assertEqual(len(tokenize("")), 0)
8+
9+
def test_on_spaces(self):
10+
self.assertEqual(tokenize("foo bar"), ("foo", "bar"))
11+
12+
def test_on_empty_string_with_spaces(self):
13+
self.assertEqual(len(tokenize(" ")), 0)
14+
15+
def test_on_tabs_and_newlines(self):
16+
self.assertEqual(tokenize("foo\tbar\nbaz qux\t\t\t\nquux"), ("foo", "bar", "baz", "qux", "quux"))
17+
18+
if __name__ == "__main__":
19+
unittest.main()

0 commit comments

Comments
 (0)