Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 1/36
Andrew Villazon Artigos Contato
Processamento de linguagem natural
clínica em Python
30 de abril de 2021
Pitão
Ao trabalhar com dados de saúde, algumas das informações mais valiosas estão na
Documentação Clínica. As observações feitas pelos médicos documentam muitos
detalhes, incluindo doenças presentes, tratamentos, medicamentos ou procedimentos,
fornecendo informações sobre a condição do paciente.
Neste guia, veremos como usar ferramentas modernas de PNL em Python para extrair
informações significativas de textos clínicos.
Pré-requisitos
https://www.andrewvillazon.com/
https://www.andrewvillazon.com/articles/
https://www.andrewvillazon.com/contact/
https://www.andrewvillazon.com/tags/python/
https://www.python.org/
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 2/36
Este guia fará algumas suposições, a saber:
Familiaridade com Python, incluindo importação de bibliotecas, loop e
acesso a atributos
Confortável usando o terminal ou prompt de comando para instalar pacotes
Uma compreensão básica dos objetivos e da terminologia do Processamento
de Linguagem Natural
Vamos combinar três bibliotecas para realizar PNL clínica:
spaCy : biblioteca NLP que fornece processamento de texto e orquestração.
scispaCy : uma biblioteca de componentes específicos clínicos e
biomédicos que se integram com spaCy.
negspaCy : para detectar negação de termos.
O objetivo deste guia não é um tutorial detalhado sobre cada uma dessas bibliotecas,
mas sim como utilizá-las para PNL clínica.
Visão geral
https://spacy.io/
https://allenai.github.io/scispacy/
https://github.com/jenojp/negspacy
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 3/36
Processando texto com spaCy
Processando Texto Clínico com ScispaCy
Negação com negspaCy
Conclusão
Leitura adicional
A primeira biblioteca que enfocaremos é spaCy , uma biblioteca de código aberto para
Processamento de Linguagem Natural em Python. spaCy atua como a base da PNL e
gerencia o processamento de texto ponta a ponta. Posteriormente, adicionaremos
componentes spaCy específicos para a clínica para lidar com Texto clínico.
Vamos ver como o spaCy funciona e explorar alguns de seus principais conceitos.
Conteúdo
Processando texto com spaCy
Pipelines
https://spacy.io/
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 4/36
Central para spaCy é a ideia de um pipeline de processamento , as etapas organizadas
para extrair informações de um texto. Essas etapas consistem em componentes
específicos encadeados que atuam em um texto para extrair dados estruturados.
O pipeline gera um documento ou Doc objeto contendo os dados estruturados extraídos
do texto.
Um pipeline executa tarefas como:
Tokenização: dividir um texto em unidades significativas conhecidas como
tokens.
Marcação de parte da fala �POS�� alocação de tipos de palavras (por
exemplo, substantivos, verbos) para tokens.
Análise de dependência: identificar como os tokens se relacionam entre si,
por exemplo, em "o gato preto", sabendo que o adjetivo "preto" está
relacionado ao gato.
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 5/36
Lematização: identificar a raiz, ou radical, de uma palavra, por exemplo,
corre, correu, correu, todos derivados da palavra "correr".
Named Entity Recognition �NER�� rotulando "entidades" ou coisas de
interesse. Em um contexto clínico, isso poderia ser a identificação da
presença de uma doença ou parte da anatomia.
Em geral, a primeira etapa no uso de spaCy é criar um objeto de pipeline.
No código a seguir, criamos um pipeline (simples) a partir da aula de inglês. O pipeline
do idioma inglês possui os componentes necessários para lidar com o texto do idioma
inglês.
A convenção em spaCy é atribuir um objeto pipeline a uma variável chamada nlp . Para
processar um texto com o pipeline, chamamos isso de passagem de texto. A convenção
também recomenda atribuir o resultado a uma variável chamada doc .
Criação de um pipeline
from spacy.lang.en import English
 
nlp = English()
 
