buriy / spacy-ru

Russian language models for spaCy
MIT License
242 stars 29 forks source link

Имена распознаются как ORG #9

Open Silverlay opened 5 years ago

Silverlay commented 5 years ago

Добрый день,

По какой-то причине имена, отчества определяются как ORG, вместо PERS. Например в

`import spacy

text = "Елена Владимировна, покажите мне монету, которую нашел Александр!"

if name == 'main': nlp = spacy.load('ru2') nlp.add_pipe(nlp.create_pipe('sentencizer'), first=True)
doc = nlp(text)

for e in doc.ents:
    print(e, e.label_)`

Результат:

Елена Владимировна ORG Александр ORG

Как это можно победить? В словарях pymorphy2 указаны как PERS

buriy commented 5 years ago

Ну, модель NER в ru2 вообще не тренирована... Вы ловите рандомные значения необученной нейросети. P.S. Если вдруг найдёте большой датасет NER на русском, дайте мне знать, потому что на маленьком датасете будет конечно получше этого работать, но тоже фигня получится.

rominf commented 5 years ago

ner_rus отсюда: http://docs.deeppavlov.ai/en/master/components/ner.html не то, что надо?

Silverlay commented 5 years ago

В каком формате нужен датасет и сколько там должно быть элементов в идеале?

buriy commented 5 years ago

Если брать имеющиеся русские датасеты, как у Deep Pavlov, то будет высокая точность только на тех данных, что содержатся в датасетах, поскольку обобщение на ненатренированных специально эмбеддингах не очень хорошее. У решения со словарями имён, гео-названий и организаций точность будет сравнимой ( т.е. решение с PhraseMatcher из Spacy, которому просто дают словарь из всех известных организаций -- кстати, можете попробовать ).

У меня есть идеи, как процесс улучшения качества автоматизировать без специализированного датасета, примерно это будет выглядеть так: 1) сделаю модель для spacy 2.1 2) использую обычные известные 3 датасета ( Gareev corpus, FactRuEval 2016, Persons-1000), на которых тренировали DeepPavlov NER, в т.ч. для проверки качества в дальнейшем. 3) использую дообучение на эмбеддингах и словаре от opencorpora / pymorphy2 (там есть имена, пометки гео, название, аббревиатуры). 4) использую гео-датасет ( https://www.geonames.org ) 5) использую датасет от https://www.kaggle.com/c/text-normalization-challenge-russian-language для других классов (MONEY, DATE, TIME, всякие разные другие). 6) нагенерю контр-примеры для hard negative mining. Если есть желающие помочь -- могу вас огранизовать, чтобы вы помогли мне это всё сделать, потому что у меня пока что со временем очень тяжело. Так что если есть большие словари NER по интересующим вас темам с лицензией, разрешающей использование в коммерческих проектах без полного раскрытия исходников и всех обновлений (MIT, BSD, Apachе, часть видов Creative Commons..., но не GPL ) , то добавляйте ссылки на них сюда в комментариях. Ну а тем более, если вдруг знаете про русский датасет, который крупнее перечисленных выше.

buriy commented 5 years ago

@Silverlay да, можете попробовать решение от Deep Pavlov по ссылке выше, напишите, пожалуйста, насколько вам оно подошло.

Silverlay commented 5 years ago

Я готов помочь. У меня есть часа два в день, которые можно провести с пользой для общего дела. Весь вопрос только в том, что делать? :) я в ML, как обезьяна в CS GO

Silverlay commented 5 years ago

@Silverlay да, можете попробовать решение от Deep Pavlov по ссылке выше, напишите, пожалуйста, насколько вам оно подошло.

Я его смотрел до вашей модели, оно работает - бесспорно, но выглядит черезвычайно монструозно и порог входа по сравнению со spacy гораздо выше.

buriy commented 5 years ago

@Silverlay там с ML всё уже подготовлено -- даже ничего настраивать не надо, надо только данные в нужном формате ему скормить командой spacy train. (Версию будем использовать 2.1) А для этого данные нужно подготовить. Вот тут есть описание нескольких вариантов конверсии: https://github.com/explosion/spaCy/issues/1966#issuecomment-421504070 Имеющиеся 3 датасета нам нужно привести в JSONL формат для обучения. Ну а остальные данные будем в виде текстовых списков слов и фраз собирать. Данные из pymorphy2 я переведу сам, сделав разметку произвольного текста.

buriy commented 5 years ago

Итак, сузим до более конкретных задач. Итерация 1: