자바 실전 의 민감 한 단어 필터
본 논문 의 민감 한 단어 필 터 는 SpringBoot 프로젝트 에 사용 되 기 때문에 먼저 pom.xml 파일 에서 다음 과 같은 의존 도 를 가 져 와 야 합 니 다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
민감 한 단어 파일resources 디 렉 터 리 에 sensitive-word.txt 를 만 들 고 필터 가 필요 한 민감 한 단어 정 보 를 입력 합 니 다.
3.접두사 나무의 실현
접두사 트 리 TrieNode 는 빈 노드 를 두 노드 로 하고 각 노드 에 몇 개의 하위 노드 가 포함 되 어 있 으 며 서로 다른 노드 는 서로 다른 문 자 를 대표 합 니 다.TrieNode 는 두 부분 으로 구성 되 어 있 으 며,먼저 boolean 변수 로 이 결점 이 키워드 의 종결 점 인지 아 닌 지 를 나타 낸다.그 다음은 이 노드 의 하위 노드 집합 이다.본 고 에서 HashMap 으로 하위 노드 를 저장 하고 key 로 노드 를 대표 하 는 문 자 를 저장 하 며 유형 은 Character 이 고 value 는 TrieNode 이 며 하위 노드 를 나타 낸다.실 현 된 코드 는 다음 과 같다.
//
private class TrieNode{
//
private boolean isKeywordEnd = false;
//
private Map<Character,TrieNode> subNodes = new HashMap<>();
//isKeywordEnd get、set
public boolean isKeywordEnd() {
return isKeywordEnd;
}
public void setKeywordEnd(boolean keywordEnd) {
isKeywordEnd = keywordEnd;
}
//
public void addSubNode(Character c,TrieNode node){
subNodes.put(c,node);
}
//
public TrieNode getSubNode(Character c){
return subNodes.get(c);
}
}
4.민감 한 단어 필터 의 실현
@Component
public class SensitiveFilter {
//
private static final String REPLACEMENT = "***";
//
private TrieNode rootNode = new TrieNode();
//bean , , bean
// ,
@PostConstruct
public void init(){
try(
InputStream is = this.getClass().getClassLoader().getResourceAsStream("sensitive-words.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
){
String keyword;
while((keyword=reader.readLine())!=null){
this.addKeyword(keyword);
}
}catch (IOException e){
logger.error(" : " + e.getMessage());
}
}
//
private void addKeyword(String keyword){
TrieNode tempNode = rootNode;
for (int i = 0; i <keyword.length() ; i++) {
char c = keyword.charAt(i);
TrieNode subNode = tempNode.getSubNode(c);
if(subNode==null){
//
subNode = new TrieNode();
tempNode.addSubNode(c,subNode);
}
// ,
tempNode = subNode;
//
if(i==keyword.length()-1){
tempNode.setKeywordEnd(true);
}
}
}
/**
*
*
* @param text
* @return
*/
public String filter(String text){
if(StringUtils.isBlank(text)){
return null;
}
// 1
TrieNode tempNode = rootNode;
// 2
int begin = 0;
// 3
int position = 0;
//
StringBuilder sb = new StringBuilder();
while(position<text.length()){
char c = text.charAt(position);
/*
: , , ☆
: , , ☆ ☆
*/
if(isSymbol(c)){
// 1 , , , 2
if(tempNode==rootNode){
sb.append(c);
begin++;
}
// , 3
position++;
continue;
}
//
tempNode = tempNode.getSubNode(c);
if(tempNode==null){
// begin
sb.append(text.charAt(begin));
// 2 3 2
position = ++begin;
// 1
tempNode = rootNode;
}else if(tempNode.isKeywordEnd()){
// , begin~position
sb.append(REPLACEMENT);
//
begin = ++position;
// 1
tempNode = rootNode;
}else {
//
position++;
}
}
//
sb.append(text.substring(begin));
return sb.toString();
}
//
private boolean isSymbol(Character c){
// 0x2E80~0x9FFF
return !CharUtils.isAsciiAlphanumeric(c) && (c < 0x2E80 || c > 0x9FFF);
}
}
자바 실전 의 민감 한 단어 필터 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.자바 민감 한 단어 필터 에 관 한 더 많은 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.