Как да стартирате обобщаване на текст с TensorFlow

Проблемът с обобщаването на текста има много полезни приложения. Ако имате уебсайт, можете да създадете заглавия и кратки резюмета за генерирано от потребители съдържание. Ако искате да прочетете много статии и нямате време за това, вашият виртуален асистент може да обобщи основните точки от тези статии за вас.

Не е лесен проблем за решаване. Има множество подходи, включително различни контролирани и неподдържани алгоритми. Някои алгоритми класифицират важността на изреченията в текста и след това изграждат обобщение от важни изречения, други са генеративни модели от край до край.

Интересно е да се опитат алгоритмите за машинно обучение от край до край. В крайна сметка алгоритмите от край до край демонстрират добри резултати в други области, като разпознаване на изображения, разпознаване на реч, превод на език и дори отговаряне на въпроси.

Кредит за изображение: https://research.googleblog.com/2015/11/computer- reply-to-this-email.html

Обобщение на текста с TensorFlow

През август 2016 г. Питър Лиу и Син Пан, софтуерни инженери в Google Brain Team, публикуват публикация в блога „Обобщаване на текста с TensorFlow“. Алгоритъмът им е извличане на интересни части от текста и създаване на обобщение, като се използват тези части на текста, и позволяват на префразирането да направи обобщението по-граматично правилно. Този подход се нарича абстрактно обобщение.

Петър и Син обучиха модел за обобщаване на текст, за да създадат заглавия за новинарски статии, използвайки Annotated English Gigaword, набор от данни, често използван при обобщаването на изследванията. Наборът от данни съдържа около 10 милиона документи. Моделът е обучен от край до край с дълбока учебна техника, наречена обучение от последователност към последователност.

Код за обучение и тестване на модела е включен в хранилището на TensorFlow Models GitHub. Основният модел е модел от последователност към последователност с внимание. Когато тренирате, моделът използва първите две изречения от статията като вход и генерира заглавие.

При декодиране алгоритъмът използва търсене на лъч, за да намери най-доброто заглавие от заглавията на кандидатите, генерирани от модела.

GitHub хранилището не включва обучен модел. Наборът от данни не е публично достъпен, лицензът струва 6000 долара за организации, които не са членове на консорциума за лингвистични данни. Но те включват набор от данни за играчки, който е достатъчен за стартиране на кода.

Как да тичам

Ще ви трябват TensorFlow и Bazel като предпоставки за обучение на модела.

Наборът от данни за играчки, включен в хранилището, съдържа два файла в директорията „data“: „data“ и „vocab“. Първият съдържа последователност от сериализирани tensorflow.core.example.example_pb2.Example обекти. Пример за код за създаване на файл с този формат:

„Vocab“ файл е текстов файл с честотата на думите в речника. Всеки ред съдържа дума, интервал и брой събития на тази дума в набора от данни. Списъкът се използва за векторизиране на текстове.

Изпълнението на кода на базата данни за играчки е наистина просто. Readme на GitHub repo изброява поредица от команди за изпълнение на код за обучение и тестване.

Можете да стартирате TensorBoard, за да следите процеса на обучение:

Когато стартирате код за „декодиране“, имайте предвид, че той ще прекъсне целия набор от данни за неопределено време, така че в определен момент ще трябва да спрете изпълнението ръчно. Можете да намерите резултати от декодирането в папката log_root / decode. Той ще съдържа няколко файла, някои от тях имат префикс „ref“, съдържат оригинални заглавия от тестовия набор. Други файлове имат префикс „декодиране“, съдържат заглавия, генерирани от модела.

Отстраняване на проблеми

Можете да срещнете грешка, когато стартирате код „eval“ или „decode“, използвайки TensorFlow 0.10 или по-нова версия:

„ValueError: Речникът не може да се изравнява. Ключът имаше 2 елемента, но стойността имаше 1 елемент. “

В GitHub има отворен проблем за тази грешка. Едно решение е да понижа TensorFlow до 0,9, работи ми. Друго решение изисква промяна на кода на модела: добавяне на „state_is_tuple = False“ към данни на LSTMCell в seq2seq_attention_model.py.

