<jupyter_start><jupyter_text>2) На основе второй тетрадки  - https://github.com/mannefedov/compling_nlp_hse_course/blob/master/notebooks/deep_pavlov_ner.ipynbОбучите Few-shot нейросеть на небольшом размеченном куске данных. Пример того, как должны быть размечены данные вы найдете вот тут – https://github.com/mannefedov/compling_nlp_hse_course/tree/master/data/few_shotРазметьте как минимум 10 разных предложений для train.txt Предложения в valid.txt и test.txt должны быть разными и не пересекаться с train.txtПроанализируйте результаты для каждого из методов (приводите конкретные примеры, не ссылайтесь на вывод ячеек с кодом – дублируйте нужное текстом в отдельной ячейке, старайтесь не утверждать очевидного – ищите что-нибудь интересное)  Обучение модели<jupyter_code>#!pip install deeppavlov
#!pip install tensorflow==1.15.0
#!apt-get --yes install git
#!pip install git+https://github.com/deepmipt/bert.git@feat/multi_gpu
import pandas as pd
import json
from google.colab import drive
drive.mount('/content/drive')
from deeppavlov import configs, build_model, train_model
with configs.ner.ner_ontonotes_bert_mult.open(encoding='utf8') as file:
    ner_config = json.load(file)
pwd
cd drive/My Drive/colab_data<jupyter_output>/content/drive/My Drive/colab_data<jupyter_text>Файлы для обучения, валидации и тестирования в формате IOB. B маркирует начало сущности, а I продолжение. O - обозначает несущность. Текст в файле по всей видимости в некоторых случаях играет роль комментариев к фотографиям.<jupyter_code>data = pd.read_csv('pristavki.csv', header=None, names=['text'])
ner_config['dataset_reader']['data_path'] = './'  # directory with train.txt, valid.txt and test.txt files
ner_config['metadata']['variables']['NER_PATH'] = './'
ner_config['metadata']['download'] = [ner_config['metadata']['download'][-1]]  # do not download the pretrained ontonotes model
ner_model = train_model(ner_config, download=True)<jupyter_output>2020-01-18 14:14:49.212 INFO in 'deeppavlov.core.data.utils'['utils'] at line 80: Downloading from http://files.deeppavlov.ai/deeppavlov_data/bert/multi_cased_L-12_H-768_A-12.zip to /root/.deeppavlov/downloads/multi_cased_L-12_H-768_A-12.zip
100%|██████████| 663M/663M [02:36<00:00, 4.23MB/s]
2020-01-18 14:17:25.881 INFO in 'deeppavlov.core.data.utils'['utils'] at line 237: Extracting /root/.deeppavlov/downloads/multi_cased_L-12_H-768_A-12.zip archive into /root/.deeppavlov/downloads/bert_models
2020-01-18 14:17:35.382 WARNING in 'deeppavlov.dataset_readers.conll2003_reader'['conll2003_reader'] at line 96: Skip 'WOLFCSTEIN:B-GAME\n', splitted as ['WOLFCSTEIN:B-GAME']
2020-01-18 14:17:35.391 INFO in 'deeppavlov.core.trainers.fit_trainer'['fit_trainer'] at line 68: NNTrainer got additional init parameters ['pytest_max_batches', 'pytest_batch_size'] that will be ignored:<jupyter_text>Размеченные данные, использованные для обучения:* [test.txt](https://raw.githubusercontent.com/slowwavesleep/Compling_M1_HSE/master/HW4/test.txt)* [train.txt](https://raw.githubusercontent.com/slowwavesleep/Compling_M1_HSE/master/HW4/train.txt)* [valid.txt](https://raw.githubusercontent.com/slowwavesleep/Compling_M1_HSE/master/HW4/valid.txt)<jupyter_code>marked = []

for text in data.text.values[:1000]:
    if len(text.split()) > 100:
        continue
    pred = ner_model([text])
    sent, tags = pred[0][0], pred[1][0]
    
    if len(set(tags[0])) > 1:
        marked.append(list(zip(sent,tags)))
marked[45:47]<jupyter_output><empty_output><jupyter_text>Анализ и сравнение результатов работы двух методов На мой взгляд, использование подхода, основанного на правилах, целесообразно, когда требуется выделять из текстов сравнительно узкий круг сущностей, например те же приставки. Для них сравнительно просто написать правила и учесть возможные ошибки. Игр же, в свою очередь, в сотни раз больше. Придумать универсальные правила, которые бы покрывали все франшизы у меня получилось. Например, использование правила, выбирающего слова, написанные латиницей, ухудшило результат, т.к. начало выбираться просто всё подряд. Думаю, дополнительно приводить примеры работы правилового подхода не имеет смысла, т.к. они, очевидно, определили только то, что я явным образом задал в правилах. Можно сказать, что данный подход даёт большую *точность*.  Использованная в данном ноутбуке модель, умеет выделять не только те сущности, которые не были заданы явным образом, но и те, которые были написаны с ошибкой или даже в транслитерации (!). Данный подход даёт большую *полноту*. Рассмотрим примеры ниже. Не определилась третья игра. Думаю, связано с тем, что у неё в названии перемешаны русские и английские слова. Ведь обычно между ними есть четкая граница (лево|право), например, Название: Some Edition или Game: Сиквел.``` [('Battlefield', 'B-GAME'),  ('4', 'I-GAME'),  (',', 'O'),  ('Granturismo', 'B-GAME'),  ('3', 'I-GAME'),  ('и', 'O'),  ('Звезды', 'O'),  ('Playstation', 'O'),  ('Битва', 'O'),  ('сильнейших', 'O'),  ('.', 'O'),  ('За', 'O'),  ('все', 'O'),  ('1500', 'O'),  ('руб', 'O'),  ('.', 'O')]  ...``` Антивирус определилися как игра. Легко объясняется тем, что софт в имеющихся данных находится в абсолютно тех же позициях (с дистрибутивной точки зрения), что и игры. Действительно, без учёта значения это очень сложно (или невозможно) определить.``` ... [('Kaspersky', 'B-GAME'),  не игра вовсе  ('Anti', 'I-GAME'),  ('-', 'O'),  ('Virus', 'O'),  ('–', 'O'),  ('это', 'O'),  ('решение', 'O'),  ('для', 'O'),  ('базовой', 'O'),  ('защиты', 'O'),  ('компьютера', 'O'),  ('от', 'O'),  ('основных', 'O'),  ('видов', 'O'),  ('интернет', 'O'),  ('-', 'O'),  ('угроз', 'O'),  (',', 'O'),  ('не', 'O'),  ('снижающее', 'O'),  ...``` Выявление сущностей, написанных с ошибками:``` ... [('Assassins', 'B-GAME'),  ('creed', 'I-GAME'),  ('unity', 'I-GAME'),  ('-', 'O'),  ('800', 'O'),  ('₽', 'O'),  ('/', 'O'),  ('\n', 'O'),  ('Bloodborn', 'B-GAME'),  неправильное написание  ('-', 'O'),  ('800', 'O'),  ('₽', 'O'),  ('/', 'O'),  ('\n', 'O'),  ('Watch', 'B-GAME'),  ('dogs', 'I-GAME'),  ('-', 'O'),  ('800', 'O'),  ('₽', 'O'),  ('/', 'O'),  ('\n', 'O'),  ('Wolfenstein', 'B-GAME'),  ('-', 'O'),  ('800', 'O'),  ('₽', 'O'),  ('/', 'O'),  ('\n', 'O'),  ('MGS', 'B-GAME'),  ('5', 'I-GAME'),  ('-', 'O'),  ('1500', 'O'),  ('₽', 'O'),  ('/', 'O'),  ('\n', 'O'),  ('The', 'B-GAME'),  ('last', 'I-GAME'),  ('of', 'I-GAME'),  ('us', 'I-GAME'),  ('-', 'O'),  ('1500', 'O'),  ('₽', 'O')]  ...  ...  ('Grand', 'B-GAME'),  неправильное написание  ('turismo', 'I-GAME'),  ('6', 'I-GAME')  ...``` "Зацепляется" символ новой строки, расположенный рядом названием. Можно объяснить тем, что во многих объявлениях названия расположенны именно в столбик (и разделены как раз этим символом). Также определяет какие-то загадочные вещи, которые, судя по контексту, действительно являются играми.```...[('COLLAPSE', 'B-GAME'),  неизвестно что это вообще  (',', 'O'),  ('WARCRAFT', 'B-GAME'),  (',', 'O'),  ('STALKER', 'B-GAME'),  ('(', 'O'),  ('ИСТОРИЯ', 'O'),  ??? но видимо тоже игра  ('ПРИБОЯ', 'O'),  (')', 'O'),  (',', 'O'),  ('WARRIOR', 'B-GAME'),  (',', 'O'),  ('/', 'O'),  ('\n', 'B-GAME'),  ('MАФИЯ', 'O'),  (',', 'O'),  ('ALONE', 'B-GAME'),  ('DARK', 'I-GAME'),  (',', 'O'),  ('MERCENARIES2', 'B-GAME'),  (',', 'O'),  ('SNIPER', 'B-GAME'),  (',', 'O'),  ('ТАМПЛИЕРЫ', 'B-GAME'),  ('2', 'I-GAME'),  (',', 'O'),  ('/', 'O'),  ('\n', 'B-GAME'),  ('КВЕЙК4', 'O'),  (',', 'O'),  ('DEWIL', 'B-GAME'),  опять же неправильное написание  ('MAY', 'I-GAME'),  ('CRY', 'I-GAME'),  (',', 'O'),  ('WORMS4', 'B-GAME'),  (',', 'O'),  ('HOSPITAL', 'B-GAME'),  ('TYCOON', 'I-GAME'),  (',', 'O'),  ('/', 'O'),  ('\n', 'O'),  ('FLASHPOINT', 'B-GAME'),  ('/', 'O'),  ...``` Удивительным образом определяет транслитерированное название. Тут у меня нет объяснения.``` ...[('Анчартед', 'B-GAME'),  ('4', 'I-GAME'),  ('-', 'O'),  ('2000', 'O'),  ('/', 'O'),  ('\n', 'O'),  ('анчартид', 'O'),  ('коллекция', 'O'),  ('-', 'O'),  ('1500', 'O')]  ...``` Переводные названия оказывается не под силу, что странно, учитывая, что они имеют ровно ту же дистрибуцию, что и оригинальные названия. Можно также заметить, что символ переноса строки "зацепляется" далеко не всегда. Здесь опять же сложно найти объяснение.``` ... ('Heavy', 'B-GAME'), ('rain', 'I-GAME'), ('-', 'O'), ('600', 'O'), ('р', 'O'), ('/', 'O'), ('\n', 'O'), ('Uncharted', 'B-GAME'), ('3', 'I-GAME'), ('-', 'O'), ('900', 'O'), ('р', 'O'), ('/', 'O'), ('\n', 'O'), ('За', 'O'), ('гранью', 'O'), ('-', 'O'), ('600', 'O'), ('р', 'O'), ('/', 'O'), ('\n', 'O'), ('Одни', 'O'), ('из', 'O'), ('нас', 'O'), ('-', 'O'), ('900', 'O'), ('р', 'O'), ('/', 'O'), ('\n', 'O'), ('Gta', 'B-GAME'), ('4', 'I-GAME'), ...```<jupyter_code><jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.23552389705882354, 'fraction_numerical': 0.024471507352941176, 'mean_word_length': 4.995179063360881, 'pattern_counts': {'":': 0, '<': 16, '<?xml version=': 0, '>': 17, 'https://': 6, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 8, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '523683', 'license': 'MIT', 'n_tokens_mistral': 3867, 'n_tokens_neox': 4046, 'n_words': 859, 'path': 'HW4/part2.ipynb', 'repo_name': 'slowwavesleep/Compling_M1_HSE', 'size': '8704'}