Тренируйте Stanford NER с большой газетой, проблемы с памятью

Ранее я обучал немецкий классификатор, используя Stanford NER и обучающий файл с 450 000 токенов. Поскольку у меня было почти 20 классов, это заняло около 8 часов, и мне пришлось сократить многие функции в файле реквизита.

Теперь у меня есть файл газеты с 16 000 000 уникальных помеченных токенов. Я хочу переобучить свой классификатор для использования этих токенов, но постоянно сталкиваюсь с проблемами памяти. Gazette-txt имеет размер 386 МБ и в основном содержит объекты с двумя токенами (имя + второе имя), все они уникальны.

Я уменьшил количество классов до 5, уменьшил количество токенов в бюллетене на 4 миллиона и удалил все функции, перечисленные на сайте часто задаваемых вопросов Stanford NER, из проп-файла, но я все еще сталкиваюсь с память: ошибка пространства кучи java. У меня 16 ГБ оперативной памяти, и я запускаю JVM с параметром -mx15g -Xmx14g.

Ошибка возникает примерно через 5 часов после начала процесса.

Моя проблема в том, что я не знаю, как еще больше сократить использование памяти без произвольного удаления записей из бюллетеня. Есть ли у кого-нибудь дополнительные предложения о том, как я могу уменьшить использование памяти?

Мой проп-файл выглядит так:

trainFile = ....tsv
serializeTo = ...ser.gz
map = word=0,answer=1

useWordPairs=false
useNGrams=false
useClassFeature=true
useWord=true
noMidNGrams=true
usePrev=true
useNext=true
useSequences=true
usePrevSequences=true
maxLeft=1
useTypeSeqs=true
useTypeSeqs2=true
useTypeySequences=true
wordShape=chris2useLC
useDisjunctive=true
saveFeatureIndexToDisk=true
qnSize=2
printFeatures=true
useObservedSequencesOnly=true

cleanGazette=true
gazette=....txt

Надеюсь, это не слишком хлопотно. Заранее спасибо!


person user2299050    schedule 22.01.2016    source источник
comment
Я бы попробовал использовать другие способы обучения классификатора chokkan.org/software/crfsuite. быстрее, чем при использовании Стэнфордской реализации CRF (отказ от ответственности: я на самом деле не проверял скорость, чтобы сравнить их)   -  person alvas    schedule 24.01.2016
comment
Спасибо за ваш ответ. Я сократил размер бюллетеня вдвое, и обучение завершилось примерно за час. Пришлось отключить почти все свойства, так что результаты были хуже, чем без бюллетеня. Таким образом, скорость не является основной проблемой, проблема в том, что процессу не хватает памяти. Я посмотрю на этот CRFsuite, так что спасибо!   -  person user2299050    schedule 24.01.2016
comment
Пробовали ли вы OpenNLP? Мой опыт работы со StanfordNLP не так уж хорош: низкая производительность и результаты с OpenNLP имеют более высокий балл F (конечно, балл F зависит от вашего домена).   -  person schrieveslaach    schedule 25.01.2016
comment
Я еще не пробовал OpenNLP. Я столкнулся с ним, когда решил, какой NER-tagger использовать, но я прочитал, что у него еще нет реализации для немецкого языка, поэтому я использую Stanford NER. Мне предложили использовать ПК в моей вселенной для обучения классификатора, поэтому я попробую это с полной газетой и без отключения многих функций, а потом доложу.   -  person user2299050    schedule 25.01.2016


Ответы (2)


RegexNER может помочь вам в этом:

http://nlp.stanford.edu/static/software/regexner/

Некоторые мысли:

  1. начните с 1 000 000 записей и посмотрите, насколько большим вы сможете управлять географический справочник, или, если 1 000 000 слишком велик, уменьшите его еще больше.

  2. отсортировать записи по частоте их появления в большом корпусе и исключить редкие

  3. Надеемся, что многие из более редких записей в вашем географическом справочнике не являются двусмысленными, поэтому вы можете просто использовать RegexNER и иметь в своей системе уровень, основанный на правилах, который автоматически помечает их как PERSON.

person StanfordNLPHelp    schedule 26.01.2016
comment
Да вы правы. Пример строки выглядит следующим образом: ^PER\tFIRSTNAME\tLASTNAME$ Проблема в том, что здесь много двусмысленности (т. е. Mercedes является PER, но также и ORG, в зависимости от контекста), поэтому мне не нужен 100% словарь с прямыми тегами. Я понял из FAQ, что словарь поможет только в принятии решения, а не гарантирует тег, что мне и нужно. Редактировать: я неправильно понял, что вы сказали. Это не мои данные обучения, у меня есть аннотированный файл токена 400 КБ в качестве данных обучения. Этот словарь предназначен для дополнения. - person user2299050; 26.01.2016
comment
Спасибо, это полезные советы. Особенно этот третий пункт определенно стоит изучить! - person user2299050; 26.01.2016
comment
Я надеюсь, что многие из ваших 16 000 000 записей имеют форму редкой фамилии, редкого имени. Таким образом, вы можете добавить записи для всех токенов, которые являются редкими фамилиями (и не имеют двусмысленности) и редкими именами (которые не имеют двусмысленности) в свой слой, основанный на правилах. - person StanfordNLPHelp; 26.01.2016
comment
Вы абсолютно правы, это было очень полезно. Благодарю вас! Я попытаюсь добавить редкие экземпляры через RegEx и более распространенные через бюллетень. - person user2299050; 26.01.2016

Вот обновление того, что я делал: сначала я попытался обучить классификатор, используя все доступные данные на нашем университетском сервере с доступной 128 ГБ оперативной памяти. Но поскольку прогресс был невероятно медленным (~120 итераций оптимизации за 5 дней), я решил отфильтровать справочник.

Я проверил немецкую википедию на наличие всех n-граммов в своем географическом справочнике и сохранил только те, которые встречались более одного раза. Это уменьшило количество PER с ~ 12 млн. до 260к. Сначала я сделал это только для своего списка PER и переобучил свой классификатор. Это привело к увеличению значения F на 3% (с ~70,5% до 73,5%). К настоящему времени я также отфильтровал списки ORG и LOC, но я не уверен, следует ли мне их использовать.

Список ORG содержит множество аббревиатур. Все они написаны заглавными буквами, но я не знаю, учитывается ли в процессе обучения заглавные буквы. Потому что, если бы это было не так, это привело бы к тоннам нежелательной двусмысленности между аббревиатурами и реальными словами на немецком языке.

Я также заметил, что всякий раз, когда я использую нефильтрованный список ORG или нефильтрованный LOC-список, F-значение этого одного класса может немного повышаться, но F-значения других классов несколько значительно снижаются. Вот почему пока я использую только PER-список.

Это мой прогресс на данный момент. Еще раз спасибо всем, кто помог.

person user2299050    schedule 19.02.2016