Ако пуснете обучение и декодиране на базата данни на играчките, ще забележите, че декодирането поражда глупости. Ето няколко примера за генерирани заглавия:

до .
на от .
в в .

Една от причините за лошото представяне на набора от играчки може да бъде непълнотата на речника. Файлът на речника е съкратен и не съдържа много от думите, които се използват във файла с данни. Това води до твърде много "<>" Вуйчо жетони, които представляват непознати думи.

Как да стартирате върху друг набор от данни

Набор от данни за играчки е, добре, играчка. За да създадете полезен модел, трябва да го обучите на голям набор от данни. В идеалния случай наборът от данни трябва да е специфичен за вашата задача. Обобщаващата статия за новини може да се различава от обобщаването на юридически документи или длъжностни характеристики.

Тъй като нямам достъп до набора от данни на GigaWord, се опитах да обуча модела на по-малки набори от новинарски статии, които са безплатни: CNN и DailyMail. Намерих кода за изтегляне на тези набори от данни в DeepMind / rcdata GitHub repo и леко го модифицирах, за да добавя заглавието на статията в първия ред на всеки изходен файл. Вижте модифициран код тук.

92570 статии в база данни на CNN и 219503 статии в набора от данни на Daily Mail. Може да са още няколко статии, но кодът от DeepMind repo не може да изтегли всички URL адреси. 322k статии са по-малко от 10 милиона статии в GigaWord, така че бих очаквал по-ниска производителност на модела, ако тренирам на тези набори от данни.

След като стартирате кода за изтегляне на набора от данни, ще имате папка с много файлове, по един HTML файл за всяка статия. За да го използвате в модел TextSum, ще трябва да го преобразувате в описания по-горе двоичен формат. Можете да намерите моя код за конвертиране на статии за CNN / DailyMail в двоичен формат в textum_data_convert.py файл в репото ми „TextSum“ на GitHub. Пример за стартиране на кода за данни от CNN:

След това можете да копирате влакови / валидиращи / тестови набори и файлове с речник в директорията с данни и да започнете да тренирате модела:

Обучението с параметри по подразбиране не върви много добре. Ето графика на running_avg_loss:

Резултатите за декодиране също са разочароващи:

"Вашата своя "
"Ние ще на <Вуйчо>"
"Сняг хит хит хит "

Или наборът от данни е твърде малък, или хиперпараметрите трябва да бъдат променени за този набор от данни.

Когато стартирах кода, установих, че тренировъчният код не използва графичен процесор, въпреки че имам цялата правилна конфигурация: GeForce 980Ti, CUDA, CuDNN, TensorFlow, компилиран с използване на графичен процесор. Докато тренира, python.exe изразходва 100-300 +% процесор и се появява в списъка на процесите, когато работи nvidia-smi, но използването на GPU остава 0%.

Предполагам, че това може да бъде свързано с факта, че авторите на модела пускаха кода, използвайки няколко графични процесора, а един GPU имаше някаква специална цел. Фрагмент от seq2seq_attention_model.py файл:

Кодът за декодиране използва GPU доста добре. Той консумира почти всички 6Gb GPU памет и поддържа използваемостта над 50%.

заключение

Използвайки кода от тази статия, можете лесно да стартирате модела за обобщаване на текста във вашия собствен набор от данни. Кажете ми, ако намерите нещо интересно!

Ако случайно имате лиценз за набора от данни на GigaWord, ще се радвам, ако споделите с мен обучен модел TensorFlow. Бих искал да го опитам върху някои собствени данни, а не от новинарски статии.

Използвате ли други алгоритми за обобщаване на текст? Какво работи най-добре?

Статията първоначално е публикувана на http://pavel.surmenok.com/2016/10/15/how-to-run-text-summarization-with-tensorflow/

Hacker Noon е как хакерите започват следобедите си. Ние сме част от семейството на @AMI Сега приемаме заявления и се радваме да обсъдим възможностите за реклама и спонсорство.
Ако ви е харесала тази история, препоръчваме ви да прочетете нашите най-нови технологични истории и тенденциозни технологични истории. До следващия път не приемайте реалностите на света за даденост!