成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Serverless如何實(shí)現(xiàn)文本敏感詞過(guò)濾

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Serverless如何實(shí)現(xiàn)文本敏感詞過(guò)濾,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括高州網(wǎng)站建設(shè)、高州網(wǎng)站制作、高州網(wǎng)頁(yè)制作以及高州網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,高州網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到高州省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

敏感詞過(guò)濾是隨著互聯(lián)網(wǎng)社區(qū)發(fā)展一起發(fā)展起來(lái)的一種阻止網(wǎng)絡(luò)犯罪和網(wǎng)絡(luò)暴力的技術(shù)手段,通過(guò)對(duì)可能存在犯罪或網(wǎng)絡(luò)暴力可能的關(guān)鍵詞進(jìn)行有針對(duì)性的篩查和屏蔽,很多時(shí)候我們能夠防患于未然,把后果嚴(yán)重的犯罪行為扼殺于萌芽之中。

隨著各種社交平臺(tái)等的日益火爆,敏感詞過(guò)濾逐漸成了非常重要的也是值得重視的功能。那么在 Serverless 架構(gòu)下,通過(guò)Python 語(yǔ)言,敏感詞過(guò)濾又有那些新的實(shí)現(xiàn)呢?我們能否是用最簡(jiǎn)單的方法,實(shí)現(xiàn)一個(gè)敏感詞過(guò)濾的API呢?

了解敏感過(guò)濾的幾種方法

Replace方法

如果說(shuō)敏感詞過(guò)濾,其實(shí)不如說(shuō)是文本的替換,以Python為例,說(shuō)到詞匯替換,不得不想到replace,我們可以準(zhǔn)備一個(gè)敏感詞庫(kù),然后通過(guò)replace進(jìn)行敏感詞替換:

def worldFilter(keywords, text):
    for eve in keywords:
        text = text.replace(eve, "***")
    return text
keywords = ("關(guān)鍵詞1", "關(guān)鍵詞2", "關(guān)鍵詞3")
content = "這是一個(gè)關(guān)鍵詞替換的例子,這里涉及到了關(guān)鍵詞1還有關(guān)鍵詞2,最后還會(huì)有關(guān)鍵詞3。"
print(worldFilter(keywords, content))

但是動(dòng)動(dòng)腦大家就會(huì)發(fā)現(xiàn),這種做法在文本和敏感詞庫(kù)非常龐大的前提下,會(huì)有很嚴(yán)重的性能問(wèn)題。例如我將代碼進(jìn)行修改,進(jìn)行基本的性能測(cè)試:

import time

def worldFilter(keywords, text):
    for eve in keywords:
        text = text.replace(eve, "***")
    return text
keywords =[ "關(guān)鍵詞" + str(i) for i in range(0,10000)]
content = "這是一個(gè)關(guān)鍵詞替換的例子,這里涉及到了關(guān)鍵詞1還有關(guān)鍵詞2,最后還會(huì)有關(guān)鍵詞3。" * 1000
startTime = time.time()
worldFilter(keywords, content)
print(time.time()-startTime)

此時(shí)的輸出結(jié)果是:0.12426114082336426,可以看到性能非常差。

正則表達(dá)方法

與其用replace,還不如通過(guò)正則表達(dá)re.sub來(lái)的更加快速。

import time
import re
def worldFilter(keywords, text):
     return re.sub("|".join(keywords), "***", text)
keywords =[ "關(guān)鍵詞" + str(i) for i in range(0,10000)]
content = "這是一個(gè)關(guān)鍵詞替換的例子,這里涉及到了關(guān)鍵詞1還有關(guān)鍵詞2,最后還會(huì)有關(guān)鍵詞3。" * 1000
startTime = time.time()
worldFilter(keywords, content)
print(time.time()-startTime)

我們同樣增加性能測(cè)試,按照上面的方法進(jìn)行改造測(cè)試,輸出結(jié)果是0.24773502349853516。通過(guò)這樣的例子,我們可以發(fā)現(xiàn),其性能磣韓劇并不大,但是實(shí)際上隨著文本量增加,正則表達(dá)這種做法在性能層面會(huì)變高很多。

DFA過(guò)濾敏感詞

這種方法相對(duì)來(lái)說(shuō)效率會(huì)更高一些。例如,我們認(rèn)為壞人,壞孩子,壞蛋是敏感詞,則他們的樹關(guān)系可以表達(dá):

