Практическое задание №3
1. Решение задачи NER (Named Entity Recognition) – выделения непрерывных сущностей в тексте. Запустите jupyter notebook, создайте тетрадку и импортируйте модули аналогичные практическому заданию №1. Сущностями в задании послужат имена людей, наименование организаций и местоположения. Иными словами алгоритм должен понять, что участок текста “Нью Джерси” является местоположением, “Кофи Аннан” – персоной, а “ООН” – организацией.
2. Получите данные по ссылке: https://github.com/EuropeanaNewspapers/ner-corpora
Пример получения данных с помощью библиотеки urllib:
urllib.request.urlretrieve("https://raw.githubusercontent.com/EuropeanaNewspapers/ner-corpora/master/enp_FR.bnf.bio/enp_FR.bnf.bio", "enp_FR.bnf.bio")
with open("enp_FR.bnf.bio") as f:
3. Разбейте слова и их тип при помощи метода split по символам переноса на новую строку '\n':
words = []
types = []
for item in text.split('\n'):
item = item.strip()
if len(item) == 0:
continue
[w, t] = item.split(' ')
words.append(w)
types.append(t)
4. Выделите уникальные типы используя и пронумеруйте их для идентификации:
unique_types = list(set(types))
type2id = {x:index for index, x in enumerate(unique_types)}
5. Подготовьте данные для обучения:
a. Подсчитайте количество наиболее встречающихся слов
from collections import Counter
top_words = [x[0] for x in sorted(word2count.items(), key=lambda x: x[1], reverse=True)][:MAX_WORD_COUNT]
word2id = {x:index+1 for index, x in enumerate(top_words)}
b. Разбейте полученный набор данных на тренировочный и тестовый наборы
train_dataset, test_dataset = train_test_split(list(zip(words, types)), train_size=0.7)
c. Напишите функции нахождения id слова
return 0 if not w in word2id else word2id[w]
d. Реализуйте функцию gen_batches(dataset, batch_size=64, seq_size=32, batch_count=100):
e. Закодируйте полученные предложения
result = np.zeros((len(words),))
6. Импортируйте модуль для демонстрации процесса обучения TensorBoard и фрэймворк tensorflow. Реализуйте функцию по созданию логов.
def write_log(callback, names, logs, batch_no):
for name, value in zip(names, logs):
summary_value = summary.value.add()
summary_value.simple_value = value
callback.writer.add_summary(summary, batch_no)
callback = TensorBoard(logs_dir)
7. Инициируйте процесс обучения нейронной сети.
a. Реализуйте код для вычисления тренировочного loss:
Создайте пустой массив и итеративно добавляйте полученные значения методом train_on_batch
for x,y in gen_batches(train_dataset, batch_count=32):
loss = model.train_on_batch(x, y)
b. Задайте параметры для генерации батчей и записывайте полученные результаты:
for x,y in gen_batches(test_dataset, batch_count=32):
loss = model.test_on_batch(x, y)
write_log(callback, ['train', 'test'], [train_loss, test_loss], epoch)
8. Протестируйте получившуюся модель:
query_words = [x[0] for x in query]
query_types = [x[1] for x in query]
result = model.predict_on_batch(encode_text(" ".join(query_words)).reshape((1, -1)))[0]
for index in range(result.shape[0]):
true_type = query_types[index]
pred_type = unique_types[np.argmax(result[index,:])]
print("{}:\t{}\t{}".format(w, pred_type, true_type))
1. Задачи для самостоятельной работы:
a. Увеличить точность полученной модели. Для этого, воспользуйтесь продвинутыми техниками и нахождением подходящих гиперпараметров: таких как изменение размера последовательности, количества слоев сети.
b. Реализуйте модель со слоем CRF(https://github.com/Hironsan/keras-crf-layer)