2016-11-08 70 views
3

那麼,我的目標是從文本中提取NE(Person)和與其相關的動詞。例如,我有這樣的文字:如何從文本中提取命名實體+動詞

鄧布利多轉過身走回了大街。哈利波特在毯子裏翻了個身,沒有醒來。

作爲一個理想的結果,我應該得到

鄧布利多轉身走了;哈利波特滾動

我使用斯坦福NER找到並標記人,然後刪除所有不含NE的句子。所以,最後我有一個純粹的文本,只包含帶有字符名稱的句子。 之後,我使用斯坦福德依賴。其結果是我得到這樣的(CONLLU輸出格式)水木清華:

1 Dumbledore _ _ NN _ 2 nsubj _ _ 
2 turned _ _ VBD _ 0 root _ _ 
3 and _ _ CC _ 2 cc _ _ 
4 walked _ _ VBD _ 2 conj _ _ 
5 back _ _ RB _ 4 advmod _ _ 
6 down _ _ IN _ 8 case _ _ 
7 the _ _ DT _ 8 det _ _ 
8 street _ _ NN _ 4 nmod _ _ 
9 . _ _ . _ 2 punct _ _ 

1 Harry _ _ NNP _ 2 compound _ _ 
2 Potter _ _ NNP _ 3 nsubj _ _ 
3 rolled _ _ VBD _ 0 root _ _ 
4 over _ _ IN _ 3 compound:prt _ _ 
5 inside _ _ IN _ 7 case _ _ 
6 his _ _ PRP$ _ 7 nmod:poss _ _ 
7 blankets _ _ NNS _ 3 nmod _ _ 
8 without _ _ IN _ 9 mark _ _ 
9 waking _ _ VBG _ 3 advcl _ _ 
10 up _ _ RP _ 9 compound:prt _ _ 
11 . _ _ . _ 3 punct _ _ 

而這正是我的所有問題開始。我知道這個人和動詞,但是如何從這種格式中提取它我不知道。 我想,我可以這樣做:在表中找到NN/NNP,找到它的'父',然後提取它的所有'孩子'字。理論上它應該工作。理論上。

問題是,如果任何人都可以想出任何其他的想法如何從文本中獲得一個人和它的行動?或者如果有更合理的方式來做到這一點?

我會很感激任何幫助!

回答

1

下面是一些示例代碼,以幫助您的問題:

import java.io.*; 
import java.util.*; 
import edu.stanford.nlp.ling.*; 
import edu.stanford.nlp.pipeline.*; 
import edu.stanford.nlp.semgraph.*; 
import edu.stanford.nlp.util.*; 



public class NERAndVerbExample { 

    public static void main(String[] args) throws IOException { 
    Properties props = new Properties(); 
    props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,depparse,entitymentions"); 
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 
    String text = "John Smith went to the store."; 
    Annotation annotation = new Annotation(text); 
    pipeline.annotate(annotation); 
    System.out.println("---"); 
    System.out.println("text: " + text); 
    System.out.println(""); 
    System.out.println("dependency edges:"); 
    for (CoreMap sentence : annotation.get(CoreAnnotations.SentencesAnnotation.class)) { 
     SemanticGraph sg = sentence.get(SemanticGraphCoreAnnotations.CollapsedDependenciesAnnotation.class); 
     for (SemanticGraphEdge sge : sg.edgeListSorted()) { 
     System.out.println(
       sge.getGovernor().word() + "," + sge.getGovernor().index() + "," + sge.getGovernor().tag() + "," + 
         sge.getGovernor().ner() 
         + " - " + sge.getRelation().getLongName() 
         + " -> " 
         + sge.getDependent().word() + "," + 
         +sge.getDependent().index() + "," + sge.getDependent().tag() + "," + sge.getDependent().ner()); 
     } 
     System.out.println(); 
     System.out.println("entity mentions:"); 
     for (CoreMap entityMention : sentence.get(CoreAnnotations.MentionsAnnotation.class)) { 
     int lastTokenIndex = entityMention.get(CoreAnnotations.TokensAnnotation.class).size()-1; 
     System.out.println(entityMention.get(CoreAnnotations.TextAnnotation.class) + 
       "\t" + 
       entityMention.get(CoreAnnotations.TokensAnnotation.class) 
         .get(lastTokenIndex).get(CoreAnnotations.IndexAnnotation.class) + "\t" + 
       entityMention.get(CoreAnnotations.NamedEntityTagAnnotation.class)); 
     } 
    } 
    } 
} 

我希望一些語法糖添加到斯坦福CoreNLP 3.8.0協助與實體提到工作。

爲了解釋一下這段代碼,基本上實體註釋符通過並將相同NER標記分組在一起。所以「約翰史密斯」被標記爲實體提及。

如果通過依賴關係圖,可以獲取每個單詞的索引。

同樣,如果您訪問實體提及的令牌列表,您還可以找到實體提及的每個單詞的索引。

有了更多的代碼,您可以將這些代碼鏈接在一起,並根據您的請求形成實體提及動詞對。

正如您在當前代碼中看到的,訪問實體提及信息非常麻煩,所以我將嘗試在3.8.0中改進它。

+0

哦,非常感謝你! 只是一個問題 - 我甚至不能編譯你的代碼來看看它是如何工作的。它給出了一個編譯信息'解析時到達文件末尾'。也許這只是我做錯了嗎? 是否有資源可以閱讀關於實體提及和索引的內容?順便說一句,我讀過關於SemRegex。在我看來,這個工具還可以幫助找到NE +動詞對。那真的是嗎? 無論如何,感謝您的幫助! –