Для обучения автоэнкодеров достаточно собрать по большому корпусу текстов слова, отсеять редкие (опечатки), и работать с ними. Можно спорить, является ли автоэнкодер чисто unsupervised моделью, но данные для него получаются без ручного труда.
Остальные модели требуют списков слов с леммами, эталонную классификацию слов по частям речи или эталонные списки грамматических тегов для слов.
Я получаю необходимые датасеты из своего SQL Словаря русского языка (
http://solarix.ru/sql-dictionary-sdk.shtml). Почти 300 тысяч словарных статей, 3.5 миллиона словоформ в этой словарной базе содержат разнообразную грамматическую информацию с ручной выверкой. Загрузив словарную базу в MS SQL (достаточно бесплатной express-версии, так как размер базы намного меньше 10 Гб), или в другую СУБД, можно обычными SQL запросами получать необходимые паттерны. Я обычно делаю запросы в SQL Server Management Studio и сохраняю результаты прямо оттуда в текстовые файлы с табуляцией в качестве разделителя.
Например, запрос
select distinct F.name, E.name, C.name
from sg_form F
join sg_entry E on E.id=F.id_entry and E.flags=0
join sg_class C on C.id=E.id_class
join sg_language L on L.id=C.id_lang and L.name='russian'
выведет более 2.4 миллионов пар слово-лемма с дополнительной привязкой к части речи:
Датасет для классификации слов по частям речи:
select distinct F.name, C.name
from sg_form F
join sg_entry E on E.id=F.id_entry and E.flags=0
join sg_class C on C.id=E.id_class
join sg_language L on L.id=C.id_lang and L.name='russian'
Он генерирует датасет с 2.4 миллионами пар:
Чтобы получить датасет, в котором для каждого слова будет задан эталонный список грамматических тегов, необходимо два компонента. Во-первых, нужна скалярная функция:
CREATE FUNCTION [dbo].[GetFormCoords]
(
@IdEntry INT,
@IdForm INT
)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @result VARCHAR(1000)
DECLARE C CURSOR LOCAL FAST_FORWARD FOR
select C.name, S.name
from sg_entry E, sg_entry_coord EC, sg_coord C, sg_state S
where E.id=@IdEntry
and EC.id_entry=E.id
and C.id=EC.icoord
and S.id_coord=C.id
and S.id=EC.istate
and C.name NOT IN ( 'CHARCASING', 'OMONYM_RESOLUTION' )
union
select C.name, S.name
from sg_form F, sg_entry E, sg_form_coord FC, sg_coord C, sg_state S
where F.iform=@IdForm
and E.id=@IdEntry
and FC.id_entry=E.id
and FC.iform=F.iform
and C.id=FC.icoord
and S.id_coord=C.id
and S.id=FC.istate
and C.name NOT IN ( 'CHARCASING', 'OMONYM_RESOLUTION' );
SET @result = ''
OPEN C
DECLARE @coord_name varchar(30)
DECLARE @state_name varchar(30)
FETCH C INTO @coord_name, @state_name
WHILE @@FETCH_STATUS=0 BEGIN
SET @result = @result + ' ' + @coord_name + ':' + @state_name
FETCH C INTO @coord_name, @state_name
END
CLOSE C
DEALLOCATE C
RETURN LTRIM(@result)
END
Во-вторых, сам запрос, который генерирует датасет:
select distinct F.name, C.name, dbo.GetFormCoords(E.ID,F.IFORM)
from sg_form F
join sg_entry E on E.id=F.id_entry and E.flags=0
join sg_class C on C.id=E.id_class
join sg_language L on L.id=C.id_lang and L.name='russian'
join coord_pairs P on P.id=F.id_dims
Результат его работы:
В третьем столбце присутствует цепочка токенов разной длины, которая отлично подходит для рекуррентных сетевых моделей.