doc = nlp("Get to the chopper!")
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 6/36
Chamar o nlp pipeline no texto produz um Doc objeto.
O Doc objeto (abreviação de Documento) funciona como um contêiner para os dados
identificados pelo pipeline de processamento, como tokens, classes gramaticais,
sentenças, lemas, entidades, etc.
O Doc se comporta como uma sequência. Quando usado em um loop for, o Doc objeto
retorna cada token em sua matriz de tokens.
O Objeto Doc
from spacy.lang.en import English
 
nlp = English()
doc = nlp("Iced that guy, cone a phrase.")
 
for token in doc:
 print(token)
Iced
that
guy
,
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 7/36
Uma das principais tarefas do pipeline de processamento é produzir tokens .
Na PNL, um token é uma sequência de caracteres agrupados que têm algum
significado. Os tokens padrão são coisas como palavras, números, pontuação, etc.
spaCy nos fornece uma grande quantidade de informações sobre um token, incluindo:
O texto do token
Se o token for um caractere do alfabeto, um dígito, minúsculas ou
maiúsculas, moeda, etc.
Se o token for semelhante a um e-mail, número, URL, etc.
Abaixo, examina uma seleção de atributos para os tokens em um Doc objeto.
cone
a
phrase
.
Tokens
 from spacy.lang.en import English
 