Serverless如何實(shí)現(xiàn)文本敏感詞過(guò)濾

用DFA字典來(lái)表示:

{
    '壞': {
        '蛋': {
            '\x00': 0
        }, 
        '人': {
            '\x00': 0
        }, 
        '孩': {
            '子': {
                '\x00': 0
            }
        }
    }
}

使用這種樹表示問(wèn)題最大的好處就是可以降低檢索次數(shù),提高檢索效率,基本代碼實(shí)現(xiàn):

import time

class DFAFilter(object):
    def __init__(self):
        self.keyword_chains = {}  # 關(guān)鍵詞鏈表
        self.delimit = '\x00'  # 限定

    def parse(self, path):
        with open(path, encoding='utf-8') as f:
            for keyword in f:
                chars = str(keyword).strip().lower()  # 關(guān)鍵詞英文變?yōu)樾?
                if not chars:  # 如果關(guān)鍵詞為空直接返回
                    return
                level = self.keyword_chains
                for i in range(len(chars)):
                    if chars[i] in level:
                        level = level[chars[i]]
                    else:
                        if not isinstance(level, dict):
                            break
                        for j in range(i, len(chars)):
                            level[chars[j]] = {}
                            last_level, last_char = level, chars[j]
                            level = level[chars[j]]
                        last_level[last_char] = {self.delimit: 0}
                        break
                if i == len(chars) - 1:
                    level[self.delimit] = 0

    def filter(self, message, repl="*"):
        message = message.lower()
        ret = []
        start = 0
        while start < len(message):
            level = self.keyword_chains
            step_ins = 0
            for char in message[start:]:
                if char in level:
                    step_ins += 1
                    if self.delimit not in level[char]:
                        level = level[char]
                    else:
                        ret.append(repl * step_ins)
                        start += step_ins - 1
                        break
                else:
                    ret.append(message[start])
                    break
            else:
                ret.append(message[start])
            start += 1

        return ''.join(ret)



gfw = DFAFilter()
gfw.parse( "./sensitive_words")
content = "這是一個(gè)關(guān)鍵詞替換的例子,這里涉及到了關(guān)鍵詞1還有關(guān)鍵詞2,最后還會(huì)有關(guān)鍵詞3。" * 1000
startTime = time.time()
result = gfw.filter(content)
print(time.time()-startTime)

這里我們的字典庫(kù)是:

with open("./sensitive_words", 'w') as f:
    f.write("\n".join( [ "關(guān)鍵詞" + str(i) for i in range(0,10000)]))

執(zhí)行結(jié)果:

0.06450581550598145

可以看到性能進(jìn)一步提升。

AC自動(dòng)機(jī)過(guò)濾敏感詞算法

接下來(lái),我們來(lái)看一下 AC自動(dòng)機(jī)過(guò)濾敏感詞算法:

AC自動(dòng)機(jī):一個(gè)常見(jiàn)的例子就是給出n個(gè)單詞,再給出一段包含m個(gè)字符的文章,讓你找出有多少個(gè)單詞在文章里出現(xiàn)過(guò)。

簡(jiǎn)單地講,AC自動(dòng)機(jī)就是字典樹+kmp算法+失配指針

代碼實(shí)現(xiàn):

import time
class Node(object):
    def __init__(self):
        self.next = {}
        self.fail = None
        self.isWord = False
        self.word = ""


class AcAutomation(object):

    def __init__(self):
        self.root = Node()

    # 查找敏感詞函數(shù)
    def search(self, content):
        p = self.root
        result = []
        currentposition = 0

        while currentposition < len(content):
            word = content[currentposition]
            while word in p.next == False and p != self.root:
                p = p.fail

            if word in p.next:
                p = p.next[word]
            else:
                p = self.root

            if p.isWord:
                result.append(p.word)
                p = self.root
            currentposition += 1
        return result

    # 加載敏感詞庫(kù)函數(shù)
    def parse(self, path):
        with open(path, encoding='utf-8') as f:
            for keyword in f:
                temp_root = self.root
                for char in str(keyword).strip():
                    if char not in temp_root.next:
                        temp_root.next[char] = Node()
                    temp_root = temp_root.next[char]
                temp_root.isWord = True
                temp_root.word = str(keyword).strip()

    # 敏感詞替換函數(shù)
    def wordsFilter(self, text):
        """
        :param ah: AC自動(dòng)機(jī)
        :param text: 文本
        :return: 過(guò)濾敏感詞之后的文本
        """
        result = list(set(self.search(text)))
        for x in result:
            m = text.replace(x, '*' * len(x))
            text = m
        return text


