web-dev-qa-db-fra.com

Comment utiliser spaCy pour créer une nouvelle entité et apprendre uniquement à partir de la liste de mots clés

J'essaie d'utiliser spaCy pour créer une nouvelle catégorisation d'entité 'Espèces' avec une liste de noms d'espèces, par exemple peut-il trouver ici .

J'ai trouvé un tutoriel pour former un nouveau type d'entité à partir de ce tutoriel spaCy (code Github ici ). Cependant, le problème est que je ne veux pas créer manuellement une phrase pour chaque nom d'espèce car cela prendrait beaucoup de temps.

J'ai créé ci-dessous les données d'entraînement, qui ressemblent à ceci:

TRAIN_DATA = [('Bombina',{'entities':[(0,6,'SPECIES')]}),
 ('Dermaptera',{'entities':[(0,9,'SPECIES')]}),
  .... 
]

La façon dont j'ai créé l'ensemble de formation est la suivante: au lieu de fournir une phrase complète et l'emplacement de l'entité correspondante, je ne fournis que le nom de chaque espèce, et les index de début et de fin sont générés par programme:

[(0, 6, 'ESPÈCES')]

[(0, 9, 'ESPÈCES')]

Ci-dessous le code de formation est ce que j'ai utilisé pour former le modèle. (Code copié à partir du lien hypertexte ci-dessus)

nlp = spacy.blank('en')  # create blank Language class

 # Add entity recognizer to model if it's not in the pipeline 
 # nlp.create_pipe works for built-ins that are registered with spaCy 
 if 'ner' not in nlp.pipe_names: 
     ner = nlp.create_pipe('ner') 
     nlp.add_pipe(ner) 
 # otherwise, get it, so we can add labels to it 
 else: 
     ner = nlp.get_pipe('ner') 

 ner.add_label(LABEL)   # add new entity label to entity recognizer


  if model is None: 
      optimizer = nlp.begin_training() 
  else: 
      # Note that 'begin_training' initializes the models, so it'll zero out 
      # existing entity types. 
      optimizer = nlp.entity.create_optimizer() 

     # get names of other pipes to disable them during training 
     other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner'] 
     with nlp.disable_pipes(*other_pipes):  # only train NER 
         for itn in range(n_iter): 
             random.shuffle(TRAIN_DATA) 
             losses = {} 
             for text, annotations in TRAIN_DATA: 
                 nlp.update([text], [annotations], sgd=optimizer, drop=0.35,  losses=losses) 
             print(losses) 

Je suis nouveau en PNL et spaCy s'il vous plaît laissez-moi savoir si je l'ai fait correctement ou non. Et pourquoi ma tentative a échoué à la formation (quand je l'ai exécutée, cela génère une erreur).


[MISE À JOUR]

La raison pour laquelle je souhaite alimenter le mot clé uniquement dans le modèle de formation est que, dans l'idéal, j'espère que le modèle apprendra ces mots clés en premier, et une fois qu'il identifiera un contexte qui contient le mot clé, il apprendra le contexte associé, et donc, améliorer le modèle actuel.

À première vue, cela ressemble plus à une expression régulière. Mais avec de plus en plus de données alimentées, le modèle apprendra en continu et pourra enfin identifier de nouveaux noms d'espèces qui n'existaient pas auparavant dans l'ensemble de formation d'origine.


Merci, Katie

10
katie lu

L'avantage de la formation du module de reconnaissance d'entité nommée pour détecter SPECIES dans votre texte est que le modèle sera non seulement capable de reconnaître vos exemples, mais aussi de généraliser et reconnaître d'autres espèces dans leur contexte. Si vous souhaitez uniquement trouver un ensemble fixe de termes et pas plus, une approche plus simple et basée sur des règles pourrait mieux vous convenir. Vous pouvez trouver des exemples et des détails de cela ici .

Si vous voulez que le modèle généralise et reconnaisse votre type d'entité en contexte, vous devez également lui montrer des exemples d'entités en contexte. C'est actuellement le problème avec vos exemples de formation: vous ne montrez que les mots simples du modèle, pas les phrases contenant les mots. Pour obtenir de bons résultats, les données avec lesquelles vous entraînez le modèle doivent être aussi proches que possible des données que vous souhaitez analyser ultérieurement.

Bien qu'il existe d'autres approches pour les modèles d'entraînement sans ou avec moins d'exemples étiquetés, la stratégie la plus simple pour collecter des données d'entraînement pour former votre modèle spaCy est de ... étiqueter les données d'entraînement. Cependant, il existe quelques astuces que vous pouvez utiliser pour rendre cela moins douloureux:

  • Commencez par une liste d'espèces et utilisez Matcher ou PhraseMatcher pour les trouver dans vos documents. Pour chaque correspondance, vous obtiendrez un objet Span, afin que vous puissiez extraire la position de début et de fin de la plage dans le texte. Cela vous permet de créer facilement un tas d'exemples automatiquement. Vous pouvez trouver plus de détails à ce sujet ici .

  • Utilisez vecteurs de mots pour trouver des termes plus similaires aux entités que vous recherchez, afin d'obtenir plus d'exemples que vous pouvez rechercher dans votre texte en utilisant l'approche ci-dessus. Je ne sais pas comment spaCy modèles vectoriels fera pour votre espèce, car les termes sont assez spécifiques. Donc, si vous avez un grand corpus de texte brut contenant des espèces, vous devrez peut-être former vos propres vecteurs.

  • Utilisez un outil d'étiquetage ou d'annotation de données. Il existe des solutions open source comme Brat , ou, une fois que vous devenez plus sérieux en matière d'annotation et de formation, vous pouvez également consulter notre outil d'annotation Prodigy , qui est une solution commerciale moderne qui s'intègre parfaitement avec spaCy (Avertissement: je suis l'un des mainteneurs de spaCy).

14
Ines Montani