如何用Java提取所有类型的名词?

时间:2018-02-09 18:09:07

标签: java nlp stanford-nlp

我想从文本中获取所有类型的名词我该如何获得?

import edu.stanford.nlp.tagger.maxent.MaxentTagger;
import java.io.BufferedReader;
import java.io.FileReader;


public class Noun_Code {


    public static void main(String[] args) {
        try{

            FileReader file = new FileReader("C:\\Users\\NaB33L NaQ33B!\\Desktop\\TaggerDemo.java");
            @SuppressWarnings("resource")
            BufferedReader reader = new BufferedReader(file);

            String text = "";
            String line = reader.readLine();
            while(line!=null){
                text +=line;
                line = reader.readLine();
            }
            System.out.println(text);
            String tagged;

            MaxentTagger LibAddress =  new MaxentTagger("F:\\stanford-postagger-2015-04-20\\stanford-postagger-2015-04-20\\models/english-left3words-distsim.tagger");
            tagged = LibAddress.tagString(text);

            System.out.println("Frequency : "+tagged);

            String[] words = tagged.split(" ");

            String[] keyword1 = new String[words.length];
            int len=keyword1.length;
        for(int i = 0;i<words.length;i++)
        {
            int length= words[i].length();
            char chr1 = (char) (words[i].charAt(length-3));
            char chr2 = (char) (words[i].charAt(length-2));
            char chr3 = (char) (words[i].charAt(length-1));
            if(chr1=='N' && chr2=='N' && chr3=='P')
            {
            keyword1[i] = words[i]; 
            System.out.println(keyword1[i]);
            }
            else
            {
            keyword1[i] = "-1";
            }
        }
            int var =0;
        for(int i = 0;i<keyword1.length;i++)
        {
            if(keyword1[i].equalsIgnoreCase("-1"))
            {
            var=var+1;
            }
        }
            len=len-var;
            String[] original = new String[len];
            String[] temp = new String[len];
            int e=0;
        for(int i = 0;i<keyword1.length;i++)
        {
            if(keyword1[i].equalsIgnoreCase("-1")){}
            else
            {original[e] = keyword1[i];
            temp[e] = keyword1[i];
            e=e+1;
            }
        }
        }
        catch(Exception ex){System.out.println("Exception :"+ex);}
}
}   

请指导我,获取所有类型的名词。以上是我正在使用的所有代码。我想要以下所有名词类型: 普通名词 普通名词是指一般人或事物的名词,例如男孩,国家,桥梁,城市,出生,一天,幸福。

专有名词 专有名词是标识特定人物,地点或事物的名称,例如史蒂文,非洲,伦敦,星期一。在书面英语中,专有名词以大写字母开头。

具体名词 具体名词是指人和物理上存在的东西,可以被看见,触摸,闻到,听到或品尝的名词。例子包括狗,建筑,咖啡,树,雨,沙滩,曲调。

抽象名词 抽象名词是指一种名词,它指的是思想,品质和条件 - 无法看到或触摸的东西以及没有物理现实的东西,例如:真相,危险,幸福,时间,友谊,幽默。

集体名词 集体名词指的是人或事物的群体,例如观众,家庭,政府,团队,陪审团。在美式英语中,大多数集体名词都被视为单数,带有单数动词:整个家庭都在桌旁。

3 个答案:

答案 0 :(得分:1)

我相信你需要一本字典上所有现有名词的清单。然后,您只需在字符串中搜索每个字符串。

您可以使用以下链接中的列表。它包含4554个名词。

http://www.desiquintans.com/nounlist

答案 1 :(得分:1)

从眼球看你当前的代码,看起来好像它只搜索标签以字符'NNP'开头的标记 - 这些只是专有的名词。如果您还想包含常用名词,则应包含标记以“NN”开头的任何标记。这将包括具体名词,抽象名词,集体名词等。

您可以在此处找到完整的代码集:https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html

答案 2 :(得分:0)

使用它从文本中获取所有名词;此代码将提取所有类型为 NN、NNS、NNP、NNPS、PRP 等的名词 注意:为此使用了 OpenNLP。 这是Alphabetical list of part-of-speech tags used in the Penn Treebank Project的链接:

public void getNounPhrases(Parse p) {
        if (p.getType().equals("NN") || p.getType().equals("NNS") || p.getType().equals("NNP") || p.getType().equals("NNPS")|| p.getType().equals("PRP")) {
             nounPhrases.add(p.getCoveredText());
        }