Как «отладить» текстовый классификатор StanfordNLP - PullRequest
0 голосов
/ 07 января 2019

Я использую StanfordNLP для классификации текста. У меня есть тренировочный набор с двумя ярлыками: ДА и НЕТ. Обе метки имеют более или менее одинаковые значения для каждой метки (~ = 120K).

Проблема в том, что StanfordNLP неправильно классифицирует какой-то текст, и я не могу определить, почему. Как мне отладить его?

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

YES guarda-roupa/roupeiro 2 portas de correr
YES guarda-roupa/roupeiro 3 portas
YES guarda roupa , roupeiro 3 portas
YES guarda-roupa 4 portas
YES guarda roupa 6p mdf
YES guardaroupas 3 portas
YES jogo de quarto com guarda-roupa 2 portas + cômoda + berço
YES guarda roupa 4pts
NO  base para guarda-sol
NO  guarda-sol alumínio
NO  guarda chuva transparente
NO  coifa guarda po alavanca cambio
NO  lancheira guarda do leao vermelha
NO  hard boiled: queima roupa
NO  roupa nova do imperador
NO  suporte para passar roupa

Метка YES обозначает «guarda roupa» (гардероб), а NO обозначает вещи, которые не являются «guarda roupa», но содержат одно или несколько общих слов (например, «guarda chuva» - зонтик или «roupa» - одежда).

Я не знаю почему, но моя модель настаивает на том, чтобы классифицировать «guarda roupa» (и его вариации, такие как «guardaroupa», «guarda-roupas» и т. Д.) Как НЕТ ...

Как мне отладить это? Я уже дважды проверил свой файл поезда, чтобы увидеть, не ошибся ли я, что-то ошибся, но не смог найти ...

Любой совет приветствуется.

ОБНОВЛЕНИЕ 1

Я использую следующие свойства для управления созданием объектов:

 useClassFeature=false
 featureMinimumSupport=2
 lowercase=true
 1.useNGrams=false
 1.usePrefixSuffixNGrams=false
 1.splitWordsRegexp=\\s+
 1.useSplitWordNGrams=true
 1.minWordNGramLeng=2
 1.maxWordNGramLeng=5
 1.useAllSplitWordPairs=true
 1.useAllSplitWordTriples=true
 goldAnswerColumn=0
 displayedColumn=1
 intern=true
 sigma=1
 useQN=true
 QNsize=10
 tolerance=1e-4

ОБНОВЛЕНИЕ 2

В поиске API я обнаружил, что ColumnDataClassifier имеет метод getClassifier(), который дает доступ к базовому LinearClassifier, который имеет метод dump(). Свалка производит вывод, который выглядит как ниже. Из API: "Print all features in the classifier and the weight that they assign to each class."

                                      YES     NO
1-SW#-guarda-roupa-roupeiro-2portas   0,01    -0,01   
1-ASWT-guarda-roupa-roupeiro          0,19    -0,19
1-SW#-guarda-roupa-roupeiro           0,19    -0,19

Если я введу toString() в LinearClassifier, будет напечатано:

[-0.7, -0.7+0.1): 427.0  [(1-SW#-guarda-roupa-roupeiro-2portas,NO), ...]
[0.6, 0.6+0.1): 427.0  [(1-SW#-guarda-roupa-roupeiro-2portas,YES), ...]
...