acAutomation = AcAutomation()
acAutomation.parse('./sensitive_words')
startTime = time.time()
print(acAutomation.wordsFilter("這是一個(gè)關(guān)鍵詞替換的例子,這里涉及到了關(guān)鍵詞1還有關(guān)鍵詞2,最后還會(huì)有關(guān)鍵詞3。"*1000))
print(time.time()-startTime)

詞庫(kù)同樣是:

with open("./sensitive_words", 'w') as f:
    f.write("\n".join( [ "關(guān)鍵詞" + str(i) for i in range(0,10000)]))

使用上面的方法,測(cè)試結(jié)果為0.017391204833984375。

敏感詞過(guò)濾方法小結(jié)

可以看到這個(gè)所有算法中,在上述的基本算法中DFA過(guò)濾敏感詞性能最高,但是實(shí)際上,對(duì)于后兩者算法,并沒(méi)有誰(shuí)一定更好,可能某些時(shí)候,AC自動(dòng)機(jī)過(guò)濾敏感詞算法會(huì)得到更高的性能,所以在生產(chǎn)生活中,推薦時(shí)候用兩者,可以根據(jù)自己的具體業(yè)務(wù)需要來(lái)做。

實(shí)現(xiàn)敏感詞過(guò)濾API

將代碼部署到Serverless架構(gòu)上,可以選擇API網(wǎng)關(guān)與函數(shù)計(jì)算進(jìn)行結(jié)合,以AC自動(dòng)機(jī)過(guò)濾敏感詞算法為例:我們只需要增加是幾行代碼就好,完整代碼如下:

# -*- coding:utf-8 -*-

import json, uuid


class Node(object):
    def __init__(self):
        self.next = {}
        self.fail = None
        self.isWord = False
        self.word = ""


class AcAutomation(object):

    def __init__(self):
        self.root = Node()

    # 查找敏感詞函數(shù)
    def search(self, content):
        p = self.root
        result = []
        currentposition = 0

        while currentposition < len(content):
            word = content[currentposition]
            while word in p.next == False and p != self.root:
                p = p.fail

            if word in p.next:
                p = p.next[word]
            else:
                p = self.root

            if p.isWord:
                result.append(p.word)
                p = self.root
            currentposition += 1
        return result

    # 加載敏感詞庫(kù)函數(shù)
    def parse(self, path):
        with open(path, encoding='utf-8') as f:
            for keyword in f:
                temp_root = self.root
                for char in str(keyword).strip():
                    if char not in temp_root.next:
                        temp_root.next[char] = Node()
                    temp_root = temp_root.next[char]
                temp_root.isWord = True
                temp_root.word = str(keyword).strip()

    # 敏感詞替換函數(shù)
    def wordsFilter(self, text):
        """
        :param ah: AC自動(dòng)機(jī)
        :param text: 文本
        :return: 過(guò)濾敏感詞之后的文本
        """
        result = list(set(self.search(text)))
        for x in result:
            m = text.replace(x, '*' * len(x))
            text = m
        return text


def response(msg, error=False):
    return_data = {
        "uuid": str(uuid.uuid1()),
        "error": error,
        "message": msg
    }
    print(return_data)
    return return_data


acAutomation = AcAutomation()
path = './sensitive_words'
acAutomation.parse(path)


def main_handler(event, context):
    try:
        sourceContent = json.loads(event["body"])["content"]
        return response({
            "sourceContent": sourceContent,
            "filtedContent": acAutomation.wordsFilter(sourceContent)
        })
    except Exception as e:
        return response(str(e), True)

最后,為了方便本地測(cè)試,我們可以增加:

