NeuralCoref - это расширение трубопровода для Spacy 2.1+, которое аннотирует и разрешает кластеры Coreference с использованием нейронной сети. NeuralCoref готов к производству, интегрирован в трубопровод Spacy NLP и расширяется для новых наборов данных.
Для краткого введения в разрешение Coreference и NeuralCoref, пожалуйста, обратитесь к нашему сообщению в блоге. NeuralCoref написан на Python/Cython и поставляется с предварительно обученной статистической моделью только для английского языка .
NeuralCoref сопровождается визуализацией клиента NeuralCoref-Viz, веб-интерфейса, работающим на сервере REST, который можно попробовать в Интернете. NeuralCoref выпускается по лицензии MIT.
Версия 4.0 сейчас! Доступно на PIP и совместимо со SPACY 2.1+.
Это самый простой способ установить NeuralCoref.
pip install neuralcorefspacy.strings.StringStore size changed ошибку Если у вас есть ошибка, упомянутая spacy.strings.StringStore size changed, may indicate binary incompatibility при загрузке NeuralCoref в import neuralcoref , это означает, что вам придется установить NeuralCoref из источников дистрибуции вместо колес, чтобы получить NeuralCoref для создания против самой последней версии Spacy для вашей системы.
В этом случае просто переустановить NeuralCoref следующим образом:
pip uninstall neuralcoref
pip install neuralcoref --no-binary neuralcorefЧтобы иметь возможность использовать NeuralCoref, вам также понадобится английская модель для Spacy.
Вы можете использовать любую английскую модель, которая отлично подходит для вашего приложения, но обратите внимание, что выступления NeuralCoref сильно зависят от характеристик модели Spacy и, в частности, от выступлений Tagger, Parser и NER -компонентов Spacy. Таким образом, более крупная модель Spacy English также улучшит качество разрешения Coreference (см. Некоторые детали в внутренних и модельных разделах ниже).
Вот пример того, как вы можете установить Spacy и (небольшую) английскую модель для Spacy, на веб -сайте Spacy можно найти больше информации:
pip install -U spacy
python -m spacy download enВы также можете установить NeuralCoref из источников. Вам нужно будет сначала установить зависимости, которая включает в себя цифон и спейс.
Вот процесс:
venv .env
source .env/bin/activate
git clone https://github.com/huggingface/neuralcoref.git
cd neuralcoref
pip install -r requirements.txt
pip install -e . NeuralCoref сделан из двух подмодулей:
В первый раз, когда вы импортируете NeuralCoref в Python, он загрузит веса нейронной сети в папке кэша.
Папка кэша устанавливается по умолчанию в ~/.neuralcoref_cache (см. File_utils.py), но это поведение можно переоценить путем установки переменной среды NEURALCOREF_CACHE , чтобы указать на другое место.
Папка кэша может быть безопасно удалена в любое время, и модуль снова загрузит модель в следующий раз, когда она будет загружена.
Вы можете получить больше информации о процессе загрузки и кэширования внутренней модели путем активации модуля logging Python перед загрузкой NeuralCoref следующим образом:
import logging ;
logging . basicConfig ( level = logging . INFO )
import neuralcoref
> >> INFO : neuralcoref : Getting model from https : // s3 . amazonaws . com / models . huggingface . co / neuralcoref / neuralcoref . tar . gz or cache
> >> INFO : neuralcoref . file_utils : https : // s3 . amazonaws . com / models . huggingface . co / neuralcoref / neuralcoref . tar . gz not found in cache , downloading to / var / folders / yx / cw8n_njx3js5jksyw_qlp8p00000gn / T / tmp_8y5_52m
100 % | █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 40155833 / 40155833 [ 00 : 06 < 00 : 00 , 6679263.76 B / s ]
> >> INFO : neuralcoref . file_utils : copying / var / folders / yx / cw8n_njx3js5jksyw_qlp8p00000gn / T / tmp_8y5_52m to cache at / Users / thomaswolf / . neuralcoref_cache / f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14 . 7 d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633
> >> INFO : neuralcoref . file_utils : creating metadata file for / Users / thomaswolf / . neuralcoref_cache / f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14 . 7 d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633
>> > INFO : neuralcoref . file_utils : removing temp file / var / folders / yx / cw8n_njx3js5jksyw_qlp8p00000gn / T / tmp_8y5_52m
>> > INFO : neuralcoref : extracting archive file / Users / thomaswolf / . neuralcoref_cache / f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14 . 7 d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633 to dir / Users / thomaswolf / . neuralcoref_cache / neuralcoref Вот рекомендуемый способ создания NeuralCoref и добавить его в трубопровод аннотаций Spacy:
# Load your usual SpaCy model (one of SpaCy English models)
import spacy
nlp = spacy . load ( 'en' )
# Add neural coref to SpaCy's pipe
import neuralcoref
neuralcoref . add_to_pipe ( nlp )
# You're done. You can now use NeuralCoref as you usually manipulate a SpaCy document annotations.
doc = nlp ( u'My sister has a dog. She loves him.' )
doc . _ . has_coref
doc . _ . coref_clustersЭквивалентным способом добавления NeuralCoref к трубе модели Spacy является создание экземпляра класса Neuralcoref, а затем добавить его вручную к трубе модели языка Spacy.
# Load your usual SpaCy model (one of SpaCy English models)
import spacy
nlp = spacy . load ( 'en' )
# load NeuralCoref and add it to the pipe of SpaCy's model
import neuralcoref
coref = neuralcoref . NeuralCoref ( nlp . vocab )
nlp . add_pipe ( coref , name = 'neuralcoref' )
# You're done. You can now use NeuralCoref the same way you usually manipulate a SpaCy document and it's annotations.
doc = nlp ( u'My sister has a dog. She loves him.' )
doc . _ . has_coref
doc . _ . coref_clusters NeuralCoref разрешит основы и аннотирует их в качестве атрибутов расширения в Doc Spacy, Span и Token объектах под ._. словарь.
Вот список аннотаций:
| Атрибут | Тип | Описание |
|---|---|---|
doc._.has_coref | логический | Какая -либо основная способность была решена в документе |
doc._.coref_clusters | Список Cluster | Все кластеры основных упоминаний в документе |
doc._.coref_resolved | Unicode | Представление Unicode DOC, где каждое упоминание Corefering заменяется основным упоминанием в связанном кластере. |
doc._.coref_scores | Дикт дикта | Результаты разрешения Coreference между упоминаниями. |
span._.is_coref | логический | Есть ли у этого пролета хотя бы одно основное упоминание |
span._.coref_cluster | Cluster | Кластер упоминаний, которые основаны на промежутке |
span._.coref_scores | Диктат | Оценки разрешения и разтрачивания Coreference с другими упоминаниями (если применимо). |
token._.in_coref | логический | Находится ли токен внутри, по крайней мере, одно основное упоминание |
token._.coref_clusters | Список Cluster | Все кластеры основных упоминаний, которые содержат токен |
Cluster - это кластер основных упоминаний, который имеет 3 атрибута и несколько методов для упрощения навигации внутри кластера:
| Атрибут или метод | Тип / возврат типа | Описание |
|---|---|---|
i | инт | Индекс кластера в документе |
main | Span | Промежуток наиболее репрезентативного упоминания в кластере |
mentions | список Span | Список всех упоминаний в кластере |
__getitem__ | Span | Доступ к упоминанию в кластере |
__iter__ | Доходность Span | Итерация над упоминаниями в кластере |
__len__ | возврат инт | Количество упоминаний в кластере |
Вы также можете легко ориентироваться в цепях кластеров Coreference и отображать кластеры и упоминания.
Вот несколько примеров, попробуйте их, чтобы проверить это для себя.
import spacy
import neuralcoref
nlp = spacy . load ( 'en' )
neuralcoref . add_to_pipe ( nlp )
doc = nlp ( u'My sister has a dog. She loves him' )
doc . _ . coref_clusters
doc . _ . coref_clusters [ 1 ]. mentions
doc . _ . coref_clusters [ 1 ]. mentions [ - 1 ]
doc . _ . coref_clusters [ 1 ]. mentions [ - 1 ]. _ . coref_cluster . main
token = doc [ - 1 ]
token . _ . in_coref
token . _ . coref_clusters
span = doc [ - 1 :]
span . _ . is_coref
span . _ . coref_cluster . main
span . _ . coref_cluster . main . _ . coref_cluster ВАЖНО : NeuralCoref упоминает, что являются предметами Spacy Span, что означает, что вы можете получить доступ ко всем обычным атрибутам SPAN, такие как span.start (индекс первого тока SPAN в документе), span.end (Индекс первого токена после промежутка в документе) и т. Д.
Пример: doc._.coref_clusters[1].mentions[-1].start даст вам индекс первого тока последнего упоминания второго кластера Coreference в документе.
Вы можете передать несколько дополнительных параметров neuralcoref.add_to_pipe или NeuralCoref() чтобы контролировать поведение NeuralCoref.
Вот полный список этих параметров и их описаний:
| Параметр | Тип | Описание |
|---|---|---|
greedyness | плавать | Число от 0 до 1, определяющее, насколько жадная модель о принятии решений в основном языке (более жадные означает больше ссылок на основные меры). Значение по умолчанию составляет 0,5. |
max_dist | инт | Сколько упоминаний обратно смотрит при рассмотрении возможных предшественников текущего упоминания. Уменьшение значения приведет к тому, что система будет работать быстрее, но менее точно. Значение по умолчанию составляет 50. |
max_dist_match | инт | Система рассмотрит вопрос о связывании текущего упоминания с предыдущим еще дальше, чем max_dist , если они разделяют существительное или надлежащее существительное. В этом случае он выглядит max_dist_match Вместо этого. Значение по умолчанию составляет 500. |
blacklist | логический | Если система разрешает размышления о местоимениях в следующем списке: ["i", "me", "my", "you", "your"] . Значение по умолчанию верно (COREFERFERSERED). |
store_scores | логический | Если система хранит результаты для основных категорий в аннотациях. Значение по умолчанию верно. |
conv_dict | dict (str, list (str)) | Словарь преобразования, который вы можете использовать для замены вторжений редких слов (ключей) в среднем от встроений списка общих слов (значений). Пример: conv_dict={"Angela": ["woman", "girl"]} поможет разрешить ядерные категории для Angela , используя погашения для более распространенной woman и girl вместо встраивания Angela . Это в настоящее время работает только для отдельных слов (не для групп слов). |
import spacy
import neuralcoref
# Let's load a SpaCy model
nlp = spacy . load ( 'en' )
# First way we can control a parameter
neuralcoref . add_to_pipe ( nlp , greedyness = 0.75 )
# Another way we can control a parameter
nlp . remove_pipe ( "neuralcoref" ) # This remove the current neuralcoref instance from SpaCy pipe
coref = neuralcoref . NeuralCoref ( nlp . vocab , greedyness = 0.75 )
nlp . add_pipe ( coref , name = 'neuralcoref' ) Вот пример того, как мы можем использовать параметр conv_dict , чтобы помочь разрешить основы редкого слова, как имя:
import spacy
import neuralcoref
nlp = spacy . load ( 'en' )
# Let's try before using the conversion dictionary:
neuralcoref . add_to_pipe ( nlp )
doc = nlp ( u'Deepika has a dog. She loves him. The movie star has always been fond of animals' )
doc . _ . coref_clusters
doc . _ . coref_resolved
# >>> [Deepika: [Deepika, She, him, The movie star]]
# >>> 'Deepika has a dog. Deepika loves Deepika. Deepika has always been fond of animals'
# >>> Not very good...
# Here are three ways we can add the conversion dictionary
nlp . remove_pipe ( "neuralcoref" )
neuralcoref . add_to_pipe ( nlp , conv_dict = { 'Deepika' : [ 'woman' , 'actress' ]})
# or
nlp . remove_pipe ( "neuralcoref" )
coref = neuralcoref . NeuralCoref ( nlp . vocab , conv_dict = { 'Deepika' : [ 'woman' , 'actress' ]})
nlp . add_pipe ( coref , name = 'neuralcoref' )
# or after NeuralCoref is already in SpaCy's pipe, by modifying NeuralCoref in the pipeline
nlp . get_pipe ( 'neuralcoref' ). set_conv_dict ({ 'Deepika' : [ 'woman' , 'actress' ]})
# Let's try agin with the conversion dictionary:
doc = nlp ( u'Deepika has a dog. She loves him. The movie star has always been fond of animals' )
doc . _ . coref_clusters
# >>> [Deepika: [Deepika, She, The movie star], a dog: [a dog, him]]
# >>> 'Deepika has a dog. Deepika loves a dog. Deepika has always been fond of animals'
# >>> A lot better! Простой пример сценария сервера для интеграции NeuralCoref в API REST приведен в качестве примера в examples/server.py .
Чтобы использовать его, вам нужно сначала установить Falcon:
pip install falconЗатем вы можете запустить сервер следующим образом:
cd examples
python ./server.pyИ запрашивайте сервер как так:
curl --data-urlencode " text=My sister has a dog. She loves him. " -G localhost:8000Есть много других способов управлять и развернуть NeuralCoref. Некоторые примеры можно найти во вселенной Spacy.
Если вы хотите переучить модель или обучить ее на другом языке, см. Наши инструкции по обучению, а также наш пост в блоге