l E li h()
https://nlp.stanford.edu/IR-book/html/htmledition/tokenization-1.html
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 8/36
Para obter uma lista completa dos atributos disponíveis, consulte a documentação da
API spacy .
 nlp = English()
 doc = nlp("Two years from now, spam will be solved.")
 
 fmt_str = "{:<8}| {:<10}| {:<10}| {:<10}"
 print(fmt_str.format("token", "is_alpha","is_punct", "like_num"))
 
 for token in doc:
 print(fmt_str.format(token.text, token.is_alpha, token.is_punct, token.like_n
token | is_alpha | is_punct | like_num 
Two | 1 | 0 | 1 
years | 1 | 0 | 0 
from | 1 | 0 | 0 
now | 1 | 0 | 0 
, | 0 | 1 | 0 
spam | 1 | 0 | 0 
will | 1 | 0 | 0 
be | 1 | 0 | 0 
solved | 1 | 0 | 0 
. | 0 | 1 | 0 
Extração de informações com pipelines treinados
https://spacy.io/api/doc#attributes
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 9/36
O pipeline do idioma inglês que vimos anteriormente era bastante simples. O que
precisamos é extrair informações do texto. É aqui que entram os pipelines ou modelos
treinados.
Pipelines treinados são um tipo de pipeline que usa modelos estatísticos para fazerprevisões sobre tokens com base em seu contexto. Treinados em textos de exemplo
rotulados, esses modelos podem detectar classes gramaticais, relações de
dependência entre tokens e entidades nomeadas.
Os modelos não vêm com spaCy e são instalados separadamente. Os documentos
spaCy recomendam usar o download comando spaCy do terminal.
Uma vez instalado, um modelo aparecerá como um pacote instalado visível usando o
pip list comando do terminal.
Para obter a lista completa de modelos ingleses da equipe spaCy, consulte os
documentos .
Instalando modelos
python -m spacy download en_core_web_sm
https://spacy.io/models/en
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 10/36
Para usar um pipeline treinado, primeiro o criamos chamando a load() função spaCy ,
passando o nome de um modelo instalado. Neste código, estamos usando
en_core_web_sm um pequeno modelo baseado na web.
Como vimos anteriormente, chamamos nlp() o texto para processá-lo e criar um
Doc objeto.
Usando pipelines treinados
import spacy
 
nlp = spacy.load("en_core_web_sm")
 import spacy
 
 nlp = spacy.load("en_core_web_sm")
 doc = nlp("Early one morning, Peter opened the gate and walked out into the big g
 
 fmt_str = "{:<8}| {:<6}| {:<8}| {:<8}"
 print(fmt_str.format("token","pos", "label","parent"))
 
 for token in doc:
 print(fmt_str.format(token.text, token.pos_, token.ent_type_, token.head.text
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 11/36
Desta vez, o pipeline treinado adicionou algumas informações interessantes:
O lematizador determinou que "abriu" e "caminhou" a haste de abrir e andar.
O etiquetador da parte do discurso etiquetou os tokens ordenadamente.
O Named Entity Recognizer �NER� rotulou corretamente "Early", "one" e
"morning" como TIME entidades.
O NER também rotulou "Peter" como um PERSON .
token | pos | label | parent 
Early | ADV | TIME | morning 
one | NUM | TIME | morning 
morning | NOUN | TIME | opened 
, | PUNCT | | opened 
Peter | PROPN | PERSON | opened 
opened | VERB | | opened 
the | DET | | gate 
gate | NOUN | | opened 
and | CCONJ | | opened 
walked | VERB | | opened 
out | ADP | | walked 
into | ADP | | walked 
the | DET | | meadow 
big | ADJ | | meadow 
green | ADJ | | meadow 
meadow | NOUN | | into 
. | PUNCT | | opened 
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 12/36
Os pipelines e modelos treinados da spaCy são poderosos e fáceis de usar. Coletamos
informações estruturadas criando um objeto pipeline e chamando-o em um texto.
Agora que aprendemos sobre o uso do spaCy, vamos ver como combiná-lo com o
scispaCy para textos clínicos específicos.
Pipelines treinados funcionam bem; no entanto, há um problema. Sua eficácia depende
dos dados de treinamento e do domínio do modelo subjacente.
Por exemplo, pipelines treinados para conversas de chat provavelmente não serão
eficazes em Textos Clínicos. O que precisamos são modelos básicos especificamente
treinados para dados biomédicos.
scispaCy é uma biblioteca python que contém pipelines, modelos e componentes
spaCy para processamento de texto biomédico, científico ou clínico.
Ele possui alguns recursos adicionais que o tornam excelente para texto clínico: Um
detector de abreviações e um linker de entidade que vincula tokens a uma ontologia.
Processando Texto Clínico com ScispaCy
O que é scispaCy?
https://allenai.github.io/scispacy/
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 13/36
Semelhante aos modelos spaCy, os modelos scispaCy são instalados separadamente .
Os modelos scispaCy usam pip para instalar e uma URL de modelo.
A lista completa de modelos e URLs está disponível na página do scispaCy GitHub .
Uma nota sobre os modelos ScispaCy
No momento da escrita, scispaCy tem dois tipos de modelos, Detectores de Entidades e
Reconhecedores de Entidades Nomeadas �NER� .
Modelos de detecção entidade, en_core_sci_sm , en_core_sci_md , en_core_sci_lg , e
en_core_sci_scibert , detectar entidades, mas aplica-se um general ENTITY rótulo. Essas
entidades são usadas com componentes de pipeline adicionais, como o Detector de
abreviações, ou vinculadas a uma base de conhecimento.
Os modelos NER são mais específicos e treinados em um corpus anotado. Esses modelos
identificam uma entidade e dão a ela um rótulo distinto que é predefinido.
Instalação de modelos scispaCy
pip install <model_url>
https://github.com/allenai/scispacy#available-models
https://github.com/allenai/scispacy#available-models
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 14/36
Os pipelines scispaCy são criados e usados como outros pipelines treinados em spaCy,
ou seja, chamando o load() método spaCy e passando um nome de modelo. Depois de
feito, chamamos nlp() um texto para processá-lo.
Abaixo, criamos um pipeline scispaCy usando um modelo de detecção de entidade .
Em seguida, o chamamos em um texto clínico e inspecionamos os atributos do token.
Usando pipelines treinados com scispaCy
 import scispacy
 import spacy
 
 nlp = spacy.load("en_core_sci_sm")
 
 doc = nlp("An allograft was used to recreate the coracoacromial ligaments and the
 
 fmt_str = "{:<15}| {:<6}| {:<7}| {:<8}"
 print(fmt_str.format("token", "pos", "label", "parent"))
 
 for token in doc:
 print(fmt_str.format(token.text, token.pos_, token.ent_type_, token.head.text
token | pos | label | parent 
An | DET | | allograft
allograft | NOUN | ENTITY | used 
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 15/36
Observe como o pipeline fez a marcação de parte da fala, identificou dependências
sintáticas, mas também aplicou um ENTITY rótulo a alguns tokens.
Aqui fazemos o mesmo, mas substituímos o Detector de Entidade por um modelo NER .
was | VERB | | used 
used | VERB | | used 
to | PART | | recreate
recreate | VERB | ENTITY | used 
the | DET | | ligaments
coracoacromial | ADJ | ENTITY | ligaments
ligaments | NOUN | ENTITY | recreate
... etc
 import scispacy
 import spacy
 
 nlp = spacy.load("en_ner_bionlp13cg_md")
 
 doc = nlp("An allograft was used to recreate the coracoacromial ligaments and the
 
 fmt_str = "{:<15}| {:<6}| {:<7}| {:<8}"
 print(fmt_str.format("token", "pos", "label", "parent"))
 
 for token in doc:
 print(fmt_str.format(token.text, token.pos_, token.ent_type_, token.head.text
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 16/36
Os resultados são semelhantes, mas o Named Entity Recognizer aplicou um ORGAN rótulo
a alguns dos tokens.
O scispaCy vem com um AbbreviationDetector componente para ajudar na
decodificação de abreviações. As AbbreviationDetector funções como um componente
de pipeline regular de spacy e são adicionadas depois que um pipeline é carregado.
No spaCy 3.0, os componentesde pipeline personalizados devem ser registrados com
o pipeline. Para adicionar um componente de pipeline:
 token | pos | label | parent 
 An | DET | | allograft
 allograft | NOUN | ORGAN | used 
 was | VERB | | used 
 used | VERB | | used 
 to | PART | | recreate
 recreate | VERB | | used 
 the | DET | | ligaments
 coracoacromial | ADJ | ORGAN | ligaments
 ligaments | NOUN | ORGAN | recreate
 ... etc
Detecção de abreviatura
https://spacy.io/usage/v3#features-components
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 17/36
Importe o componente usando a import instrução
Carregue o pipeline treinado
Registre o componente no pipeline treinado com o add_pipe() método.
Em spaCy, as personalizações para Doc ou Token objetos, como aquelas feitas pelo
AbbreviationDetector , tornam-se disponíveis por meio de um _ atributo (sublinhado).
import spacy
from scispacy.abbreviation import AbbreviationDetector
 
nlp = spacy.load("en_core_sci_sm")
# Add the abbreviation pipe to the spacy pipeline.
nlp.add_pipe("abbreviation_detector")
 
doc = nlp(
 "Chronic lymphocytic leukemia (CLL), autoimmune hemolytic anemia, and oral ul
)
 
fmt_str = "{:<6}| {:<30}| {:<6}| {:<6}"
print(fmt_str.format("Short", "Long", "Starts", "Ends"))
 
for abrv in doc._.abbreviations:
 print(fmt_str.format(abrv.text, str(abrv._.long_form), abrv.start, abrv.end))
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 18/36
Para acessar o loop de abreviações na doc._.abbreviations coleção. Cada token nesta
coleção possui um long_form atributo que expande a abreviação.
Nenhuma abreviatura detectada
Você pode notar a AbbreviationDetector falha em identificar a abreviatura quando a forma
longa está ausente do texto. O algoritmo de Schwartz & Hearst implementado pelo
AbbreviationDetector requer pelo menos um par de formato longo e curto no texto antes de
identificar outras ocorrências de formato curto.
Para obter mais detalhes sobre como o algoritmo funciona, consulte o artigo original .
A EntityLinker classe do scispaCy é um componente de pipeline spaCy que vincula
entidades identificadas pelo pipeline treinado com várias ontologias clínicas. Em spaCy,
essas ontologias são chamadas de bases de conhecimento.
Short | Long | Starts| Ends 
CLL | Chronic lymphocytic leukemia | 4 | 5 
CLL | Chronic lymphocytic leukemia | 36 | 37 
Vinculando-se a UMLS e outros com o EntityLinker
https://pubmed.ncbi.nlm.nih.gov/12603049/
https://spacy.io/usage/processing-pipelines#pipelines
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 19/36
No momento da redação, o scispaCy oferece suporte ao seguinte: Sistema de
linguagem médica unificado , cabeçalhos de assuntos médicos , a ontologia RxNorm ,
a ontologia genética e a ontologia fenótipo humano .
O EntityLinker usa uma pesquisa aproximada de vizinhos mais próximos para
comparar cada entidade identificada com entradas na base de conhecimento.
As EntityLinker funções como um componente spaCy regular e são adicionadas a um
pipeline existente.
Para adicionar ao pipeline:
Importe o componente usando a import instrução
Carregue o pipeline treinado
Registre o componente no pipeline treinado com o add_pipe() método,
incluindo um dicionário de configuração opcional.
Configurando o EntityLinker
 import spacy
 import scispacy
 from scispacy.linking import EntityLinker
 
nlp = spacy load("en core sci sm")
https://www.nlm.nih.gov/research/umls/index.html
https://www.nlm.nih.gov/mesh/meshhome.html
https://www.nlm.nih.gov/research/umls/rxnorm/index.html
https://www.nlm.nih.gov/mesh/meshhome.html
https://www.nlm.nih.gov/research/umls/rxnorm/index.html
http://geneontology.org/
https://hpo.jax.org/app/
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 20/36
EntityLinker leva muito tempo para ser executado
A primeira vez que executar o EntityLinker levará muito tempo. Isso ocorre porque é
EntityLinker necessário fazer o download da Base de Conhecimento. Para o UMLS, este é
um arquivo json de 1 GB !. Depois de baixado, ele será armazenado em cache e usado no
futuro com muito mais rapidez.
Para configurar o EntityLinker , incluímos um dicionário opcional de pares de valores-
chave de configuração com a chamada para add_pipe()
O EntityLinker tem as seguintes opções de configuração:
opção modelo padrão Descrição
linker_name p Ontologia para vincular. Opções: umls ,
mesh , rxnorm , go , hpo
 nlp = spacy.load( en_core_sci_sm )
 nlp.add_pipe("scispacy_linker", config={"linker_name": "umls"})
Configurando o EntityLinker
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 21/36
opção modelo padrão Descrição
resolve_abbreviations bool False Resolva as abreviações antes de vincular. O
AbbreviationDetector (veja acima) deve
estar em andamento para que isso tenha
efeito.
max_entities_per_mention int 5 O número de entradas correspondentes a
serem retornadas da base de conhecimento.
threshold flutuador 0.7 O limite que um candidato a menção deve
atingir para ser adicionado à menção no
Doc como um candidato a menção.
k int 30 O número de vizinhos mais próximos a serem
consultados no gerador de candidato por
menção.
no_definition_threshold flutuador 0.95 O limite que um candidato a entidade deve
atingir para ser adicionado à menção no Doc
como um candidato a menção se o
candidato a entidade não tiver uma
definição.
filter_for_definitions bool True Inclua apenas entidades com definições na
base de conhecimento.
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 22/36
* reproduzido da página scispaCy GitHub
Em spaCy, as personalizações para Doc , Token ou Span objetos, como aquelas feitas
por EntityLinker , tornam-se disponíveis por meio de um _ atributo (sublinhado).
O EntityLinker adiciona um kb_ents atributo a cada entidade correspondida com êxito
a uma entrada da base de conhecimento. kb_ents é uma lista de tuplas de
correspondência contendo o identificador de conceito da base de conhecimento ( CUI )
e a pontuação de correspondência associada. O max_entities_per_mention define o
tamanho desta lista.
Usando resultados de EntityLinker
import spacy
import scispacy
from scispacy.linking import EntityLinker
 
nlp = spacy.load("en_core_sci_sm")
nlp.add_pipe("scispacy_linker", config={"linker_name": "umls", "max_entities_per_
 
doc = nlp("Patient has prostate cancer with metastatic disease to his bladder.")
 
fmt_str = "{:<20}| {:<11}| {:<6}"
print(fmt_str.format("Entity", "Concept ID", "Score"))
 
entity = doc.ents[2]
https://github.com/allenai/scispacy#entitylinker
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 23/36
Por último, podemos consultar a base de conhecimento para obter mais detalhes
usando o EntityLinker componente e o CUI.
Para consultar, primeiro recuperamos o EntityLinker do pipeline usando o
get_pipe() método. Em seguida, procuramos o CUI no
linker.kb.cui_to_entity dicionário usando o CUI como chave.for kb_entry in entity._.kb_ents:
 cui = kb_entry[0]
 match_score = kb_entry[1]
 
 print(fmt_str.format(entity.text, cui, match_score))
Entity | Concept ID | Score 
metastatic disease | C0027627 | 1.0 
metastatic disease | C2939419 | 1.0 
metastatic disease | C2939420 | 1.0 
metastatic disease | C4330673 | 0.8193445801734924
metastatic disease | C5205724 | 0.7593715190887451
metastatic disease | C0238258 | 0.7438488602638245
Consulta de entradas da base de conhecimento
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 24/36
 import spacy
 import scispacy
 from scispacy.linking import EntityLinker
 
 nlp = spacy.load("en_core_sci_sm")
 nlp.add_pipe("scispacy_linker", config={"linker_name": "umls", "max_entities_per_
 
 doc = nlp("Patient has prostate cancer with metastatic disease to his bladder.")
 
 linker = nlp.get_pipe("scispacy_linker")
 
 fmt_str = "{:<20}| {:<10}| {:<32}| {:<20}"
 print(fmt_str.format("Entity", "1st CUI", "Canonical Name", "Definition"))
 
 for entity in doc.ents:
 first_cuid = entity._.kb_ents[0][0]
 kb_entry = linker.kb.cui_to_entity[first_cuid]
 
 print(fmt_str.format(entity.text, first_cuid, kb_entry.canonical_name, kb_ent
Entity | 1st CUI | Canonical Name | Definition 
Patient | C0030705 | Patients | Individuals p
prostate cancer | C0376358 | Malignant neoplasm of prostate | A primary or 
metastatic disease | C0027627 | Neoplasm Metastasis | The transfer 
bladder | C0005682 | Urinary Bladder | A musculomemb
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 25/36
O aspecto final a considerar na PNL clínica é a negação - a contradição ou negação de
algo. Em um contexto clínico, a ausência documentada de algo, por exemplo, uma
doença, pode ser uma informação valiosa.
Para negação, podemos usar negspaCy , um componente de pipeline spaCy para negar
conceitos em um texto. negspaCy implementa o algoritmo Negex .
negspaCy implementa quatro padrões de negação:
pseudo negações: frases que parecem indicar negação, mas identificam
negativas duplas, por exemplo, "não descartado".
negações precedentes: frases de negação antes de uma entidade
seguintes negações: frases de negação após uma entidade
terminação: frases que cortam uma frase em partes, por exemplo,
"entretanto".
Como um componente spaCy, usamos negspaCy adicionando-o a um pipeline existente.
Negação com negspaCy
Usando negspaCy
https://github.com/jenojp/negspacy
https://doi.org/10.1006/jbin.2001.1029
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 26/36
Para adicionar ao pipeline:
Importe o componente usando a import instrução
Carregue o pipeline treinado
Registre o componente no pipeline treinado com o add_pipe() método,
incluindo um dicionário de configuração opcional.
Em spaCy, as personalizações para Doc , Token ou Span objetos, como aquelas feitas
por negspaCy, tornam-se disponíveis por meio de um _ atributo (sublinhado).
negspaCy adicionará um negex atributo a cada entidade no Doc objeto. Em entidades
negadas, este atributo é definido como True .
 import scispacy
 import spacy
 from negspacy.negation import Negex
 
 nlp = spacy.load("en_core_sci_sm")
 nlp.add_pipe("negex")
 import scispacy
 import spacy
 from negspacy.negation import Negex
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 27/36
Para configurar negspaCy, fornecemos um config dicionário opcional ao adicionar o
componente a um pipeline treinado.
 
 nlp = spacy.load("en_core_sci_sm")
 nlp.add_pipe("negex")
 
 doc = nlp("Patient has history of elevated cholesterol, but does not have ASHD, h
 
 fmt_str = "{:<22}| {:<10}"
 print(fmt_str.format("Entity", "Is negated"))
 
 for entity in doc.ents:
 print(fmt_str.format(entity.text, entity._.negex))
Entity | Is negated
Patient | 0 
history | 0 
elevated cholesterol | 0 
ASHD | 1 
hypertension | 1 
PVD | 1 
Configurando negspaCy
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 28/36
negspaCy tem as seguintes opções de configuração:
opção modelo padrão Descrição
"neg_termset" dict "en_clinical" O conjunto de termos de negação a ser usado
(veja abaixo como configurar). Inclui "en" :,
frases gerais de negação em inglês;
"en_clinical" , inglês geral e frases de
negação específicas da clínica;
"en_clinical_sensitive" , frases de negação
para entidades históricas.
"ent_types" Lista Uma lista de entidades nomeadas para excluir
da negação, por exemplo "PERSON" , "ORG"
"chunk_prefix" Lista Uma lista de negações anteriores quando as
negações são "agrupadas" como uma única
entidade (veja abaixo para mais detalhes)
 import scispacy
 import spacy
 from negspacy.negation import Negex
 
 nlp = spacy.load("en_core_sci_sm")
 nlp.add_pipe("negex", config={"chunk_prefix": ["no"]})
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 29/36
negspaCy define os padrões de negação e suas frases associadas como um conjunto
de termos . Um conjunto de termos pode ser visualizado importando a termset função,
criando um novo conjunto de termos e chamando termset.get_patterns() .
Para configurar o conjunto de termos que negspaCy usará, criamos um novo conjunto
de termos com a termset() função passando o nome do conjunto de termos escolhido.
Em seguida, incluímos o conjunto de termos no config dicionário ao adicionar negex ao
pipeline.
Escolhendo diferentes padrões de negação
 from negspacy.termsets import termset
 
 ts = termset("en_clinical")
 
 print(ts.get_patterns())
 import scispacy
 import spacy
 from negspacy.negation import Negex
 from negspacy.termsets import termset
 
 ts = termset("en_clinical_sensitive")
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 30/36
Para modificar o conjunto de termos, negspaCy fornece as funções add_patterns() e
remove_patterns() . Essas funções aceitam um dicionário com chaves correspondentes
a cada padrão de negação e uma lista de frases para adicionar ou remover.
Essas modificações devem ocorrer antes de adicionar negspaCy ao pipeline treinado.
Depois de modificado, inclua o novo conjunto de termos ao adicionar o negspaCy ao
pipeline.
 
 nlp = spacy.load("en_core_sci_sm")
 nlp.add_pipe("negex", config={"neg_termset": ts.get_patterns()})
Modificando padrões de negação
 import scispacy
 import spacy
 from negspacy.negation import Negex
 from negspacy.termsets import termset
 
 ts = termset("en_clinical")
 ts.add_patterns(
 {
 "preceding_negations":["unable"],
 "following_negations": ["was negative"]
 }
)
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 31/36
Se você estiver usando scispaCy, poderá descobrir que ele combina negações e
entidades em uma única entidade,por exemplo, "sem sangramento". Essa fragmentação
 )
 
 
 nlp = spacy.load("en_core_sci_sm")
 nlp.add_pipe("negex", config={"neg_termset": ts.get_patterns()})
 
 doc = nlp("Patient unable to walk or stand upright. The most recent bone scan was
 
 fmt_str = "{:<10}| {:<10}"
 print(fmt_str.format("Entity", "Is negated"))
 
 for entity in doc.ents:
 print(fmt_str.format(entity.text, entity._.negex))
Entity | Is negated
Patient | 0 
walk | 1 
stand | 1 
bone scan | 1 
negative | 0 
Tratamento quando negações e entidades são combinadas
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 32/36
faz com que a negspaCy perca a negação anterior.
Para resolver isso, podemos incluir uma "chunk_prefix" chave no config dicionário com
uma lista de negações que podem aparecer com uma entidade.
 import scispacy
 import spacy
 from negspacy.negation import Negex
 
 nlp = spacy.load("en_core_sci_sm")
 nlp.add_pipe("negex", config={"chunk_prefix":["no"]})
 
 doc = nlp("No bleeding.")
 
 fmt_str = "{:<12}| {:<10}"
 print(fmt_str.format("Entity", "Is negated"))
 
 for entity in doc.ents:
 print(fmt_str.format(entity.text, entity._.negex))
Entity | Is negated
No bleeding | 1 
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 33/36
Devido à sua natureza especializada, repleta de jargões e siglas, o Texto Clínico tem
sido difícil de utilizar de forma eficaz. No entanto, avanços recentes em algoritmos e
ferramentas melhores significam que isso está mudando.
Esperançosamente, este guia deu a você uma compreensão de como você pode usar
Python para extrair informações significativas de textos clínicos.
Por último, cobrimos muito, mas há muito mais por aí. Aqui está uma lista de recursos
adicionais para Processamento Clínico de Linguagem Natural.
spaCy101 é o curso online gratuito oferecido pela equipe spaCy. Ele cobre noções
básicas sobre spaCy até tópicos mais avançados, como otimização de pipelines para
velocidade e treinamento de modelos personalizados.
Conclusão
Para onde vamos a partir daqui
spaCy101
https://course.spacy.io/en/
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 34/36
Se você deseja começar com PNL clínica, recomendo fortemente começar com
spaCy101 .
O universo spaCy é uma lista com curadoria de projetos desenvolvidos com ou para
spaCy. As categorias Científica e Pesquisa apresentam projetos adicionais para PNL
clínica.
med7 é um modelo de spaCy de reconhecimento de entidade nomeada para rotulagem
de informações de medicamentos. As etiquetas incluem DOSAGEM, MEDICAMENTO,
DURAÇÃO, ROTA e muito mais. No momento em que foi escrito, não é compatível com
spaCy 3.0
mtsamples.com é um repositório de quase 5.000 relatórios e exemplos de amostras
médicas transcritas. Se você não conseguir trabalhar com o texto clínico real,
MTSAMPLES é uma boa alternativa.
universo spaCy
med7
MTSAMPLES
https://spacy.io/universe
https://github.com/kormilitzin/med7
https://mtsamples.com/
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 35/36
ClarityNLP é um aplicativo baseado em python para PNL clínica do Georgia Tech
Research Institute. De interesse é o size_measurement_finder módulo do Clarity , que
visa identificar medidas em textos clínicos.
Embora não seja um componente de pipeline spaCy, é possível importar o módulo para
o código existente e usá-lo a partir dele.
sqlalchemy é o Object-Relational-Mapper �ORM� mais popular do Python. ORMs
permitem definir objetos Python e mapear seus dados para um banco de dados.
sqlalchemy é útil para o armazenamento downstream de informações estruturadas
extraídas do Texto Clínico.
Processamento de texto clínico com Python
ClarityNLP e medição de tamanho
sqlalchemy e armazenamento de resultados
Leitura adicional
https://claritynlp.readthedocs.io/en/latest/
https://claritynlp.readthedocs.io/en/latest/developer_guide/algorithms/size_measurement_finder.html
https://docs.sqlalchemy.org/en/14/orm/tutorial.html
https://www.trivedigaurav.com/blog/clinical-text-processing-with-python/
30/06/2021 Clinical Natural Language Processing in Python | Andrew Villazon
https://www.andrewvillazon.com/clinical-natural-language-processing-python/#processing-clinical-text-with-scispacy 36/36
Casa Artigos Cerca de Contato
© Andrew Villazon 2020
https://www.andrewvillazon.com/
https://www.andrewvillazon.com/articles/
https://www.andrewvillazon.com/about/
https://www.andrewvillazon.com/contact/
https://github.com/andrewvillazon
https://www.gatsbyjs.com/

Mais conteúdos dessa disciplina