File name
Commit message
Commit date
2024-09-10
File name
Commit message
Commit date
2024-09-10
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
2024-09-10
2024-09-10
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;
}
}