def test():
    event = {
        "requestContext": {
            "serviceId": "service-f94sy04v",
            "path": "/test/{path}",
            "httpMethod": "POST",
            "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef",
            "identity": {
                "secretId": "abdcdxxxxxxxsdfs"
            },
            "sourceIp": "14.17.22.34",
            "stage": "release"
        },
        "headers": {
            "Accept-Language": "en-US,en,cn",
            "Accept": "text/html,application/xml,application/json",
            "Host": "service-3ei3tii4-251000691.ap-guangzhou.apigateway.myqloud.com",
            "User-Agent": "User Agent String"
        },
        "body": "{\"content\":\"這是一個(gè)測(cè)試的文本,我也就呵呵了\"}",
        "pathParameters": {
            "path": "value"
        },
        "queryStringParameters": {
            "foo": "bar"
        },
        "headerParameters": {
            "Refer": "10.0.2.14"
        },
        "stageVariables": {
            "stage": "release"
        },
        "path": "/test/value",
        "queryString": {
            "foo": "bar",
            "bob": "alice"
        },
        "httpMethod": "POST"
    }
    print(main_handler(event, None))


if __name__ == "__main__":
    test()

完成之后,我們就可以測(cè)試運(yùn)行一下,例如我的字典是:

呵呵
測(cè)試

執(zhí)行之后結(jié)果:

{'uuid': '9961ae2a-5cfc-11ea-a7c2-acde48001122', 'error': False, 'message': {'sourceContent': '這是一個(gè)測(cè)試的文本,我也就呵呵了', 'filtedContent': '這是一個(gè)**的文本,我也就**了'}}

接下來(lái),我們將代碼部署到云端,新建serverless.yaml:

sensitive_word_filtering:
  component: "@serverless/tencent-scf"
  inputs:
    name: sensitive_word_filtering
    codeUri: ./
    exclude:
      - .gitignore
      - .git/**
      - .serverless
      - .env
    handler: index.main_handler
    runtime: Python3.6
    region: ap-beijing
    description: 敏感詞過(guò)濾
    memorySize: 64
    timeout: 2
    events:
      - apigw:
          name: serverless
          parameters:
            environment: release
            endpoints:
              - path: /sensitive_word_filtering
                description: 敏感詞過(guò)濾
                method: POST
                enableCORS: true
                param:
                  - name: content
                    position: BODY
                    required: 'FALSE'
                    type: string
                    desc: 待過(guò)濾的句子

然后通過(guò)sls --debug進(jìn)行部署,部署結(jié)果:

Serverless如何實(shí)現(xiàn)文本敏感詞過(guò)濾

最后,通過(guò)PostMan進(jìn)行測(cè)試:

Serverless如何實(shí)現(xiàn)文本敏感詞過(guò)濾

敏感詞過(guò)濾是目前非常常見(jiàn)的需求/技術(shù),通過(guò)敏感詞過(guò)濾,我們可以在一定程度上降低惡意言語(yǔ)或者違規(guī)言論的出現(xiàn),在上述實(shí)踐過(guò)程,有以下兩點(diǎn)內(nèi)容:

  • 對(duì)于敏感詞庫(kù)額獲得問(wèn)題:Github上有很多,可以自行搜索下載,因?yàn)槊舾性~詞庫(kù)里面有很多敏感詞,所以我也不能直接放在這個(gè)上面供大家使用,所以還需要大家自行在Github上搜索使用;

  • 這個(gè)API使用場(chǎng)景的問(wèn)題:完全可以放在我們的社區(qū)跟帖系統(tǒng)/留言評(píng)論系統(tǒng)/博客發(fā)布系統(tǒng)中,防止出現(xiàn)敏感詞匯,可以降低不必要的麻煩出現(xiàn)。

上述就是小編為大家分享的Serverless如何實(shí)現(xiàn)文本敏感詞過(guò)濾了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享題目:Serverless如何實(shí)現(xiàn)文本敏感詞過(guò)濾
分享路徑:http://jinyejixie.com/article34/gcidpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、建站公司品牌網(wǎng)站制作、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
天津市| 焦作市| 平顶山市| 山西省| 鸡泽县| 六盘水市| 丰台区| 柳州市| 二连浩特市| 大悟县| 八宿县| 正蓝旗| 砀山县| 桃江县| 炎陵县| 临朐县| 炎陵县| 靖宇县| 莲花县| 遵化市| 福海县| 平阳县| 微博| 天全县| 乐山市| 蒙城县| 阿尔山市| 武定县| 蒙城县| 简阳市| 民勤县| 中宁县| 双辽市| 波密县| 嵊泗县| 荆门市| 镇远县| 棋牌| 化德县| 涟水县| 梅河口市|