Extração de Chunking e Informações
O que é Chunking?
O chunking, um dos processos importantes no processamento da linguagem natural, é usado para identificar classes gramaticais (POS) e frases curtas. Em outras palavras simples, com chunking, podemos obter a estrutura da frase. Também é chamadopartial parsing.
Padrões de pedaços e fendas
Chunk patternssão os padrões de tags de classes gramaticais (POS) que definem que tipo de palavras compõem um pedaço. Podemos definir padrões de chunk com a ajuda de expressões regulares modificadas.
Além disso, também podemos definir padrões para quais tipos de palavras não devem estar em um bloco e essas palavras não separadas são conhecidas como chinks.
Exemplo de implementação
No exemplo abaixo, junto com o resultado da análise da frase “the book has many chapters”, existe uma gramática para sintagmas nominais que combina um padrão chunk e um chink -
import nltk
sentence = [
("the", "DT"),
("book", "NN"),
("has","VBZ"),
("many","JJ"),
("chapters","NNS")
]
chunker = nltk.RegexpParser(
r'''
NP:{<DT><NN.*><.*>*<NN.*>}
}<VB.*>{
'''
)
chunker.parse(sentence)
Output = chunker.parse(sentence)
Output.draw()
Resultado
Como visto acima, o padrão para especificar um pedaço é usar chaves da seguinte maneira -
{<DT><NN>}
E para especificar uma fenda, podemos virar as chaves da seguinte maneira -
}<VB>{.
Agora, para um determinado tipo de frase, essas regras podem ser combinadas em uma gramática.
Extração de Informação
Nós passamos por taggers e também analisadores que podem ser usados para construir um mecanismo de extração de informações. Vamos ver um pipeline de extração de informações básicas -
A extração de informações tem muitas aplicações, incluindo -
- Business Intelligence
- Retomar a colheita
- Análise de mídia
- Detecção de sentimento
- Pesquisa de patentes
- Verificação de email
Reconhecimento de entidade nomeada (NER)
O reconhecimento de entidade nomeada (NER) é na verdade uma maneira de extrair algumas das entidades mais comuns, como nomes, organizações, localização, etc. Vejamos um exemplo que executou todas as etapas de pré-processamento, como tokenização de frase, marcação de POS, fragmentação, NER, e segue o pipeline fornecido na figura acima.
Exemplo
Import nltk
file = open (
# provide here the absolute path for the file of text for which we want NER
)
data_text = file.read()
sentences = nltk.sent_tokenize(data_text)
tokenized_sentences = [nltk.word_tokenize(sentence) for sentence in sentences]
tagged_sentences = [nltk.pos_tag(sentence) for sentence in tokenized_sentences]
for sent in tagged_sentences:
print nltk.ne_chunk(sent)
Parte do reconhecimento de entidade nomeada (NER) modificado também pode ser usado para extrair entidades como nomes de produtos, entidades biomédicas, nomes de marcas e muito mais.
Extração de relação
Extração de relação, outra operação de extração de informações comumente usada, é o processo de extração de diferentes relacionamentos entre várias entidades. Pode haver diferentes relações como herança, sinônimos, análogos, etc., cuja definição depende da necessidade de informação. Por exemplo, suponha que se desejamos escrever um livro, então a autoria seria uma relação entre o nome do autor e o nome do livro.
Exemplo
No exemplo a seguir, usamos o mesmo pipeline do IE, conforme mostrado no diagrama acima, que usamos até a relação de entidade nomeada (NER) e o estendemos com um padrão de relação baseado nas tags NER.
import nltk
import re
IN = re.compile(r'.*\bin\b(?!\b.+ing)')
for doc in nltk.corpus.ieer.parsed_docs('NYT_19980315'):
for rel in nltk.sem.extract_rels('ORG', 'LOC', doc, corpus = 'ieer',
pattern = IN):
print(nltk.sem.rtuple(rel))
Resultado
[ORG: 'WHYY'] 'in' [LOC: 'Philadelphia']
[ORG: 'McGlashan & Sarrail'] 'firm in' [LOC: 'San Mateo']
[ORG: 'Freedom Forum'] 'in' [LOC: 'Arlington']
[ORG: 'Brookings Institution'] ', the research group in' [LOC: 'Washington']
[ORG: 'Idealab'] ', a self-described business incubator based in' [LOC: 'Los Angeles']
[ORG: 'Open Text'] ', based in' [LOC: 'Waterloo']
[ORG: 'WGBH'] 'in' [LOC: 'Boston']
[ORG: 'Bastille Opera'] 'in' [LOC: 'Paris']
[ORG: 'Omnicom'] 'in' [LOC: 'New York']
[ORG: 'DDB Needham'] 'in' [LOC: 'New York']
[ORG: 'Kaplan Thaler Group'] 'in' [LOC: 'New York']
[ORG: 'BBDO South'] 'in' [LOC: 'Atlanta']
[ORG: 'Georgia-Pacific'] 'in' [LOC: 'Atlanta']
No código acima, usamos um corpus embutido chamado ieer. Neste corpus, as sentenças são marcadas até relação de entidade nomeada (NER). Aqui, só precisamos especificar o padrão de relação que queremos e o tipo de NER que queremos que a relação defina. Em nosso exemplo, definimos o relacionamento entre uma organização e um local. Extraímos todas as combinações desses padrões.