/**
* @version $Id: Morpheme.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2011/08/26 17:26:01
* @author sanenori-makiya
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.correction.morphem;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import com.tida_okinawa.corona.common.Encoding;
import com.tida_okinawa.corona.correction.common.ExternalProgramExitException;
import com.tida_okinawa.corona.correction.morphem.preference.MorphemePreference;
/**
* @author sanenori-makiya
*/
public class Morpheme {
final MorphemeRelationProcessor mp;
/**
*
* @param mp
* Juman/KNPの実行処理
*/
public Morpheme(MorphemeRelationProcessor mp) {
this.mp = mp;
}
/**
* 形態素解析(句点で区切って処理する)
*
* @param text
* must not null
* @param doKnp
* 係り受け解析を行う
* @param kuten
* 句点
* @param err
* エラー出力先
* @return 形態素解析結果
*/
public List<String> process(String text, boolean doKnp, OutputStream err, String... kuten) {
return process(text, doKnp, err, MorphemePreference.convSJIS(), kuten);
}
/**
* 形態素解析(句点で区切って処理する)
*
* @param text
* must not null
* @param doKnp
* 係り受け解析を行う
* @param kuten
* 句点
* @param err
* エラー出力先
* @param convSJIS
* 入出力ストリームをSJIS(MS932)で行うかどうか
* @return 形態素解析結果
*/
public List<String> process(String text, boolean doKnp, OutputStream err, boolean convSJIS, String... kuten) {
// 句点や"?"を改行に置き換える
// note: 長い文のままだとknpでメモリ不足になる
for (String k : kuten) {
text = text.replaceAll(k, k + "\n"); //$NON-NLS-1$
}
List<String> morphemeRelationCorrectionList = process(text, doKnp, convSJIS, err);
return morphemeRelationCorrectionList;
}
/**
* 形態素解析
*
* @param text
* 解析対象テキスト
* @param doKnp
* 係り受け解析を実行する場合、true
* @param convSJIS
* 入出力ストリームをSJIS(MS932)に変換するならtrue
* @param err
* エラー出力用ストリーム
* @return 形態素解析結果
*/
public List<String> process(String text, boolean doKnp, boolean convSJIS, OutputStream err) {
/* UIへ返却するリスト */
List<String> morphemeRelationCorrectionList = new ArrayList<String>();
/* 形態素、係り受け解析実行 */
try {
// 文末が改行でないとJumanが終わらない?
if (!text.endsWith("\n")) { //$NON-NLS-1$
text += "\n"; //$NON-NLS-1$
}
byte[] inputBytes;
if (convSJIS) {
inputBytes = text.getBytes(Encoding.MS932.toString());
} else {
inputBytes = text.getBytes();
}
ByteArrayOutputStream output = new ByteArrayOutputStream();
// ByteArrayOutputStream error = new ByteArrayOutputStream();
ByteArrayInputStream input = new ByteArrayInputStream(inputBytes);
mp.exec(input, output, err, doKnp);
/* 形態素、係り受け解析結果修正クラスのインスタンス化 */
MorphemeRelationReader mrr = new MorphemeRelationReader();
/* 形態素、係り受け解析結果修正 (格解析抽出) */
// ByteArrayInputStream result_bais = new ByteArrayInputStream(result_baos.toByteArray());
// mrr.read(result_bais, Encoding.MS932);
InputStreamReader output_r;
if (convSJIS) {
output_r = new InputStreamReader(new ByteArrayInputStream(output.toByteArray()), Encoding.MS932.toString());
} else {
output_r = new InputStreamReader(new ByteArrayInputStream(output.toByteArray()));
}
mrr.read(new BufferedReader(output_r));
morphemeRelationCorrectionList = mrr.getResultList();
} catch (IOException e) {
e.printStackTrace(System.err);
} catch (InterruptedException e) {
e.printStackTrace(System.err);
} catch (ExternalProgramExitException e) {
e.printStackTrace(System.err);
}
return morphemeRelationCorrectionList;
}
}