【问题标题】:Extract Nouns from Text (Java)从文本中提取名词 (Java)
【发布时间】:2010-12-25 18:29:10
【问题描述】:

有谁知道从正文中只提取名词的最简单方法?

我听说过TreeTagger tool,我尝试过尝试,但由于某种原因无法使用。

有什么建议吗?

谢谢菲尔

编辑:

 导入 o​​rg.annolab.tt4j.*;
TreeTaggerWrapper tt = 新 TreeTaggerWrapper();

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

tt.setHandler(new TokenHandler() {
     无效令牌(字符串令牌,字符串位置,字符串引理){
     System.out.println(token+"\t"+pos+"\t"+lemma); } });
     tt.process(单词); // 单词 = 单词列表

     } 最后 { tt.destroy();
} 

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

【问题讨论】:

  • 介意解释一下 TreeTagger 到底有什么问题?
  • 您能具体说明您的问题吗?尤其是语言会很高兴知道......例如德语有一个很好的优势,即所有名词的第一个字母都大写。
  • 我不熟悉 TreeTagger API,但我会先在 setHandler() 之外实例化 TokenHandler - 这可能会给出更清晰的信息。我的猜测是 TokenHandler 是抽象的,但是 ...
  • 另见:stackoverflow.com/questions/608743/…。这与专有名词有关。

标签: java nlp


【解决方案1】:

首先,您必须对文本进行标记。这可能看起来微不足道(在任何空格处拆分可能对您有用),但正式它更难。然后你必须决定什么是名词。 “the car park”是包含一个名词(car park)、两个名词(car, park)还是一个名词(park)和一个形容词(car)?这是一个难题,但同样,您也许可以不用它。

“I saw the xyzzy”能识别字典中没有的名词吗? “the”这个词可能将 xyzzy 标识为一个名词。

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

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

在计算机的词性标注中, 通常从 50 到 150 个单独的词性 英语,例如,NN 表示单数 普通名词,NNS 为复数 common 名词,NP 表示单数专有名词 (请参阅 Brown 中使用的 POS 标签 语料库)

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

【讨论】:

  • +1 以获得解释。有些人似乎认为 NLP 并不那么难,实际上它是计算中最复杂的事情之一。有大量的极端情况,当处理的语言突然发生变化时,一切都将毫无用处。而且,在更理论的层面上,您还存在一个问题,即名词、动词或代词等有多个定义。
  • @Maximilian 感谢您的支持。我们同意这很难。幸运的是,我们只是试图解释化学家编写的语言,这要容易得多!
  • 优秀的帖子,谢谢。目前正在下载 lingpipe,不过我在 windows 上,希望它没有很多讨厌的 .sh 脚本!哈哈
  • 我们使用了LingPipe,但它没有开放,我们必须有一个开放的系统来进行分发。如果你只是个人使用我认为没有问题。
  • 不幸的是,现在似乎没有证据表明格鲁乔确实说过这句话。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    根据您的编辑:

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

    【讨论】:

      【解决方案4】:

      我的以下代码适用于 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;
      }
      

      【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 这不太准确。例如,以“他正在步行去学校”这个句子为例。与“他说走路很累。”现在,在第二句中,“walking”是一个名词(通过动名词名词化的动词),但在第一句中,它是动词“to walk”的进行形式。而且这只是一个例子,还有更多的问题。
      【解决方案6】:

      查找具有 API(例如 WS、RESTful)的词典网站,您可以使用该 API 来运行搜索查询。

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2016-06-29
          • 2011-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-09
          相关资源
          最近更新 更多