'Morphemer'에 해당되는 글 1건
- 2009.01.16 Morphemer
package filter;
import java.util.StringTokenizer;
public class Morphemer {
private String[] bpstWord ={"だから", "から", "まで", "あまり", "まり", "ただし", "やらだけ",
"らかし", "ずに", "かり", "たぶん", "ながら", "たくさん", "(", ")", "(", ")", "いなあ", "うえで", "それで",
"しまった", "しまう", "よう", "こうした", "たち", "そう", "あらかた", "でしょうか", "でも", "らどう",
"すごく", "でき,", "ぶり", "ください", "必ず", " ", ".", "。", "、", ",", "?", "“", "”",
"「", "」", "【", "】", "は", "を", "の", "ため", "さん", "ころ", "しかし", "と", "も", "よく", "ここ"};
private String[] verbWord = {"ます", "あります", "ありません", "がった", "する",
"てす", "ている", "ない", "ないてす", "う", "つ", "る", "ぬ", "む", "ぶ", "く", "ぐ",
"す", "ましす", "いた", "った", "した", "んた", "いたし", "ったし", "したし", "ただし",
"んたし", "いて", "って", "して", "んで", "て", "がいる", "がある", "させる", "せる"};
private String[] pastVerb = {"ましす", "がった", "いた", "った", "した", "んだ", "れた", "めた", "又"};
private String[] iadverb = {"いて", "って", "して", "んで"};
private String[] adverbWord = {"くて", "に", "く", "な", "ただ"};
private String[] adjWord = {"い", "な"};
private String[] subWord = {"えば", "けば", "げば", "せば", "ぜば", "てば",
"でば", "ねば", "へば", "べば", "めば", "れば"};
// private String[] lastfChar = {"か", "そ", "や", "ら", "く", "り", "だ",
// "ん", "に", "っ", "ア", "こ", "き", "せ", "て", "あ", "ち", "つ",
// "る", "む", "す", "か", "う", "え", "ど", "で", "さある", "う", "が"}; こ
private String[] lastfChar = {"あ", "ぁ", "か", "が", "さ", "ざ", "た", "だ", "な", "は", "ば",
"ぱ", "ま", "や", "ゃ", "ら", "わ", "ゎ", "ん", "い", "ぃ", "き", "ぎ", "し", "じ", "ち",
"ぢ", "に", "ひ", "び", "ぴ", "み", "り", "う", "ぅ", "く", "ぐ", "す", "ず", "つ", "づ",
"っ", "ぬ", "ふ", "ぶ", "ぷ", "む", "ゆ", "ゅ", "る", "え", "ぇ", "け", "げ", "せ", "ぜ",
"て", "で", "ね", "へ", "べ", "ぺ", "め", "れ", "お", "ぉ", "こ", "ご", "そ", "ぞ", "と",
"ど", "の", "ほ", "ぼ", "ぽ", "も", "よ", "ょ", "ろ", "を", "ア", "ァ", "カ", "ガ", "サ",
"ザ", "タ", "ダ", "ハ", "バ", "パ", "マ", "ヤ", "ャ", "ラ", "ワ", "ヮ", "ン", "イ", "ィ",
"キ", "ギ", "シ", "ジ", "チ", "ヂ", "ニ", "ヒ", "ビ", "ピ", "ミ", "リ", "ウ", "ゥ", "ク",
"グ", "ス", "ズ", "ツ", "ヅ", "ッ", "ヌ", "フ", "ブ", "プ", "ム", "ユ", "ュ", "ル", "エ",
"ェ", "ケ", "ゲ", "セ", "ゼ", "テ", "デ", "ネ", "ヘ", "ベ", "ペ", "レ", "オ", "ォ", "コ",
"ゴ", "ソ", "ゾ", "ト", "ド", "ホ", "ボ", "ポ", "モ", "ヨ", "ョ", "ロ", "ヲ", "―",
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
public Morphemer(String str){
splitMorpheme(str);
}
public boolean isNoun(String str){
boolean isN = false;
// if(str.contains("ん")){System.out.println(str);}
if(isSubjunctive(str)){
isN = false;
}else if(isAdj(str)){
isN = false;
}else if(isVerb(str)){
isN = false;
}else{isN = true;}
return isN;
}
public boolean isSubjunctive(String str){
boolean isSub = false;
for(int i=0; i<subWord.length; i++){
if(str.contains(subWord[i])){
isSub = true;
}
}
return isSub;
}
public boolean isAdj(String str){
boolean isAdj = false;
for(int i=0; i<adjWord.length; i++){
if(str.contains(adjWord[i])){
isAdj = true;
}
}
return isAdj;
}
public boolean isAdverb(String str){
boolean isAdverb = false;
for(int i=0; i<adverbWord.length; i++){
if(str.contains(adverbWord[i])){
isAdverb = true;
}
}
return isAdverb;
}
public boolean isVerb(String str){
boolean isV = false;
// if(str.contains("ん")){System.out.println(str);}
if(str.length()>1){
for(int i=0; i<verbWord.length; i++){
if(str.contains(verbWord[i])
&&(!str.contains("さ"))
&&(!str.contains("み"))){
// System.out.println(str);
isV = true;
break;
}
}
}
return isV;
}
// 해당 keyword가 포함된 문장을 리턴 한다.
public boolean containKeyWord(String str, String keyWord){
boolean isContain = false;
if(str.contains(keyWord)){
isContain = true;
}
return isContain;
}
public String[] split(String target, String token){
StringTokenizer st = new StringTokenizer(target, token);
String[] ret = new String[st.countTokens()];
String split = null;
int i = 0;
while(st.hasMoreElements()){
split = st.nextToken();
if(split!=null && !split.equals("")){
if(token=="<"){
ret[i] = token + split;
i++;
}else if(token==">"){
if(split.contains("<")){
ret[i] = split + token;
i++;
}else{
ret[i] = split;
i++;
}
}else {
ret[i] = split;
i++;
}
}
}
return ret;
}
// tag를 걸러낸 string 중 keyword를 포함한 문장을 리턴한다.
public String strByKeyword(String str, String key){
String splitStr[] = null;
String ret = null;
splitStr = split(str, "\n");
for(int i=0; i<splitStr.length; i++) {
// 해당 키워드를 포함한 문장을 가지고 온다.
if(containKeyWord(splitStr[i], key)){ret = splitStr[i];}
}
if(ret!=null){
ret.replace(" ", "").replace("\t", "");
}
return ret;
}
public String parserVerb(String str){
String[] split = split(str, "|");
String ret = "|";
for(int z=0; z<split.length; z++){
if(split[z]!=null){
for(int i=0; i<verbWord.length; i++){
// 명사일 수도 있으니까..........
if(split[z].contains(verbWord[i])){
for(int j=0; j<pastVerb.length; j++){
if(split[z].contains("ついて")){
split[z] = split[z].replace("ついて", "ついて" + "|");
}else{
split[z] = split[z].replace(pastVerb[j], pastVerb[j] + "|");
}
}
if(!split[z].contains("さ")){
if(split[z].contains("う")){
split[z] = split[z].replace("う", "う" + "|");
}else if(split[z].contains("す")){
split[z] = split[z].replace("す", "す" + "|");
}
}
// System.out.println(str);
}else if(verbWord[i].equals("がいる")){
split[z] = split[z].replace("がいる", "|"+ "が" + "|" + "いる" + "|");
}else if(verbWord[i].equals("がある")){
split[z] = split[z].replace("がある", "|"+ "が" + "|" + "ある" + "|");
}else if(split[z].contains("が")&&!split[z].contains("がった")){
split[z] = split[z].replace("が", "|"+ "が" + "|");
}
}
}
ret+=split[z] + "|";
}
// System.out.println(ret);
return ret;
}
public void splitMorpheme(String str){
String[] sentence = split(str, "\n");
String[] paragraph = null;
for(int z=0; z<sentence.length; z++){
sentence[z] = sentence[z].replace("こと", "事" + "|");
// 먼저 자르고... {"、", "「", "」", "は", "を", "の", "と"}
for(int i=0; i<bpstWord.length; i++){
if(sentence[z].contains(bpstWord[i])){
sentence[z] = sentence[z].replace(bpstWord[i], "|");
}
}
// 예외 처리..
if(sentence[z].contains("る")&&(sentence[z].indexOf("る")>0)){
sentence[z] = sentence[z].replace("る", "る" + "|");
}
if(sentence[z].contains("がった")){
sentence[z] = sentence[z].replace("がった", "がった" + "|");
}else if(sentence[z].contains("が")){
sentence[z] = sentence[z].replace("が", "|");
}
if(sentence[z].contains("んで")){
sentence[z] = sentence[z].replace("んで", "んで" + "|");
}
if(sentence[z].contains("で")){
sentence[z] = sentence[z].replace("で", "で" + "|");
}
if(sentence[z].contains("て")&&(sentence[z].indexOf("て")>0)){
for(int k=0; k<iadverb.length; k++){
if(sentence[z].contains("ていく")){
sentence[z] = sentence[z].replace("ていく", "て"+ "|" + "いく" + "|");
}else if(sentence[z].contains("ついて")){
sentence[z] = sentence[z].replace("ついて", "ついて" + "|");
}else if(sentence[z].contains("ている")){
sentence[z] = sentence[z].replace("ている", "ている" + "|");
}else {
sentence[z] = sentence[z].replace(iadverb[k], iadverb[k] + "|");
}
}
}
if(sentence[z].contains("ば")&&(sentence[z].indexOf("ば")>0)){
sentence[z] = sentence[z].replace("ば", "ば" + "|");
}
if(sentence[z].contains("に")&&(sentence[z].indexOf("に")>0)){
sentence[z] = sentence[z].replace("に", "に" + "|");
}
if(sentence[z].contains("く")
&&(sentence[z].indexOf("く")>0)
&&!(sentence[z].contains("に"))){
sentence[z] = sentence[z].replace("く", "く" + "|");
}
// 다음 자를꺼.. {"い", "な"}
if(sentence[z].contains("い")&&(sentence[z].indexOf("い")>0)){
if(sentence[z].contains("ついて")){
sentence[z] = sentence[z].replace("ついて", "ついて" + "|");
}else if(sentence[z].contains("いく")){
sentence[z] = sentence[z].replace("いく", "いく" + "|");
}else if(sentence[z].contains("いて")){
sentence[z] = sentence[z].replace("いて", "いて" + "|");
}else if(sentence[z].contains("ている")){
sentence[z] = sentence[z].replace("ている", "ている" + "|");
}else if((sentence[z].contains("ご") ||sentence[z].contains("さ"))){
sentence[z] = sentence[z].replace("い", "|" + "い");
}else{
sentence[z] = sentence[z].replace("い", "い" + "|");
}
}
if(sentence[z].contains("な")
&&(sentence[z].indexOf("な")>0)
&&(!sentence[z].contains("ない"))
&&(!sentence[z].contains("なか"))){
sentence[z] = sentence[z].replace("な", "な" + "|");
}
paragraph = split(sentence[z], "|");
for(int j=0; j<paragraph.length; j++){
paragraph[j] = paragraph[j].replace(" ", "").replace("\t", "").replace("\n", "");
String[] phrase = split(paragraph[j], "|");
for(int k=0; k<phrase.length; k++){
String word = parserVerb(phrase[k]);
analysisMorpheme(word);
}
}
}
}
public void analysisMorpheme(String str){
String[] word = split(str, "|");
for(int i=0; i<word.length; i++){
word[i] = word[i].replace(" ", "").replace("\t", "").replace("\n", "");
for(int j=0; j<lastfChar.length; j++){
if(word[i].indexOf(lastfChar[j])==0){
// System.out.println(word[i].indexOf(lastfChar[j]) + " : "+ word[i]);
word[i] = null;
break;
}
}
if(word[i]!=null){
defineFormat(word[i]);
}
}
}
public void defineFormat(String str){
String type = null;
if(str!=null && !str.equals(" ")){
if(isAdj(str)){
if(str.contains("ている")){
type = "いるv";
}else if(str.contains("いる") ){
type = "いるv";
}else if(str.contains("い")
&&str.length()>1
&&(str.indexOf("い")+1==str.length())){
type = "いadj";
}else if(str.contains("な")
&&str.length()>1
&&(str.indexOf("な")+1==str.length())){
type = "なadj";
}
}else if(isVerb(str)&&!isAdj(str)){
type = str.substring(str.length()-1)+"v";
if(str.contains("ついて")){
type = "てv";
// System.out.println("て.Verb : " + str);
}else if(str.contains("ている")){
type = "ているv";
// System.out.println("ている.Verb : " + str);
}else if(str.contains("いる")){
type = "いるv";
// System.out.println("ている.Verb : " + str);
}else if(str.contains("てある")){
type = "てあるv";
// System.out.println("てある.Verb : " + str);
}else if(str.contains("て")){
type = "てv";
// System.out.println("て.Verb : " + str);
}else if(str.contains("た")||str.contains("だ")){
for(int i=0; i<pastVerb.length; i++){
if(str.contains(pastVerb[i])){
type = "たv";
// System.out.println("past.た.Verb : " + str);
}
}
}else if(str.contains("いく")){
type = "くv";
// System.out.println("Verb : " + str);
}else if(str.contains("する")){
type = "するv";
// System.out.println("Verb : " + str);
}else if(str.contains("く") && !str.equals("く")){
if(isAdverb(str)){
type = "adv";
// System.out.println("Adj : " + str);
}
}
}else if(isNoun(str)&&!isAdj(str)&&!isVerb(str)){
type = "n";
if(isAdverb(str) && !str.equals("に")){
if(str.contains("に")){
type = "にadv";
// System.out.println("に.Adverb : " + str);
}else{
type = "adv";
// System.out.println("Adverb : " + str);
}
}else if(str.contains("で")){
str = str.replace("で", "");
// System.out.println("に.Adverb : " + str);
}else if(str.contains("だ")){
if(str.contains("んだ")){
type = "たadj";
}else{str = str.replace("だ", "");}
// System.out.println("に.Adverb : " + str);
}
}
}
if(str!=null){
for(int i=0; i<iadverb.length; i++){
if(str.equals(iadverb[i]) || str==iadverb[i]){
type = null;
str = str.replace(iadverb[i], "");
}
}
}
str = str.replace(" ", "").replace("\t", "").replace("\n", "");
if((type!=null)&&(!str.equals(""))){
// 10글자 미만만...
if(str.length()<10){
System.out.println(type + " : " + str);
}
}
}
}
'JAVA/JSP > Source' 카테고리의 다른 글
PageReader (0) | 2009.01.16 |
---|---|
TagFilter (0) | 2009.01.16 |
html tag filter(2) (0) | 2009.01.12 |
html tag filter (0) | 2009.01.09 |
test (0) | 2009.01.08 |