web-dev-qa-db-fra.com

Est-il possible de former le système Stanford NER à reconnaître plus de types d'entités nommées?

J'utilise des bibliothèques NLP maintenant, (stanford et nltk) Stanford J'ai vu la partie démo mais je veux juste demander s'il est possible de l'utiliser pour identifier plus de types d'entités.

Donc, actuellement, le système NER de Stanford (comme le montre la démonstration) peut reconnaître les entités en tant que personne (nom), organisation ou emplacement. Mais les organisations reconnues se limitent aux universités ou à certaines grandes organisations. Je me demande si je peux utiliser son API pour écrire un programme pour plus de types d'entités, comme si mon entrée est "Apple" ou "Square", il peut le reconnaître comme une entreprise.

Dois-je créer mon propre ensemble de données de formation?

De plus, si jamais je veux extraire des entités et leurs relations entre elles, je pense que je devrais utiliser l'analyseur de dépendance stanford. Je veux dire, extraire d'abord les entités nommées et les autres parties étiquetées comme "nom" et trouver des relations entre elles.

Ai-je raison.

Merci.

27
JudyJiang

Oui, vous avez besoin de votre propre kit d'entraînement. Les modèles Stanford pré-formés reconnaissent uniquement le mot "Stanford" comme une entité nommée parce qu'ils ont été formés sur les données qui contenaient ce mot (ou des mots très similaires selon l'ensemble de fonctionnalités qu'ils utilisent, je ne sais pas ce que c'est) marqué comme une entité nommée.

Une fois que vous avez plus de données, vous devez les mettre dans le bon format décrit dans cette question et le tutoriel de Stanford.

12
mbatchkarov

Vous pouvez facilement former votre propre corpus de données.

Dans le Stanford NER FAQ la première question est de savoir comment former notre propre modèle pour le NER

Le lien est http://nlp.stanford.edu/software/crf-faq.shtml

Ainsi, par exemple, vous pouvez donner des données de formation comme

Produit OBJ
de O
Microsoft ORG

De même, vous pouvez créer vos propres données d'entraînement et créer un modèle, puis les utiliser pour obtenir la sortie souhaitée

9
Rohan Amrute

Il semble que vous souhaitiez former votre modèle NER personnalisé.

Voici un tutoriel détaillé avec le code complet:

https://dataturks.com/blog/stanford-core-nlp-ner-training-Java-example.php?s=so

Format des données d'entraînement

Les données d'apprentissage sont transmises sous forme de fichier texte où chaque ligne est une paire Word-label. Chaque mot de la ligne doit être étiqueté dans un format comme "Word\tLABEL", le mot et le nom de l'étiquette sont séparés par un onglet "\ t". Pour une phrase de texte, nous devons la décomposer en mots et ajouter une ligne pour chaque mot dans le fichier de formation. Pour marquer le début de la ligne suivante, nous ajoutons une ligne vide dans le fichier de formation.

Voici un exemple du fichier de formation d'entrée:

hp  Brand
spectre ModelName
x360    ModelName

home    Category
theater Category
system  0

horizon ModelName
zero    ModelName
dawn    ModelName
ps4 0

Selon votre domaine, vous pouvez créer un tel ensemble de données automatiquement ou manuellement. Construire un tel ensemble de données manuellement peut être très pénible, des outils comme un outil d'annotation NER peuvent aider à rendre le processus beaucoup plus facile.

Modèle de train

public void trainAndWrite(String modelOutPath, String prop, String trainingFilepath) {
   Properties props = StringUtils.propFileToProperties(prop);
   props.setProperty("serializeTo", modelOutPath);

   //if input use that, else use from properties file.
   if (trainingFilepath != null) {
       props.setProperty("trainFile", trainingFilepath);
   }

   SeqClassifierFlags flags = new SeqClassifierFlags(props);
   CRFClassifier<CoreLabel> crf = new CRFClassifier<>(flags);
   crf.train();

   crf.serializeClassifier(modelOutPath);
}

Utilisez le modèle pour générer des balises:

public void doTagging(CRFClassifier model, String input) {
    input = input.trim();
    System.out.println(input + "=>"  +  model.classifyToString(input));
}  

J'espère que cela t'aides.

5
user439521