从文本中提取名词(Java)

时间:2009-12-11 17:40:33

标签: java nlp

有没有人知道从文本正文中仅提取名词的最简单方法?

我听说过TreeTagger tool,我试过试一试,但由于某种原因无法让它工作。

有什么建议吗?

感谢Phil

修改

 import org.annolab.tt4j.*; 
TreeTaggerWrapper tt = new TreeTaggerWrapper(); 

try { tt.setModel("/Nouns/english.par"); 

tt.setHandler(new TokenHandler() { 
     void token(String token, String pos, String lemma) {    
     System.out.println(token+"\t"+pos+"\t"+lemma); } }); 
     tt.process(words); // words = list of words 

     } finally { tt.destroy(); 
} 

这是我的代码,英语是语言。我收到错误:新类型TokenHandler(){}必须实现继承的抽象方法TokenHandler.token。我做错了吗?

7 个答案:

答案 0 :(得分:22)

首先,您必须对文字进行标记。这可能看起来微不足道(在任何空格分裂可能对你有用)但正式情况下它更难。然后你必须决定什么是名词。 “停车场”是否包含一个名词(停车场),两个名词(汽车,公园)或一个名词(公园)和一个形容词(汽车)?这是一个很难的问题,但是如果没有它,你可能会再次遇到这个问题。

“我看到xyzzy”是否识别出不在字典中的名词? “the”这个词可能将xyzzy标识为名词。

“时光飞逝如箭头”中的名词在哪里?与“像香蕉一样的果蝇”相比(感谢Groucho Marx)。

我们使用布朗标记器(Java)的(http://en.wikipedia.org/wiki/Brown_Corpus)在OpenNLP工具包(opennlp.tools.lang.english.PosTagger; opennlp.tools.postag.POSDictionary上http://opennlp.sourceforge.net/)找到名词用普通英语,我建议从那开始 - 它会为你做大部分的思考。否则请查看任何POSTAGgers (http://en.wikipedia.org/wiki/POS_tagger)或(http://www-nlp.stanford.edu/links/statnlp.html#Taggers)。

  

通过计算机进行词性标注,   通常区别于50   到150个单独的词性   英语,例如,NN表示单数   常用名词,NNS为复数常用名词   名词,NP为单数专有名词   (参见布朗使用的POS标签   语料库)

http://en.wikipedia.org/wiki/Natural_language_processing_toolkits中有一个非常完整的NLP工具包列表。我强烈建议您使用其中一个而不是尝试匹配Wordnet或其他集合。

答案 1 :(得分:1)

结帐LingPipe。据说这可以从英文文本中挑选named entities。但我必须承认NLP不是我的专业领域。

答案 2 :(得分:1)

根据您的修改:

错误说您必须覆盖抽象方法标记,并且您在匿名内部类中有令牌定义,但令牌覆盖的签名可能与TokenHandler中定义的抽象方法的签名不匹配?

答案 3 :(得分:1)

我的以下代码适用于TreeTagger:

public List<String> tag(String str) {
    final List<String> tagLemme = new ArrayList<String>();
    String[] tokens =tokenizer.tokenize(str);
      System.setProperty("treetagger.home", "parametresTreeTagger/TreeTagger");
    TreeTaggerWrapper tt = new TreeTaggerWrapper<String>();
    try {
        tt.setModel("parametresTreeTagger/english/english.par");
        tt.setHandler(new TokenHandler<String>(){
                public void token(String token, String pos, String lemma) {
                        tagLemme.add(token + "_" + pos + "_" + lemma);
                        //System.out.println(token + "_" + pos + "_" + lemma);
                }
        });
        tt.process(asList(tokens));
     } catch (IOException e) {
        e.printStackTrace();
      } catch (TreeTaggerException e) {
        e.printStackTrace();
    }
finally {
        tt.destroy();
}
    return tagLemme;
}

答案 4 :(得分:0)

查看WordNet数据库。这个词汇数据库。您可以尝试将每个单词与其匹配,并检查它是否是名词。

我怀疑你会有100%的精确度;数据库没有匹配英语中每个可能的单词,但至少它是一个开始。

答案 5 :(得分:0)

最简单的方法可能是将文本中的每个单词与名词词典进行比较。之后,您可能需要进行一些基本解析并接受结果中的近似正确性。很多在线参考解析自然语言。

答案 6 :(得分:0)

使用API​​(例如WS,RESTful)查找字典网站,您可以使用该网站运行搜索查询。

结果应该采用易于使用的格式(例如XML,JSON),当然应该包含单词的词汇类别。