1

Я несколько списков строк уже классифицирован какMachine Learning Классификация списков строк в JAVA без какого-либо контекста, окружающих их

<string>      <tag>  

088 9102355      PHONE NUMBER 
091 910255      PHONE NUMBER 
... 
Alfred St      STREET 
German St      STREET 
... 
RE98754TO      IDENTIFIER 
AUX9654TO      IDENTIFIER 
... 
service open all day long  DESCRIPTION 
service open from 8 to 22  DESCRIPTION 
... 
[email protected]   EMAIL 
[email protected]  EMAIL 
... 
www.serviceSite.com    URL 
... 
Florence      CITY 
... 

с большим количеством строк в теге, и я должен сделать программу Java, которая, данный новый список строк (предполагается, что все те же теги), назначает вероятность для каждого тега в списке. Программа должна быть полностью независимой от языка, и все знания должны поступать из списков помеченных строк, как описано выше.

Я думаю, что эта проблема может быть решена с помощью NER-подходов (например, алгоритмов машинного обучения, таких как CRF), но они обычно представляют собой неструктурированный текст, такой как глава из книги или абзац веб-страницы, а не список независимые строки.

Я думал использовать CRF (т.е. условного случайное поле), потому что я нашел подобный подход, используемый в интеграции инструмента Karma данных, как описано в этом Article пункте 3.1 где «семантические типы» являются моими тегами.

Для решения программы я скачал Stanford Named Entity Recognizer (NER) и играл немного с его JAVA API через NERDemo.java найти две проблемы:

  1. подготовка файла для CRFClassifier должен иметь по одному слову в строке , поэтому я не нашел способ классифицировать группы слов одним тегом

  2. Я не понимаю, должен ли я сделать один классификатор для каждого тега или одного классификатора для всех, поскольку одна строка может быть классифицируется с n различными тегами, и пользователь выбирает b между ними. Поэтому меня скорее интересует вероятность, назначенная классификаторами вместо точного соответствия классов. Кроме того, У меня нет никаких строк «без тегов», поэтому я не знаю, как Классификатор ведет себя без них, чтобы назначить вероятности.

Это правильный подход к проблеме? Есть ли способ использовать Stanford NER или другой JAVA API с CRF или другим подходящим Machine Learning Algoritm для этого?

Update

мне удалось обучить классификатор CRF первой с каждым словом классифицирован независимо с тегом и каждой группы слов, разделенных двумя запятыми (классифицируется как «тега» (0)), а затем с группой слов как одно слово с подчеркиваниями, заменяющими пробелы, но у меня очень разочаровывающие результаты в небольшом тесте, который я сделал. Я не совсем понимаю, какие функции я должен включить и которые исключают из тех, которые описаны в javadoc NERFeatureFactory, учитывая, что они не могут иметь никакого отношения к языку.

Update 2

Результаты испытаний начинают иметь смысл, я разделить каждую строку (пометка каждый токен) от других с двумя новыми линиями, вместо ужасных «двух запятых, меченных 0», и я использовал Stanford PTBTokenizer вместо того, что я сделал. Кроме того, я настроил функции, включив usePrev и useNext и используя суффикс/префикс Ngrams до 6 символов длины и прочего.

Файл обучения по имени training.tsv имеет следующий формат:

rt05201201010to identifier 


1442955884000 identifier 


rt100005154602cv identifier 


Alfred street 
Street street 


Robert street 
Street street 

и theese являются флаги в файле СВОЙСТВ:

# these are the features we'd like to train with 
# some are discussed below, the rest can be 
# understood by looking at NERFeatureFactory 
useClassFeature=true 
useWord=true 
# word character ngrams will be included up to length 6 as prefixes 
# and suffixes only 
useNGrams=true 
noMidNGrams=true 
maxNGramLeng=6 
usePrev=true 
useNext=true 
useTags=false 
useWordPairs=false 
useDisjunctive=true 
useSequences=false 
usePrevSequences=true 
useNextSequences=true 
# the next flag can have these values: IO, IOB1, IOB2, IOE1, IOE2, SBIEO 
entitySubclassification=IO 
printClassifier=HighWeight 
cacheNGrams=true 
# the last 4 properties deal with word shape features 
useTypeSeqs=true 
useTypeSeqs2=true 
useTypeySequences=true 
wordShape=chris2useLC 

