Size: a a a

Natural Language Processing

2019 December 24

SZ

Sergey Zakharov in Natural Language Processing
А как в spaCy правильно применить несколько NER моделей к одному и тому же тексту? Я не смог разобраться по доке. Там есть примеры для одной модели, которые я и использую в своём коде, то есть как-то так:
import spacy
nlp = spacy.load("model")
doc = nlp("some_text")

Я раньше пользовался одной моделью, чтобы достать одну именованную сущность. Теперь у меня появилось ещё две модели, каждая под свою сущность. Как мне правильно к одному и тому же тексту применить три модели, чтобы все три сущности были размечены в объекте типа doc?
Версия spaCy у меня 2.1.8, потому что 2.2 я не могу использовать из-за одного бага там
источник

YB

Yuri Baburov in Natural Language Processing
Sergey Zakharov
А как в spaCy правильно применить несколько NER моделей к одному и тому же тексту? Я не смог разобраться по доке. Там есть примеры для одной модели, которые я и использую в своём коде, то есть как-то так:
import spacy
nlp = spacy.load("model")
doc = nlp("some_text")

Я раньше пользовался одной моделью, чтобы достать одну именованную сущность. Теперь у меня появилось ещё две модели, каждая под свою сущность. Как мне правильно к одному и тому же тексту применить три модели, чтобы все три сущности были размечены в объекте типа doc?
Версия spaCy у меня 2.1.8, потому что 2.2 я не могу использовать из-за одного бага там
проще всего так:
doc1 = nlp1("...")
doc2 = nlp2("...")
all_ents = doc1.ents + doc2.ents
источник

SZ

Sergey Zakharov in Natural Language Processing
то есть если в объекте doc сохранить надо, то можно так?
doc1.ents = doc1.ents + doc2.ents
источник

YB

Yuri Baburov in Natural Language Processing
Yuri Baburov
проще всего так:
doc1 = nlp1("...")
doc2 = nlp2("...")
all_ents = doc1.ents + doc2.ents
если в пайплайне (класс nlp) будет два компонента ner, запустится только один (а если бы запустилось два, второй перетёр бы результаты первого)
источник

YB

Yuri Baburov in Natural Language Processing
Sergey Zakharov
то есть если в объекте doc сохранить надо, то можно так?
doc1.ents = doc1.ents + doc2.ents
можно, только не забудь сделать один раз for l in doc2.get_pipe('ner').labels: doc1.get_pipe('ner').add_label(l)
источник

YB

Yuri Baburov in Natural Language Processing
на всякий случай, поясню, в чём нюанс реализации NER в spacy:
там элементы не могут пересекаться. это значит, что если вы хотите разметить адрес
Москва, ул. Ленинградская, д. 7
и одновременно его компоненты разметить как
LOC (и CARDINAL для "7"), то у вас ничего не получится.
источник

SZ

Sergey Zakharov in Natural Language Processing
Yuri Baburov
на всякий случай, поясню, в чём нюанс реализации NER в spacy:
там элементы не могут пересекаться. это значит, что если вы хотите разметить адрес
Москва, ул. Ленинградская, д. 7
и одновременно его компоненты разметить как
LOC (и CARDINAL для "7"), то у вас ничего не получится.
Ого. А что произойдёт в моём случае, если у меня сущности в doc1 и doc2 пересекутся, при объединении результатов двух моделей?
Если что-то ломается, то как лучше разрешить? Допустим, для меня не страшно, если останется разметка только одной модели. И пока что не очень важно, какая именно модель "выиграет".
источник

YB

Yuri Baburov in Natural Language Processing
Sergey Zakharov
Ого. А что произойдёт в моём случае, если у меня сущности в doc1 и doc2 пересекутся, при объединении результатов двух моделей?
Если что-то ломается, то как лучше разрешить? Допустим, для меня не страшно, если останется разметка только одной модели. И пока что не очень важно, какая именно модель "выиграет".
HOW THE DOC.ENTS WORK
When you add spans to the doc.ents, spaCy will automatically resolve them back to the underlying tokens and set the Token.ent_type and Token.ent_iob attributes. By definition, each token can only be part of one entity, so overlapping entity spans are not allowed.
https://spacy.io/usage/processing-pipelines#wrapping-models-libraries , чёрная вставка справа
источник

