File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
package itn.let.mjo.spammsg.web;
import java.util.List;
import itn.let.hangulparser.HangulParser;
public class ComGetSpamStringParser {
/*
* 스팸 문자 필터링을 위한 변형된 한글 SMS 문장의 정규화 기법을 기반으로 개발
* Kang Seung-Shik
*
* 20230419
* */
//이상문자열 파싱 후 결합하여
public static String getSpamTextParse(String strString) throws Exception {
String smsTxt = strString;
String repSmsTxt = smsTxt.replaceAll("[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9①ⓒ⒪㈄β]", ""); //한글, 영문, 숫자 이외의 문자는 제거
String[] split = repSmsTxt.split(" "); //띄어쓰기를 기준으로 분할
String reMakeStringText = "";
try {
for(String txt : split) {
for(int i=0; i < txt.length(); i++) {
char test = txt.charAt(i);
if(test >= 0xAC00) {//한글 문자이면 스킵
continue;
}else {
String tmpStr = Character.toString(test);
if(tmpStr.matches(".*[ㄱ-ㅎ]+.*")) {
String nextCharAt = Character.toString(txt.charAt(i+1));//현재 단어 다음 단어가 어떤것인지 가져온다.
if(i == txt.length() - 1 ) {//일단 마지막 자음은 스킵 한다.
break;
}/*else if(!nextCharAt.matches(".*[ㄱ-ㅎㅏ-ㅣa-zA-Z]+.*")) {//현재 자음이면서 다음글자가 자/모음이 아니면 삭제 액ㄱ정 이런 경우 삭제하려고 함.
txt = txt.replace(tmpStr, "");
break;
}*/
if(nextCharAt.matches(".*[a-zA-Z]+.*")) {//다음 단어가 영문이면 영문과 유사한 한글 모음을 찾아서 합쳐준다.
String repCharAt = getEngToHanglue(nextCharAt);
String repStringChar = tmpStr + repCharAt;
String repTxt = tmpStr + nextCharAt;
txt = txt.replace(repTxt, repStringChar);
//System.out.println(txt);
}/*else if(nextCharAt.matches(".*[ㅏ-ㅣ]+.*")) {//다음 단어가 모음이면 앞 자음과 합쳐 주기
String repStringChar = tmpStr + nextCharAt;
//String norString = Normalizer.normalize(repStringChar, Normalizer.Form.NFC);
//System.out.println(repStringChar);
//txt = txt.replace(repStringChar, repStringChar);//분리된 자믐, 모음을 합쳐진 한 단어로 치환해준다.
//System.out.println(txt);
}*/
}else if(tmpStr.matches(".*[a-zA-Z]+.*")) {//영문단어가 나오면 앞뒤 단어 체크하여 연관성 없으면 삭제 처리.
String engStr = tmpStr;
if(i < txt.length() - 1) {//마지막 글자 제외
char nextEngChar = txt.charAt(i+1);
if(i > 0) {//첫글자가 영문인 경우 제외
char befEngChar = txt.charAt(i-1);
//한글 단어사이에 영문자 한글자만 있는 경우 삭제 처리함.
if(nextEngChar >= 0xAC00 && befEngChar >= 0xAC00) {
if(tmpStr.toLowerCase().equals("b")) {//B를 넣어서 한글로 읽힐수 있게도 함, 서B스 와 같은 형태
txt = txt.replace(engStr, "비");
}else {
txt = txt.replace(engStr, "");
}
}
}
}else {
char befEngChar = txt.charAt(i-1);
//마지막 글자이고 앞글자가 한글이면 마지막 영단어 삭제 처리
if(befEngChar >= 0xAC00) {
txt = txt.replace(engStr, "");
//continue;
}
}
}else if(tmpStr.matches(".*[0-9]+.*")) {
if(i-1 < 0) {//한글자만 있는경우 패스
continue;
}
String befString = Character.toString(txt.charAt(i-1));
if(befString.matches(".*[ㄱ-ㅎ]+.*")) {//이전 글자가 자음이면 변환 문자 체크
String numToStr = getNumberToString(tmpStr); //숫자를 모음으로 변환 처리
String orgStringChar = befString + tmpStr; //원래 앞자음 + 숫자
String repStringChar = befString + numToStr; //원래 앞자음 + 숫자를 변환한 모음
txt = txt.replace(orgStringChar, repStringChar);//분리된 자믐, 모음을 합쳐진 한 단어로 치환해준다.
//System.out.println(txt);
}else {
//숫자면 스킵
continue;
}
}else {
//특수문자들 처리
String repSpcStr = getRepSpacialString(tmpStr);
if(!repSpcStr.equals("")) {//변환문자가 있는경우만 치환
txt = txt.replace(tmpStr, repSpcStr);
}
}
}
}
reMakeStringText = reMakeStringText + " " + txt;
}
//System.out.println("++++++++++++++ ::: "+reMakeStringText);
//넘어오는 모든 글자에서 한글에 대해서 자/모음을 분리해준다.
List<String> jasoList = HangulParser.disassemble(reMakeStringText);
//분리된 자/모음 리스트를 다시 한글로 합쳐준다.
String assembleStr = HangulParser.assemble(jasoList);
reMakeStringText = assembleStr;
} catch (Exception e) {
System.out.println("++++++++++ getSpamTextParse Error !!! "+e);
return "getSpamTextParse 오류가 발생하였습니다.";
}
return reMakeStringText;
}
/*
*
* 한글과 유사한 영문자를 변환 처리함
*
* */
public static String getEngToHanglue(String strWord) throws Exception {
String returnStr = "";
try {
if(strWord.toLowerCase().equals("r")) {
returnStr = "ㅏ";
}else if(strWord.toLowerCase().equals("h")) {
returnStr = "ㅐ";
}else if(strWord.toLowerCase().equals("i") || strWord.toLowerCase().equals("I") || strWord.toLowerCase().equals("l")) {
returnStr = "ㅣ";
}
} catch (Exception e) {
System.out.println("++++++++++++++ getEngToHanglue Error !!! "+e);
}
return returnStr;
}
/*
*
* 한글과 유사한 숫자를 변환처리함
*
* */
public static String getNumberToString(String strWord) throws Exception {
String returnStr = "";
try {
if(strWord.equals("1")) {
returnStr = "ㅣ";
}
} catch (Exception e) {
System.out.println("++++++++++++++ getNumberToString Error !!! "+e);
}
return returnStr;
}
/*
*
* 한글과 유사한 특수문자들 변환처리함
*
* */
public static String getRepSpacialString(String strWord) throws Exception{
String returnStr = "";
try {
if(strWord.equals("ⓒ")) {
returnStr = "c";
}else if(strWord.equals("β")) {
returnStr = "비";
}else if(strWord.equals("⒪")) {
returnStr = "ㅇ";
}else if(strWord.equals("㈄")) {
returnStr = "ㅁ";
}else if(strWord.equals("①")) {
returnStr = "ㅣ";
}
} catch (Exception e) {
System.out.println("++++++++++++++ getRepSpacialString Error !!! "+e);
}
return returnStr;
}
}