2017-08-20 5 views
0

J'ai une collection de Noun Phrases dire environ 10 000 mots. Je veux vérifier toutes les nouvelles données de texte d'entrée pour cette collection NP et extraire les phrases qui contiennent l'un de ces NP. Je ne veux pas exécuter de boucles pour chaque mot, car cela ralentit mon code. J'utilise Java et Stanford CoreNLP.Vérifier les mots dans le texte d'entrée de la collection de mots

+0

Avez-vous écrit encore de code, pour la version lente que vous avez actuellement? Si vous l'éditez dans la question et montrez-nous ce que vous avez, quelqu'un peut être en mesure d'améliorer et d'aider. – Assafs

Répondre

0

Un moyen simple et rapide de le faire est d'utiliser RegexNER pour identifier tous les exemples de n'importe quoi dans votre dictionnaire, et ensuite vérifier les étiquettes non "O" NER dans la phrase.

package edu.stanford.nlp.examples; 

import edu.stanford.nlp.ling.*; 
import edu.stanford.nlp.pipeline.*; 
import edu.stanford.nlp.util.*; 
import java.util.*; 
import java.util.stream.Collectors; 

public class FindSentencesWithPhrase { 

    public static boolean checkForNamedEntity(CoreMap sentence) { 
    for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)) { 
     if (token.ner() != null && !token.ner().equals("O")) { 
     return true; 
     } 
    } 
    return false; 
    } 

    public static void main(String[] args) { 
    Properties props = new Properties(); 
    props.setProperty("annotators", "tokenize,ssplit,pos,lemma,regexner"); 
    props.setProperty("regexner.mapping", "phrases.rules"); 
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 
    String exampleText = "This sentence contains the phrase \"ice cream\"." + 
     "This sentence is not of interest. This sentences contains pizza."; 
    Annotation ann = new Annotation(exampleText); 
    pipeline.annotate(ann); 
    for (CoreMap sentence : ann.get(CoreAnnotations.SentencesAnnotation.class)) { 
     if (checkForNamedEntity(sentence)) { 
     System.out.println("---"); 
     System.out.println(sentence.get(CoreAnnotations.TokensAnnotation.class). 
      stream().map(token -> token.word()).collect(Collectors.joining(" "))); 
     } 
    } 
    } 
} 

Le fichier "phrases.rules" devrait ressembler à ceci:

ice cream  PHRASE_OF_INTEREST  MISC 1 
pizza PHRASE_OF_INTEREST  MISC 1 
+0

Vous pouvez définir le paramètre "regexner.ignorecase" sur "true" ou "false" selon que vous souhaitez qu'il soit sensible à la casse ou non. – StanfordNLPHelp