SZ

Sergey Zakharov in Natural Language Processing
Yuri Baburov
HOW THE DOC.ENTS WORK
When you add spans to the doc.ents, spaCy will automatically resolve them back to the underlying tokens and set the Token.ent_type and Token.ent_iob attributes. By definition, each token can only be part of one entity, so overlapping entity spans are not allowed.
https://spacy.io/usage/processing-pipelines#wrapping-models-libraries , чёрная вставка справа
Спасибо. Не очень понятно, что там подразумевается под "underlying tokens". Я правильно понял, что какая модель первая разметила, от той и останутся сущности в doc? То есть в примере doc1.ents = doc1.ents + doc2.ents при пересечении спэнов останутся сущности из doc1?
источник

OS

Oleg Serikov in Natural Language Processing
я мб чт-то пропустил,но почему бы не запускать конкурентный пайплайны независимо, а потом руками обрабатывать слияние результатов?
источник

YB

Yuri Baburov in Natural Language Processing
Sergey Zakharov
Спасибо. Не очень понятно, что там подразумевается под "underlying tokens". Я правильно понял, что какая модель первая разметила, от той и останутся сущности в doc? То есть в примере doc1.ents = doc1.ents + doc2.ents при пересечении спэнов останутся сущности из doc1?
зависит от реализации, но кто-то перепишет сверху теги.
источник

YB

Yuri Baburov in Natural Language Processing
Oleg Serikov
я мб чт-то пропустил,но почему бы не запускать конкурентный пайплайны независимо, а потом руками обрабатывать слияние результатов?
можно так делать, но в основной spacy такой способ делать NER нормально не законтрибутить.
источник

SZ

Sergey Zakharov in Natural Language Processing
Yuri Baburov
зависит от реализации, но кто-то перепишет сверху теги.
"кто-то" - это мои модели или что-то дефолтное от спейси?
источник

YB

Yuri Baburov in Natural Language Processing
Sergey Zakharov
"кто-то" - это мои модели или что-то дефолтное от спейси?
при сохранении .ents вызовется какой-то метод spacy, который перезапишет entities у каждого слова, и исходя из этого подредактирует spans. надо смотреть реализацию.
источник

YB

Yuri Baburov in Natural Language Processing
Yuri Baburov
при сохранении .ents вызовется какой-то метод spacy, который перезапишет entities у каждого слова, и исходя из этого подредактирует spans. надо смотреть реализацию.
https://support.prodi.gy/t/what-happens-if-your-annotation-has-overlapping-entity-spans/363/2
вот ещё предложение, как это в один пайплайн можно свести.
источник

SZ

Sergey Zakharov in Natural Language Processing
кто-нибудь пользовался этой либой на своих задачах? как зашла?
https://github.com/chomechome/maru
источник

G

George in Natural Language Processing
возможно ли в tf-idf учитывать контекст?
источник

D(

David (ddale) Dale in Natural Language Processing
George
возможно ли в tf-idf учитывать контекст?
Можно кроме слов включить словные n-граммы, если размеры обучающей выборки позволяют. Не то чтобы полноценный контекст, но как костыль может быть вполне пристойным.
источник

G

George in Natural Language Processing
David (ddale) Dale
Можно кроме слов включить словные n-граммы, если размеры обучающей выборки позволяют. Не то чтобы полноценный контекст, но как костыль может быть вполне пристойным.
если включить еще и n-граммы побуквенно, то не будет лишним?
источник

D(

David (ddale) Dale in Natural Language Processing
George
если включить еще и n-граммы побуквенно, то не будет лишним?
иногда докидывает. попробовать стоит)
источник