PNL | Extracción de etiquetas de ubicación

Se pueden usar diferentes tipos de subclases ChunkParserI para identificar los fragmentos LOCATION. Ya que utiliza el corpus de diccionarios geográficos para identificar palabras de ubicación. El corpus del nomenclátor es un WordListCorpusReader classque contiene las siguientes palabras de ubicación:

  • Nombres de países
  • Estados de EE. UU. y abreviaturas
  • estados mexicanos
  • Principales ciudades de EE. UU.
  • provincias canadienses

LocationChunker classbuscando palabras que se encuentran en el corpus de diccionarios geográficos iterando sobre una oración etiquetada. Crea un fragmento de UBICACIÓN usando etiquetas IOB cuando encuentra una o más palabras de ubicación. Las etiquetas IOB LOCATION se producen en el iob_locations()y el parse()método convierte las etiquetas IOB en Tree.

Código #1: clase LocationChunker

from nltk.chunk import ChunkParserI
from nltk.chunk.util import conlltags2tree
from nltk.corpus import gazetteers
  
class LocationChunker(ChunkParserI):
    def __init__(self):
        self.locations = set(gazetteers.words())
        self.lookahead = 0
        for loc in self.locations:
            nwords = loc.count(' ')
        if nwords > self.lookahead:
            self.lookahead = nwords

 
Código #2: método iob_locations()

def iob_locations(self, tagged_sent):
      
    i = 0
    l = len(tagged_sent)
    inside = False
      
    while i < l:
        word, tag = tagged_sent[i]
        j = i + 1
        k = j + self.lookahead
        nextwords, nexttags = [], []
        loc = False
          
    while j < k:
        if ' '.join([word] + nextwords) in self.locations:
            if inside:
                yield word, tag, 'I-LOCATION'
            else:
                yield word, tag, 'B-LOCATION'
            for nword, ntag in zip(nextwords, nexttags):
                yield nword, ntag, 'I-LOCATION'
                loc, inside = True, True
                i = j
                break
              
        if j < l:
            nextword, nexttag = tagged_sent[j]
            nextwords.append(nextword)
            nexttags.append(nexttag)
            j += 1
        else:
            break
        if not loc:
            inside = False
            i += 1
            yield word, tag, 'O'
              
    def parse(self, tagged_sent):
        iobs = self.iob_locations(tagged_sent)
        return conlltags2tree(iobs)

 
Código #3: use la clase LocationChunker para analizar la oración

from nltk.chunk import ChunkParserI
from chunkers import sub_leaves
from chunkers import LocationChunker
  
t = loc.parse([('San', 'NNP'), ('Francisco', 'NNP'),
               ('CA', 'NNP'), ('is', 'BE'), ('cold', 'JJ'), 
               ('compared', 'VBD'), ('to', 'TO'), ('San', 'NNP'),
               ('Jose', 'NNP'), ('CA', 'NNP')])
  
print ("Location : \n", sub_leaves(t, 'LOCATION'))

Producción :

Location : 
[[('San', 'NNP'), ('Francisco', 'NNP'), ('CA', 'NNP')], 
[('San', 'NNP'), ('Jose', 'NNP'), ('CA', 'NNP')]]

Publicación traducida automáticamente

Artículo escrito por Mohit Gupta_OMG 🙂 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *