Python 민감 어 필터 링 을 위 한 4 가지 방법
(나 는 이미 가능 한 한 욕 을 그림 의 형식 으로 만 들 었 다.그렇지 않 으 면 글 이 나 오지 않 는 다)
방법 1:replace 필터
replace 는 가장 간단 한 문자열 로 바 꿉 니 다.문자열 에 나타 날 수 있 는 민감 한 단어 가 있 을 때 저 희 는 해당 하 는 replace 방법 을 사용 하여 민감 한 단 어 를*로 바 꾸 면 됩 니 다.
단점:
텍스트 와 민감 어 는 적 을 때 는 괜 찮 고,많 을 때 는 효율 이 비교적 떨어진다.
import datetime
now = datetime.datetime.now()
print(filter_sentence, " | ", now)
여러 개의 민감 한 단어 라면 목록 으로 하나씩 바 꿀 수 있다.
for i in dirty:
speak = speak.replace(i, '*')
print(speak, " | ", now)
방법 2:정규 표현 식 필터
정규 표현 식 은 좋 은 일치 방법 이 라 고 할 수 있 습 니 다.일상적인 조회 에서 기 회 는 정규 표현 식 을 사용 합 니 다.우리 의 파충 류 를 포함 하여 정규 표현 식 에 도 자주 사 용 됩 니 다.여기 서 우 리 는 주로'|'를 사용 하여 일치 합 니 다.'|'은 여러 대상 문자열 에서 하 나 를 선택 하여 일치 하 는 것 을 의미 합 니 다.간단 한 예 를 들다.
import re
def sentence_filter(keywords, text):
return re.sub("|".join(keywords), "***", text)
print(sentence_filter(dirty, speak))
방법 3:DFA 여과 알고리즘
DFA 의 알고리즘,즉 Deterministic Finite Automation 알고리즘 을 중국어 로 번역 하면 가난 한 자동 동기 알고리즘 을 확인 하 는 것 입 니 다.그것 의 기본 사상 은 상태 이동 을 바탕 으로 민감 한 단 어 를 검색 하 는 것 이다.검 측 을 기다 리 는 텍스트 를 한 번 만 스 캔 하면 모든 민감 한 단 어 를 검 측 할 수 있다.(코드 설명 구현)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time:2020/4/15 11:40
# @Software:PyCharm
# article_add: https://www.cnblogs.com/JentZhang/p/12718092.html
__author__ = "JentZhang"
import json
MinMatchType = 1 #
MaxMatchType = 2 #
class DFAUtils(object):
"""
DFA
"""
def __init__(self, word_warehouse):
"""
:param word_warehouse:
"""
#
self.root = dict()
# , ( , )
self.skip_root = [' ', '&', '!', '!', '@', '#', '$', '¥', '*', '^', '%', '?', '?', '<', '>', "《", '》']
#
for word in word_warehouse:
self.add_word(word)
def add_word(self, word):
"""
:param word:
:return:
"""
now_node = self.root
word_count = len(word)
for i in range(word_count):
char_str = word[i]
if char_str in now_node.keys():
# key, ,
now_node = now_node.get(word[i])
now_node['is_end'] = False
else:
# dict
new_node = dict()
if i == word_count - 1: #
new_node['is_end'] = True
else: #
new_node['is_end'] = False
now_node[char_str] = new_node
now_node = new_node
def check_match_word(self, txt, begin_index, match_type=MinMatchType):
"""
:param txt:
:param begin_index: getSensitiveWord , index
:param match_type: 1: ,2:
:return: , , 0
"""
flag = False
match_flag_length = 0 #
now_map = self.root
tmp_flag = 0 #
for i in range(begin_index, len(txt)):
word = txt[i]
# "
if word in self.skip_root and len(now_map) < 100:
# len(nowMap)<100
tmp_flag += 1
continue
# key
now_map = now_map.get(word)
if now_map: # ,
# key, +1
match_flag_length += 1
tmp_flag += 1
# , ,
if now_map.get("is_end"):
# true
flag = True
# , ,
if match_type == MinMatchType:
break
else: # ,
break
if tmp_flag < 2 or not flag: # 1,
tmp_flag = 0
return tmp_flag
def get_match_word(self, txt, match_type=MinMatchType):
"""
:param txt:
:param match_type: 1: ,2:
:return:
"""
matched_word_list = list()
for i in range(len(txt)): # 0---11
length = self.check_match_word(txt, i, match_type)
if length > 0:
word = txt[i:i + length]
matched_word_list.append(word)
# i = i + length - 1
return matched_word_list
def is_contain(self, txt, match_type=MinMatchType):
"""
:param txt:
:param match_type: 1: ,2:
:return: true, false
"""
flag = False
for i in range(len(txt)):
match_flag = self.check_match_word(txt, i, match_type)
if match_flag > 0:
flag = True
return flag
def replace_match_word(self, txt, replace_char='*', match_type=MinMatchType):
"""
:param txt:
:param replace_char: , , " ", " ", *, " **"
:param match_type: 1: ,2:
:return:
"""
tuple_set = self.get_match_word(txt, match_type)
word_set = [i for i in tuple_set]
result_txt = ""
if len(word_set) > 0: # ,
for word in word_set:
replace_string = len(word) * replace_char
txt = txt.replace(word, replace_string)
result_txt = txt
else: # ,
result_txt = txt
return result_txt
if __name__ == '__main__':
dfa = DFAUtils(word_warehouse=word_warehouse)
print(' :', json.dumps(dfa.root, ensure_ascii=False))
#
msg = msg
print(' :', dfa.is_contain(msg))
print(' :', dfa.get_match_word(msg))
print(' :', dfa.replace_match_word(msg))
방법 4:AC 자동 동기
AC 자동 동 기 는 선행 지식 이 필요 합 니 다.Trie 트 리(간단 한 소개:접두사 트 리,사전 트 리 라 고도 부 르 며 문자열 의 문 제 를 신속하게 처리 하고 문자열 의 정 보 를 신속하게 찾 을 수 있 습 니 다.)
자세 한 참조:
https://www.luogu.com.cn/blog/juruohyfhaha/trie-xue-xi-zong-jie
ac 자동 동 기 는 tire 트 리 를 바탕 으로 fail 지침 을 추가 하 는 것 입 니 다.현재 점 이 일치 하지 않 으 면 fail 지침 이 가리 키 는 곳 으로 지침 을 옮 깁 니 다.그러면 거 슬러 올 라 가지 않 고 길이 일치 할 수 있 습 니 다.
상세 한 일치 체 제 는 제 가 여기 서 긴 말 을 할 뿐 AC 자동 동기 에 대해 서 는 이 글 을 참고 할 수 있 습 니 다.
https://www.jb51.net/article/128711.htm
python 은 ahocorasick 모듈 을 이용 하여 빠르게 실현 할 수 있 습 니 다:
# python3 -m pip install pyahocorasick
import ahocorasick
def build_actree(wordlist):
actree = ahocorasick.Automaton()
for index, word in enumerate(wordlist):
actree.add_word(word, (index, word))
actree.make_automaton()
return actree
if __name__ == '__main__':
actree = build_actree(wordlist=wordlist)
sent_cp = sent
for i in actree.iter(sent):
sent_cp = sent_cp.replace(i[1][1], "**")
print(" :",i[1][1])
print(" :",sent_cp)
물론 우 리 는 AC 자동 동 기 를 손 으로 쓸 수 있 고 구체 적 으로 참고 할 수 있다.
class TrieNode(object):
__slots__ = ['value', 'next', 'fail', 'emit']
def __init__(self, value):
self.value = value
self.next = dict()
self.fail = None
self.emit = None
class AhoCorasic(object):
__slots__ = ['_root']
def __init__(self, words):
self._root = AhoCorasic._build_trie(words)
@staticmethod
def _build_trie(words):
assert isinstance(words, list) and words
root = TrieNode('root')
for word in words:
node = root
for c in word:
if c not in node.next:
node.next[c] = TrieNode(c)
node = node.next[c]
if not node.emit:
node.emit = {word}
else:
node.emit.add(word)
queue = []
queue.insert(0, (root, None))
while len(queue) > 0:
node_parent = queue.pop()
curr, parent = node_parent[0], node_parent[1]
for sub in curr.next.itervalues():
queue.insert(0, (sub, curr))
if parent is None:
continue
elif parent is root:
curr.fail = root
else:
fail = parent.fail
while fail and curr.value not in fail.next:
fail = fail.fail
if fail:
curr.fail = fail.next[curr.value]
else:
curr.fail = root
return root
def search(self, s):
seq_list = []
node = self._root
for i, c in enumerate(s):
matched = True
while c not in node.next:
if not node.fail:
matched = False
node = self._root
break
node = node.fail
if not matched:
continue
node = node.next[c]
if node.emit:
for _ in node.emit:
from_index = i + 1 - len(_)
match_info = (from_index, _)
seq_list.append(match_info)
node = self._root
return seq_list
if __name__ == '__main__':
aho = AhoCorasic(['foo', 'bar'])
print aho.search('barfoothefoobarman')
이상 은 Python 을 사용 하여 민감 한 단 어 를 걸 러 내 는 네 가지 방법 입 니 다.앞의 두 가지 방법 은 비교적 간단 합 니 다.뒤의 두 가지 편향 알고리즘 은 먼저 알고리즘 이 구체 적 으로 실현 하 는 원 리 를 이해 한 다음 에 코드 를 알 아야 합 니 다.(DFA 는 비교적 자주 사용 되 는 여과 수단 으로 여러분 이 파악 하 시 기 를 권장 합 니 다~)마지막 으로 민감 한 단어 라 이브 러 리 를 첨부 합 니 다.
https://github.com/qloog/sensitive_words
이상 은 Python 이 민감 한 단 어 를 걸 러 내 는 네 가지 방법 에 대한 상세 한 내용 입 니 다.python 민감 한 단어 여과 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.