Однако я нашел еще одну проблему, мне удалось обучить всего 39 ярлыков по 100 строк каждый, хотя у меня есть 150 ярлыков с более чем 1000 строк каждый, но даже в этом случае требуется около 5 минут для тренировки, и если я немного подниму эти цифры, вы получите Ошибка Java Heap Out of Memory ,

Есть ли способ масштабирования до этих чисел с помощью одного классификатора? Лучше ли тренировать 150 (или меньше, может быть, один с двумя или тремя надписями) небольшие классификаторы и объединить их позже? Нужно ли мне тренироваться с 1000 + струнами на каждой этикетке или я могу остановиться до 100 (возможно, выбирая их совсем по-другому)?

+0

Вы должны определить вероятность появления каждого из тегов, предоставленных на основе числа наблюдаемых образцов ? Это не проблема машинного обучения. Требуется ли классифицировать список строк как тег? Мне это непонятно, поскольку вы говорите, что вас не интересует тег, данный класификатором. – John

+0

@John я написал это потому, что мне нужно иметь несколько вариантов для одной строки из-за перекрытия между классами, например, «Библиотека» может быть SERVICE или PLACE, и если я использую только один классификатор для всех тегов, которые он дает мне только один ответ, поэтому я должен посмотреть на вероятности вместо этого. – learningTask

+0

@John Чтобы ответить на ваши вопросы: требуется классифицировать список строк как тег, но конечная классификация производится пользователем из-за этого перекрытия. Я не смотрю на вероятность появления, я должен посмотреть на структуру помеченных укусов. – learningTask

ответ

1

Первое, что вы должны знать, это то, что (линейная цепочка) теги CRF не предназначены для этой цели. Они были очень приятным решением для контекстно-ориентированного прогнозирования, т. Е. Когда у вас есть слова до и после названных объектов, и вы ищете подсказки в ограниченном окне (например, 2 слова до/после текущего слова). Вот почему вам пришлось вставлять двойные строки: разграничивать предложения. Они также обеспечивают согласованность между тегами, затронутыми словами, что действительно хорошо в вашем случае.

Хронометрист CRF должен работать, но с дополнительными затратами на обучающий шаг, которого можно было бы избежать, используя более простую (максимальную энтропию, SVM), но все же точные методы машинного обучения. В Java, для вашей задачи, не будет ли Weka лучшим решением? Я бы также рассмотрел теги BIO как не соответствующие вашему делу.

Независимо от используемого программного обеспечения/кодирования, неудивительно, что ngrams на уровне персонажа дают хорошие улучшения, но я считаю, что вы можете добавить специальные функции. Например, поскольку морфологические ключи важны (наличие символов «@», «верхний регистр» или цифр), вы можете использовать коды (см. [1]), которые являются очень удобным методом описания строк. Вероятно, вы также получите лучшие результаты, используя списки имен (лексикон), которые могут быть активированы как дополнительные функции.

[1] алгоритмы ранжирования для именованного объекта добычи: активизация и голосовавшего персептрона (Michael Collins, 2002)

+0

спасибо за ответ, я понимаю, что CRF не предназначен для этого, но я выбираю этот метод, потому что моя проблема имеет аналогичный фон, описанный в статье Karma, связанный в моем вопросе. Я выбираю Stanford NER, потому что мне кажется, что самая простая и простая в использовании библиотека с CRF, я думаю, что у Weka этого нет. Мне сложно использовать список имен и быть независимым от языка (по крайней мере, для западных языков). Есть ли у вас предложения по выбору функции, если я вместо этого выбираю классификатор SVM? как выбрать вес в этом случае? – learningTask

+0

Что касается SVM, я не уверен, что «выбор функции» или «выбор веса» имеет решающее значение: либо обучение в компьютере обрабатывает это, либо вы потратите время на то, чтобы настроить свою учебную процедуру (весело, но не всегда эффективно). Попробовали ли вы реализовать определенное выделение ключей (например, как обычно записываются номера телефонов, адреса, URL-адреса, количество слов в выражении), при необходимости с использованием регулярных выражений или частичных лексиконов (имена, адреса и т. Д.) И предоставлять их как дополнительные возможности для SVM/CRF? Технология разработки часто требует более подробного описания того, какой критерий можно использовать для различения классов. – eldams