Я несколько списков строк уже классифицирован как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 найти две проблемы:
подготовка файла для CRFClassifier должен иметь по одному слову в строке , поэтому я не нашел способ классифицировать группы слов одним тегом
Я не понимаю, должен ли я сделать один классификатор для каждого тега или одного классификатора для всех, поскольку одна строка может быть классифицируется с 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 (возможно, выбирая их совсем по-другому)?
Вы должны определить вероятность появления каждого из тегов, предоставленных на основе числа наблюдаемых образцов ? Это не проблема машинного обучения. Требуется ли классифицировать список строк как тег? Мне это непонятно, поскольку вы говорите, что вас не интересует тег, данный класификатором. – John
@John я написал это потому, что мне нужно иметь несколько вариантов для одной строки из-за перекрытия между классами, например, «Библиотека» может быть SERVICE или PLACE, и если я использую только один классификатор для всех тегов, которые он дает мне только один ответ, поэтому я должен посмотреть на вероятности вместо этого. – learningTask
@John Чтобы ответить на ваши вопросы: требуется классифицировать список строк как тег, но конечная классификация производится пользователем из-за этого перекрытия. Я не смотрю на вероятность появления, я должен посмотреть на структуру помеченных укусов. – learningTask