본문 바로가기

개발/Big data

opennlp를 사용하여 csv파일을 가져와 명사 추출 하고 csv파일로 내보내기( extract noun from csv file with openlp)

package hh;


import java.io.File;

import java.io.FileInputStream;

import java.io.FileReader;

import java.io.IOException;

import java.io.PrintWriter;

import java.io.StringReader;


import opennlp.tools.cmdline.postag.POSModelLoader;

import opennlp.tools.postag.POSModel;


import com.opencsv.CSVReader;


import opennlp.tools.cmdline.PerformanceMonitor;

import opennlp.tools.cmdline.postag.POSModelLoader;

import opennlp.tools.postag.POSModel;

import opennlp.tools.postag.POSSample;

import opennlp.tools.postag.POSTaggerME;

import opennlp.tools.tokenize.Tokenizer;

import opennlp.tools.tokenize.TokenizerME;

import opennlp.tools.tokenize.TokenizerModel;

import opennlp.tools.tokenize.WhitespaceTokenizer;

import opennlp.tools.util.ObjectStream;

import opennlp.tools.util.PlainTextByLineStream;



public class hello {


public static void main(String args[]) throws IOException {


POSTag();


}


public static void POSTag() throws IOException {


POSModel model1 = new POSModelLoader().load(new File("en-pos-maxent.bin"));


PerformanceMonitor perfMon = new PerformanceMonitor(System.err, "sent");


POSTaggerME tagger = new POSTaggerME(model1);


FileInputStream is = new FileInputStream("en-token.bin");


TokenizerModel model2 = new TokenizerModel(is);


Tokenizer tokenizer = new TokenizerME(model2);


//


PrintWriter pw = new PrintWriter(new File("test.csv")); // 프로젝트 파일로 가보면

// 이이름으로 저장

// 되어있다. ,

// return file

// name.


StringBuilder sb = new StringBuilder();


sb.append("id");


sb.append(',');


sb.append("abstract");


sb.append('\n');


//


String csvFileName = "CN_ABE.csv"; // 자신의 csv파일을 프로젝트에 추가해야함 , put your

// csv


CSVReader csvReader = new CSVReader(new FileReader(csvFileName));


String[] row = null;

String outN;

// int count =0;


System.out.println("not yet to while");


perfMon.start();


while ((row = csvReader.readNext()) != null) { //csv 파일 끝까지 

System.out.println("["+row[0]+"] , ");// 논문 번호  

sb.append("["+row[0]+"]");

sb.append(" , ");

String tokens[] = tokenizer.tokenize(row[1].toString());


for (String a : tokens) {


ObjectStream<String> lineStream = new PlainTextByLineStream(new StringReader(a));


String[] noun_s;


String whitespaceTokenizerLine[] = WhitespaceTokenizer.INSTANCE.tokenize(a);


String[] tags = tagger.tag(whitespaceTokenizerLine);


POSSample sample = new POSSample(tags, whitespaceTokenizerLine);


String sampletoString = null;


char noun;


noun = sample.toString().charAt(0);


if (noun == 'N') {// 가장 앞글자가 N인것, 즉 명사만 추출 , extract Noun

if(sample.toString().indexOf("_")<=3 || sample.toString().indexOf("_")<=4){//NNPS_(4) , 글자증 '_'가 포함된 글자가있을수도 있어서 

outN = sample.toString().substring(sample.toString().indexOf("_") + 1, sample.toString().length());

}

else{

outN = sample.toString();

}

System.out.print(outN);


sb.append(outN);


System.out.print(",");


sb.append(',');


}


}


System.out.println("");//논문의 abstract가 끝나면 

sb.append('\n');


// perfMon.incrementCounter();


// perfMon.stopAndPrintFinalResult();


}


pw.write(sb.toString());


pw.close();


csvReader.close();


}


}