代码之家  ›  专栏  ›  技术社区  ›  nixxo_raa

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

  •  3
  • nixxo_raa  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  0
  •   Leonardo Raele    7 年前

    我想你需要一份字典上所有现有名词的列表。然后,您只需在字符串上搜索它们中的每一个。

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

    http://www.desiquintans.com/nounlist

        2
  •  0
  •   Gabriel jaycer    7 年前

    从查看当前代码来看,它似乎只是在搜索标记以字符“NNP”开头的标记——这些只是专有名词。如果你还想包括普通名词,你应该包括任何标记以“NN”开头的标记。这将包括具体名词、抽象名词、集合名词等。

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

        3
  •  0
  •   nixxo_raa    4 年前

    使用此选项从文本中获取所有名词;此代码将提取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());
            }