O NeuralCoref é uma extensão de pipeline para o Spacy 2.1+ que anota e resolve clusters de núcleo de núcleo usando uma rede neural. O NeuralCoref está pronto para produção, integrado no oleoduto NLP da Spacy e extensível a novos conjuntos de dados de treinamento.
Para uma breve introdução à resolução da Coreference e NeuralCoref, consulte nossa postagem no blog. O Neuralcoref é escrito em Python/Cython e vem com um modelo estatístico pré-treinado apenas para inglês .
O NeuralCoref é acompanhado por um cliente de visualização NeuralCoref-Viz, uma interface da Web alimentada por um servidor REST que pode ser experimentado online. Neuralcoref é liberado sob a licença do MIT.
Versão 4.0 fora agora! Disponível no PIP e compatível com o Spacy 2.1+.
Esta é a maneira mais fácil de instalar o NeuralCoref.
pip install neuralcorefspacy.strings.StringStore size changed Se você tiver um erro mencionando spacy.strings.StringStore size changed, may indicate binary incompatibility ao carregar o neuralcoref com import neuralcoref , isso significa que você terá que instalar o NeuralCoref a partir das fontes da distribuição em vez das rodas para que o NeuralCoref seja construído contra a versão mais recente do Spacy para o seu sistema.
Nesse caso, basta reinstalar o neuralcoref da seguinte forma:
pip uninstall neuralcoref
pip install neuralcoref --no-binary neuralcorefPara poder usar o NeuralCoref, você também precisará ter um modelo em inglês para Spacy.
Você pode usar qualquer modelo em inglês funcionar bem para o seu aplicativo, mas observe que o desempenho do NeuralCoref depende fortemente do desempenho do modelo Spacy e, em particular, no desempenho dos componentes, analisador e nerd do Spacy Model. Um modelo mais amplo em inglês spacy também melhorará a qualidade da resolução de coreferência (veja alguns detalhes na seção interna e modelo abaixo).
Aqui está um exemplo de como você pode instalar o Spacy e um modelo (pequeno) inglês para spacy, mais informações podem ser encontradas no site da Spacy:
pip install -U spacy
python -m spacy download enVocê também pode instalar o NeuralCoref a partir de fontes. Você precisará instalar as dependências primeiro, que incluem Cython e Spacy.
Aqui está o processo:
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 é feito de dois sub-módulos:
Na primeira vez em que você importa NeuralCoref no Python, ele baixará os pesos do modelo de rede neural em uma pasta de cache.
A pasta de cache é definida por padrão como ~/.neuralcoref_cache (consulte File_utils.py), mas esse comportamento pode ser exagerado definindo a variável de ambiente NEURALCOREF_CACHE para apontar para outro local.
A pasta de cache pode ser excluída com segurança a qualquer momento e o módulo baixará novamente o modelo na próxima vez que for carregado.
Você pode ter mais informações sobre o local do local, download e cache do modelo interno, ativando o módulo logging da Python antes de carregar o NeuralCoref da seguinte maneira:
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 Aqui está a maneira recomendada para instanciar o neuralcoref e adicioná -lo ao oleoduto de anotações de 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_clustersUma maneira equivalente de adicionar o neuralcoref a um tubo de modelo de spacy é instanciar a classe NeuralCoref primeiro e depois adicioná -lo manualmente ao tubo do modelo de linguagem espacial.
# 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 O NeuralCoref resolverá as coreferências e as anotará como atributos de extensão nos objetos Spacy Doc , Span e Token sob o ._. dicionário.
Aqui está a lista das anotações:
| Atributo | Tipo | Descrição |
|---|---|---|
doc._.has_coref | booleano | Tem qualquer coreferência foi resolvido no documento |
doc._.coref_clusters | Lista de Cluster | Todos os aglomerados de menções coreferas no documento |
doc._.coref_resolved | unicode | Representação unicode do DOC, onde cada menção corefering é substituída pela menção principal no cluster associado. |
doc._.coref_scores | Dicto de dicto | Pontuações da resolução de núcleo de núcleo entre menções. |
span._.is_coref | booleano | Se o período tem pelo menos uma menção corefering |
span._.coref_cluster | Cluster | Cluster de menções que Corefer com o Span |
span._.coref_scores | Dito | Pontuações da resolução de núcleo de núcleo de & span com outras menções (se aplicável). |
token._.in_coref | booleano | Se o token está dentro de pelo menos uma menção corefericente |
token._.coref_clusters | Lista de Cluster | Todos os grupos de mencionar a coreferção que contêm o token |
Um Cluster é um cluster de menções coreferas que possui 3 atributos e alguns métodos para simplificar a navegação dentro de um cluster:
| Atributo ou método | Tipo / Tipo de retorno | Descrição |
|---|---|---|
i | int | Índice do cluster no documento |
main | Span | Extensão da menção mais representativa no cluster |
mentions | lista de Span | Lista de todas as menções no cluster |
__getitem__ | Span de retorno | Acesse uma menção no cluster |
__iter__ | rendimentos Span | Itera sobre menções no cluster |
__len__ | retornar int | Número de menções no cluster |
Você também pode navegar facilmente pelas cadeias de cluster de núcleo e clusters e menções.
Aqui estão alguns exemplos, experimente -os para testá -lo por si mesmo.
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 IMPORTANTE : O NeuralCoref menciona são objetos Spacy Span, o que significa que você pode acessar todos os atributos usuais de span como span.start (índice do primeiro token do span no documento), span.end (índice do primeiro token após o documento), etc ...
EX: doc._.coref_clusters[1].mentions[-1].start fornecerá o índice do primeiro token da última menção ao segundo cluster de núcleo de núcleo no documento.
Você pode passar vários parâmetros adicionais para neuralcoref.add_to_pipe ou NeuralCoref() para controlar o comportamento do neuralcoref.
Aqui está a lista completa desses parâmetros e suas descrições:
| Parâmetro | Tipo | Descrição |
|---|---|---|
greedyness | flutuador | Um número entre 0 e 1 determinando o quão ganancioso é o modelo sobre a tomada de decisões de coreferência (mais gananciosas significa mais links de núcleo de núcleo). O valor padrão é 0,5. |
max_dist | int | Quantas menciona a aparência de considerar possíveis antecedentes da menção atual. Diminuir o valor fará com que o sistema funcione mais rápido, mas com menos precisão. O valor padrão é 50. |
max_dist_match | int | O sistema considerará vincular a menção atual a um anterior mais que max_dist se eles compartilharem um substantivo ou um substantivo adequado. Nesse caso, ele parece max_dist_match . O valor padrão é 500. |
blacklist | booleano | Se o sistema resolver as coreferências para pronomes na lista a seguir: ["i", "me", "my", "you", "your"] . O valor padrão é verdadeiro (Coreference resolvido). |
store_scores | booleano | Se o sistema armazenar as pontuações para as coreferências nas anotações. O valor padrão é verdadeiro. |
conv_dict | Dict (STR, Lista (STR)) | Um dicionário de conversão que você pode usar para substituir as incorporações de palavras raras (chaves) por uma média das incorporações de uma lista de palavras comuns (valores). Ex: conv_dict={"Angela": ["woman", "girl"]} ajudará a resolver coreferências para Angela usando as incorporações para a woman e girl mais comuns em vez da incorporação de Angela . Atualmente, isso funciona apenas para palavras únicas (não para grupos de palavras). |
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' ) Aqui está um exemplo de como podemos usar o parâmetro conv_dict para ajudar a resolver as coreferências de uma palavra rara como um nome:
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! Um exemplo simples de script do servidor para integrar o neuralcoref em uma API REST é fornecido como exemplo em examples/server.py .
Para usá -lo, você precisa instalar o Falcon primeiro:
pip install falconVocê pode iniciar o servidor da seguinte forma:
cd examples
python ./server.pyE consulte o servidor assim:
curl --data-urlencode " text=My sister has a dog. She loves him. " -G localhost:8000Existem muitas outras maneiras pelas quais você pode gerenciar e implantar o NeuralCoref. Alguns exemplos podem ser encontrados no Universo Spacy.
Se você deseja treinar o modelo ou treiná -lo em outro idioma, consulte nossas instruções de treinamento e nossa postagem no blog