본문 바로가기

개발/Big data

stemming postagging 합친것 정리

//csv파일을 opnlp로 스테밍 하고 포스테깅 해서 총 결과를 csv파일로 추출 하기


action.java

----------

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 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 Action {


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;


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());

} // outN에 출력 할 명사 넣기

else {

outN = sample.toString();

}


// stem 호출

outN = StemA(outN);


// 최종 outN 출력 하고 파일만들기

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();


}// posTag끝


public static String StemA(String outN) throws IOException {

Stemmer s = new Stemmer();// 스테머 객체 추가


// stem 시작

// stem 시작

outN = outN.toLowerCase();// 소문자 변환

for (int i = 0; i < outN.length(); i++) {

s.add(outN.charAt(i));

} // 한글자씩 스테머에 추가

s.stem(); // 스탬 함수 호출

String u;


u = s.toString(); // 스태밍 한 것을 스트링 u에 넣기

return u;

// stem 끝

// stem 끝

}


------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------


Stemmer.java

-------------

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 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 Action {


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;


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());

} // outN에 출력 할 명사 넣기

else {

outN = sample.toString();

}


// stem 호출

outN = StemA(outN);


// 최종 outN 출력 하고 파일만들기

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();


}// posTag끝


public static String StemA(String outN) throws IOException {

Stemmer s = new Stemmer();// 스테머 객체 추가


// stem 시작

// stem 시작

outN = outN.toLowerCase();// 소문자 변환

for (int i = 0; i < outN.length(); i++) {

s.add(outN.charAt(i));

} // 한글자씩 스테머에 추가

s.stem(); // 스탬 함수 호출

String u;


u = s.toString(); // 스태밍 한 것을 스트링 u에 넣기

return u;

// stem 끝

// stem 끝

}

}

------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------

StepforStem.java
-----------------

package test;


class StepforStem {


private char[] b;

private int i, /* offset into b */

i_end, /* offset to end of stemmed word */

j, k;

private static final int INC = 50;


public StepforStem() {


}


}


------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------