zoukankan      html  css  js  c++  java
  • [python每日一练]--0012:敏感词过滤 type2

    题目链接:https://github.com/Show-Me-the-Code/show-me-the-code
    代码github链接:https://github.com/wjsaya/python_spider_learn/tree/master/python_daily
    个人博客地址:https://wjsaya.github.io
    第 0012 题: 敏感词文本文件 filtered_words.txt,里面的内容 和 0011题一样,当用户输入敏感词语,则用 星号 替换,例如当用户输入「北京是个好城市」,则变成「*是个好城市」。

    1
    2
    3
    4
    北京
    程序员
    公务员
    ...

    思路:

    1. 从文件解析敏感词、从终端获取用户输入。
    2. 根据敏感词对用户输入进行过滤。这里过滤需要考虑到输入内容不止一个需要过滤的词,所以稍微麻烦点:
      1. 读取所有的屏蔽词,放进一个列表
      2. 获取用户输入
      3. 遍历屏蔽词列表,用屏蔽词检索用户输入
        • 如果有屏蔽词,将其替换为*
        • 如果没有,不进行操作
        • 返回处理后的用户输入
        • 用下一个屏蔽词对处理后的用户输入进行上述操作
      4. 所有屏蔽词遍历完毕,输出过滤后字符串

    敏感词列表(filtered_words.txt)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    北京
    程序员
    公务员
    领导
    牛比
    牛逼
    你娘
    你妈
    love
    sex
    jiangge

    代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    # -*- coding: utf-8 -*-
    # @Author: wjsaya(http://www.wjsaya.top)
    # @Date: 2018-08-10 12:33:32
    # @Last Modified by: wjsaya(http://www.wjsaya.top)
    # @Last Modified time: 2018-08-13 23:02:29
    class ():
    '''fliter类 n
    传入敏感词文件 n
    获取用户输入,根据敏感词文件对输入进行过滤
    '''
    def __init__(self, fileName):
    dirty_dict = self.get_dirty(file)
    self.fliteredString = self.fliterMaster(dirty_dict)
    def get_dirty(self, fileName=''):
    '''解析文件获取敏感词,返回一个敏感词列表
    '''
    with open (fileName, 'r', encoding='utf-8') as f:
    re = f.readlines()
    for i in range(len(re)):
    大专栏  [python每日一练]--0012:敏感词过滤 type2class="line"> re[i] = re[i].strip('n')
    return(re)
    def fliterMaster(self, dirty_dict):
    '''过滤主函数 n
    获取用户输入,获取待屏蔽词典 n
    遍历屏蔽词 ,进行过滤n
    返回屏蔽后字符串
    '''
    instr = input("不要输入敏感词哦:")
    self.originString = instr
    # instr = ("程序员很牛比,但是运维更牛逼")
    for i in dirty_dict:
    inArray = self.str2array(instr)
    inDirtArray = self.str2array(i)
    pos_list = self.get_pos(inArray, inDirtArray[0])
    if pos_list is None: # 未找到可能存在的屏蔽词,跳过过滤部分
    continue
    else: # 可能有屏蔽词,交给fliterWorker进一步处理
    for tag in pos_list:
    inArray = self.fliterWorker(tag, inArray, inDirtArray)
    instr = ''.join(inArray)
    return instr
    def str2array(self, instr):
    '''字符串单个拆分为数组
    '''
    redict = []
    for i in instr:
    redict.append(i)
    return redict
    def get_pos(self, instr, word):
    '''传入句子,传入词 n
    找出此词在居中的所有位置
    '''
    try:
    re = instr.index(word)
    resp = []
    resp.append(re)
    while(1):
    try:
    re = instr.index(word, re+1, len(instr))
    resp.append(re)
    except Exception as e:
    break
    return resp
    except Exception as e:
    return None
    def fliterWorker(self, tag, inArray, inDirtArray):
    '''IN:字符数组;屏蔽词数组;可能存在屏蔽词的位置 n
    OUT:替换完毕之后的字符数组
    '''
    resp = ""
    resp_temp = ""
    for i in range(tag): # 0-pos不变,从pos开始向后匹配
    resp += inArray[i]
    for i in range(len(inDirtArray)):
    if inArray[tag+i] == inDirtArray[i]:
    # 字符数组和屏蔽词数组从左向右匹配,如果匹配到一个,resp_temp追加一个*
    # 任一过滤词没匹配到,resp_temp直接置为空
    resp_temp += "*"
    else:
    resp_temp = ''
    break
    if resp_temp == '': # resp_temp为空,直接返回原字符数组
    return inArray
    else: # resp_temp非空,则有匹配,把resp_temp加到原字符数组
    resp += resp_temp
    for i in range(tag+len(inDirtArray), len(inArray)):
    # resp_temp加完之后,把原句剩下的内容追加
    resp += inArray[i]
    return resp
    if __name__ == '__main__':
    file = 'filtered_words.txt'
    fliter1 = fliter(file)
    print("未过滤字符串为:" + fliter1.originString)
    print("过滤后字符串为:" + fliter1.fliteredString)

    效果图:

    0012

  • 相关阅读:
    PHP realpath() 函数
    PHP getcwd() 函数
    移动加权平均&全月平均
    Nginx禁止访问某个目录
    foreach ($array as $key=>$value)
    php中$_SERVER变量的意义及用法说明
    [JS代码]如何判断ipad或者iphone是否为横屏或者竖屏 portrait或者landscape
    分享10个实用的超绚CSS3按钮设计
    分享三款非常实用的免费信息图
    分享200个免费的倒影效果移动设备及网站图标下载
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12239685.html
Copyright © 2011-2022 走看看