瀏覽量:104次
導(dǎo)讀:我們?cè)趯?shí)現(xiàn)檢測(cè)一個(gè)字符串是否包含另一個(gè)字符串時(shí),簡(jiǎn)單的用一個(gè)字符串匹配算法就可以實(shí)現(xiàn),如果要實(shí)現(xiàn)檢測(cè)一個(gè)字符串是否包含 N 個(gè)字符串時(shí),這個(gè) N 有可能上千萬(wàn),再利用簡(jiǎn)單的字符串匹配算法就沒(méi)法滿足我們的需求了,上千萬(wàn)的詞需要可以靈活的維護(hù),業(yè)務(wù)方匹配時(shí)能夠拿到自己的詞進(jìn)行匹配,千萬(wàn)詞的匹配需要保證匹配速度,要在秒級(jí)之內(nèi)出結(jié)果。所以,我們需要一套解決此類問(wèn)題的方案——詞表服務(wù) 。
全文5370字,預(yù)計(jì)閱讀時(shí)間 12分鐘。
一、背景內(nèi)容審核平臺(tái)需要檢測(cè)作者發(fā)的文章中是否含有特殊的敏感詞。對(duì)于不同的業(yè)務(wù)線對(duì)這些詞的要求也不同,有的嚴(yán)格有的寬松;有的需要單詞,有的需要多詞;有的需要檢測(cè)出隱含詞、變體詞;有的在標(biāo)題生效,有的在正文生效;有的檢測(cè)出送人審,有的檢測(cè)出直接拒絕;有的需要幾千詞,有的需要上萬(wàn)、百萬(wàn)、甚至千萬(wàn)詞。對(duì)于這些詞各業(yè)務(wù)線可以自己維護(hù),方便增加、刪除、修改,各業(yè)務(wù)可以根據(jù)自己的需求配置詞的生效規(guī)則;在檢測(cè)的時(shí)候業(yè)務(wù)方可以拿到自己維護(hù)的詞對(duì)文章進(jìn)行檢測(cè),而且需要保證檢測(cè)的時(shí)效,能夠?qū)崟r(shí)拿到檢測(cè)結(jié)果。
二、架構(gòu)上圖是詞表服務(wù)的整體架構(gòu):
(1)詞表管理:各業(yè)務(wù)線在詞表管理平臺(tái)維護(hù)自己的詞表,每個(gè)業(yè)務(wù)線可以添加多個(gè)詞表組,每個(gè)詞表組中可以維護(hù)敏感詞以及可以動(dòng)態(tài)添加敏感詞的屬性;詞表管理平臺(tái)用ES實(shí)現(xiàn)了對(duì)詞表及上千萬(wàn)詞高效的分詞檢索能力;詞表管理會(huì)定時(shí)生成各業(yè)務(wù)線的詞表BOS文件,上傳到BOS服務(wù)。
(2)服務(wù)層:業(yè)務(wù)方調(diào)用詞表服務(wù)統(tǒng)一對(duì)外的匹配接口,服務(wù)層將匹配任務(wù)送到策略算子層,完成詞表的匹配功能。詞表對(duì)外的統(tǒng)一服務(wù)相當(dāng)于一個(gè)簡(jiǎn)單的網(wǎng)關(guān),提供了鑒權(quán)功能,驗(yàn)證請(qǐng)求是否合法;提供了流量限制的功能,可以為每個(gè)請(qǐng)求方設(shè)置流量限制值;提供了結(jié)果處理的功能,策略算子返回的敏感詞屬性只是一部分,根據(jù)業(yè)務(wù)方的需求,可以完善策略算子返回的敏感詞屬性;提供了流量轉(zhuǎn)發(fā)的功能,可以根據(jù)配置將各業(yè)務(wù)線的請(qǐng)求打到不同的集群,實(shí)現(xiàn)各業(yè)務(wù)策略算子分集群部署。
(3)策略算子層:策略算子實(shí)現(xiàn)對(duì)文本中敏感詞的匹配,匹配的模式有包含匹配、強(qiáng)過(guò)濾匹配、多模匹配,命中的敏感詞會(huì)返回給詞表服務(wù)層。各業(yè)務(wù)線的詞表會(huì)被策略的每個(gè)算子用全量刷新的方式或者實(shí)時(shí)同步增量數(shù)據(jù)的方式加載到內(nèi)存,支持算子的匹配功能。全量刷新的方式:詞表管理平臺(tái)會(huì)定時(shí)將詞表分業(yè)務(wù)線生成BOS文件,上傳到 BOS 服務(wù),策略算子定時(shí)從BOS文件中同步敏感詞到內(nèi)存;實(shí)時(shí)同步的方式:策略算子會(huì)實(shí)時(shí)掃描刺詞表數(shù)據(jù)庫(kù),將增量的詞表加載到內(nèi)存。
(4)基礎(chǔ)服務(wù):GDP框架實(shí)現(xiàn)了詞表服務(wù)開(kāi)發(fā),Pandora平臺(tái)實(shí)現(xiàn)了詞表服務(wù)的部署,mysql 實(shí)現(xiàn)了詞表數(shù)據(jù)的存儲(chǔ),ES實(shí)現(xiàn)了詞表的分詞檢索,bdrp實(shí)現(xiàn)了限流及緩存功能,BOS服務(wù)實(shí)現(xiàn)了詞表文件的的傳輸。
三、詞表管理平臺(tái)詞表管理平臺(tái),實(shí)現(xiàn)了各業(yè)務(wù)線維護(hù)自己的詞表,每個(gè)業(yè)務(wù)線下可以創(chuàng)建多個(gè)詞表組,方便業(yè)務(wù)方分類管理自己的敏感詞,每個(gè)詞表組的含義由業(yè)務(wù)方賦予,具體體現(xiàn)在當(dāng)命中的敏感詞屬于這個(gè)詞表組的時(shí)候,業(yè)務(wù)方是否根據(jù)詞表組做不同的處置;每個(gè)詞表組下可以維護(hù)敏感詞,敏感詞的屬性由業(yè)務(wù)方自己選擇,例如,審核類型這個(gè)屬性,業(yè)務(wù)方可以根據(jù)命中具體某個(gè)敏感詞后要送審,就選擇送審詞這個(gè)屬性值,如果要拒絕就選擇拒絕詞這個(gè)屬性值。
3.1詞表管理各業(yè)務(wù)線可以添加、修改的詞表,可以對(duì)詞表進(jìn)行檢索。
(1)新增詞表,選擇屬于的業(yè)務(wù)線,添加名字和備注,可以一次將詞表創(chuàng)建到多個(gè)業(yè)務(wù)線下,如果其他業(yè)務(wù)線有詞表可以復(fù)用,也可直接將其他業(yè)務(wù)線的詞表拷貝到自己新建的詞表下,方便快捷,方便管理人員對(duì)詞表的管理。如圖1:
(1)修改詞表,可以修改詞表的名字、備注,可以將詞表重新指定業(yè)務(wù)線,如果其他業(yè)務(wù)線有詞表可以復(fù)用,也可直接將其他業(yè)務(wù)線的詞表拷貝到自己的詞表下,方便快捷,方便管理人員對(duì)詞表的管理。如圖2:
(2)詞表檢索,支持通過(guò)詞表ID、詞表名稱、業(yè)務(wù)線以及創(chuàng)建的時(shí)間檢索詞表;詞表名稱的檢索,利用了 ES 的特性可以實(shí)現(xiàn)對(duì)詞表名稱進(jìn)行分詞檢索;在檢索到的列表中,可以看到詞表的id、詞表名稱、業(yè)務(wù)線、詞表的創(chuàng)建時(shí)間、更新時(shí)間、每個(gè)詞表下的詞條數(shù)量、詞表備注、詞表的生效狀態(tài)操作人等詞表屬性;可以在列表中狀態(tài)中點(diǎn)擊,將詞表改成生效或失效狀態(tài);在操作欄可以點(diǎn)擊修改,修改詞表,點(diǎn)擊追加給詞表添加詞,點(diǎn)擊查看查看詞表的詳情信息。如圖3:
3.2敏感詞維護(hù)在詞表中可以高效快捷的維護(hù)敏感詞。重要的敏感詞的屬性包含:
(1) 詞條類型:標(biāo)識(shí)敏感詞是送審詞還是過(guò)濾詞;
(2) 敏感類型:標(biāo)識(shí)詞條的敏感分類;
(3) 匹配模式:包含匹配-檢測(cè)本文中是否包含敏感詞,強(qiáng)過(guò)濾匹配-檢測(cè)文本中漢字、字母、數(shù)字、特殊字符相互組合后是否包含敏感詞,多模匹配-檢測(cè)文本中是否命中2個(gè)或3個(gè)詞,且多個(gè)詞間距在有效范圍內(nèi)。
(4) 生效位置:敏感詞在文章中的生效位置,如,標(biāo)題、正文、圖片中給的文字等。
(5) 豁免詞:包含匹配中敏感詞的屬性,如果敏感詞是A,豁免詞是B,文本中有AB詞,則敏感詞A不會(huì)命中。
(6) 延展策略:多模位置置換-如果有多模詞AB,文本中有詞BA,則可以命中AB敏感詞;字母大小寫轉(zhuǎn)換-忽略大小寫,如果敏感詞是cd,文本中有cD、Cd、CD詞,則都可命中cd詞。
(7) 失效時(shí)間:提供了長(zhǎng)期有效和具體失效時(shí)間兩種選擇。
敏感詞維護(hù)提供了單條添加、批量添加、單條修改、批量修改、詞表檢索、詞條檢索等功能:
(1)單條追加,追加的詞表名稱已經(jīng)確定,業(yè)務(wù)方可以根據(jù)自己的業(yè)務(wù)選擇詞的屬性,追加中的操作,如果詞的匹配模式屬性選擇了包含詞,可以添加這個(gè)詞的豁免詞。如圖4:
(2)批量添加,支持同步最大一次添加3000條,可以同時(shí)添加到不同業(yè)務(wù)線的不同的詞表中,方便快捷,方便了管理員對(duì)敏感詞的維護(hù)工作,要添加的所有的敏感詞屬性必須一致才可以使用此功能,二期不支持給包含詞添加豁免詞屬性,可以在敏感詞輸入框中換行輸入多條。如圖5:
(3)批量創(chuàng)建,業(yè)務(wù)方可以根據(jù)自己的業(yè)務(wù)將敏感詞及屬性維護(hù)到EXCEL表中,每個(gè)文件最大支持3萬(wàn)詞,提交后,可以生成一個(gè)創(chuàng)建任務(wù),后臺(tái)運(yùn)行,同時(shí)可以創(chuàng)建多個(gè)任務(wù),執(zhí)行的時(shí)候是順序執(zhí)行,如圖6:
(3)單條修改,可以修改詞條的任意屬性,如果敏感詞是同步批量添加的包含詞,想要添加敏感詞的豁免詞可以在這里修改。如圖7:
(3)批量修改,業(yè)務(wù)方可以根據(jù)自己的業(yè)務(wù)將敏感詞及要修改的屬性維護(hù)到EXCEL表中,每個(gè)文件最大支持3萬(wàn)詞,提交后,可以生成一個(gè)更新任務(wù),后臺(tái)運(yùn)行,同時(shí)可以創(chuàng)建多個(gè)更新任務(wù),執(zhí)行的時(shí)候是順序執(zhí)行。如圖8::
(4)敏感詞檢索,可以根據(jù)敏感詞的審核類型、匹配模式、生效位置、敏感類型、操作人、所屬業(yè)務(wù)線、所屬詞表、敏感詞的創(chuàng)建時(shí)間等屬性檢索,敏感詞的檢索使用了ES分詞檢索的特性,可以支持分詞檢索,也可以實(shí)現(xiàn)精確檢索;檢索的列表中展示了敏感詞的名稱、所屬業(yè)務(wù)線、所屬詞表、操作人、操作時(shí)間、備注等字段,可以查看總體數(shù)量,可以導(dǎo)出,批量解除,操作欄中,可以點(diǎn)擊修改,進(jìn)入修改頁(yè)面,可以點(diǎn)擊解除,解除此條敏感詞。如圖9:
四、詞表服務(wù)統(tǒng)一入口詞表服務(wù)統(tǒng)一入口,提供了標(biāo)準(zhǔn)的 API 接口,業(yè)務(wù)方調(diào)用詞表服務(wù)統(tǒng)一對(duì)外的匹配接口,服務(wù)層將匹配任務(wù)送到策略算子層,完成詞表的匹配功能。詞表對(duì)外的統(tǒng)一服務(wù)相當(dāng)于一個(gè)簡(jiǎn)單的網(wǎng)關(guān),提供了鑒權(quán)功能,驗(yàn)證請(qǐng)求是否合法;提供了流量限制的功能,可以為每個(gè)請(qǐng)求方設(shè)置流量限制值;提供了結(jié)果處理的功能,策略算子返回的敏感詞屬性只是一部分,根據(jù)業(yè)務(wù)方的需求,可以完善策略算子返回的敏感詞屬性;提供了流量轉(zhuǎn)發(fā)的功能,可以根據(jù)配置將各業(yè)務(wù)線的請(qǐng)求打到不同的集群,實(shí)現(xiàn)各業(yè)務(wù)策略算子分集群部署。具體的流程,如圖10。
五、策略加載詞表策略加載詞表經(jīng)過(guò)多方案的迭代,方案最終逐漸成熟穩(wěn)定。
第一版詞表在策略的生效方案:詞表管理平臺(tái)將所有的業(yè)務(wù)線的詞表生成一個(gè)詞表文件,上傳到BOS,詞表策略30min定時(shí)掃描加載一次。所有業(yè)務(wù)線集中到一個(gè)詞表文件中,一次加載,導(dǎo)致了策略加載詞表速度慢。
第二版的方案,30分鐘生效時(shí)間后來(lái)不能滿足業(yè)務(wù)方的需求,詞表管理平臺(tái)按照業(yè)務(wù)線生成多個(gè)詞表文件,推送到BOS系統(tǒng),詞表策略定時(shí),分業(yè)務(wù)線開(kāi)啟多線程加載詞表,詞表生效時(shí)間由 30min 減少到5分鐘。
單三版方案,5min鐘時(shí)間對(duì)于特殊場(chǎng)景還是不滿足,我們?cè)黾恿嗽~表實(shí)時(shí)同步方案,由詞表策略10s定時(shí)去數(shù)據(jù)庫(kù)掃描增量的數(shù)據(jù)加載到內(nèi)存,但是這種方案不適合上萬(wàn)的增量數(shù)據(jù)加載,只適合萬(wàn)級(jí)以內(nèi)詞的加載。
現(xiàn)在詞表策略加載詞表,第二版和第三版同時(shí)存在,優(yōu)勢(shì)互補(bǔ),整個(gè)演變過(guò)程如圖11:
BOS文件格式,多列用制表符分割,多模詞用 & 符號(hào)連接,包含詞添加前綴 號(hào)識(shí)別,主要的信息有敏感詞id、敏感詞名稱、敏感詞所屬詞表id、多模詞詞間距、失效時(shí)間、審核類型、匹配類型、所屬業(yè)務(wù)線、生效位置、敏感類型、延展策略、豁免詞。如圖12:
全量加載和增量實(shí)時(shí)同步加載流程,全量加載會(huì)在啟動(dòng)的時(shí)候加載一次,加載的頻率半個(gè)小時(shí)以上,可以根據(jù)業(yè)務(wù)線配置;增量實(shí)時(shí)同步10s中去數(shù)據(jù)庫(kù)檢測(cè)一次是否有增量數(shù)據(jù),然后分頁(yè)加載到內(nèi)存。如圖13:
策略緩存詞表到內(nèi)存的加載結(jié)構(gòu),如下:
(1)業(yè)務(wù)線、生效位置,敏感詞,敏感詞id 字典映射。匹配到敏感詞,可以根據(jù)業(yè)務(wù)線,生效位置,快速的找到敏感詞的id,通過(guò)敏感詞的 id 再獲取敏感詞的屬性規(guī)則,用于計(jì)算匹配到的敏感詞是否有效。如圖14:
(2)敏感詞id及敏感詞屬性規(guī)則字典映射,BOS文件每行敏感詞處理存儲(chǔ)。通過(guò)敏感詞ID能夠快速查到敏感詞的屬性規(guī)則,用于計(jì)算匹配到的敏感詞是否有效。如圖15:
(3)敏感詞掛在到字典樹(shù)(Trie樹(shù)),每個(gè)業(yè)務(wù)線、生效位置生成一個(gè)字典樹(shù),字典樹(shù)是詞表策略的核心,上千萬(wàn)的敏感詞匹配能在10ms以內(nèi)返回配置結(jié)果。如圖16:
六、詞表策略匹配實(shí)現(xiàn)6.1詞表策略匹配流程策略配置匹配流程,如圖17:
(1)輸入匹配參數(shù),request_id請(qǐng)求的唯一標(biāo)識(shí),用于上下游定位,req_from請(qǐng)求來(lái)源,用于識(shí)別請(qǐng)求業(yè)務(wù)方,token用于權(quán)限校驗(yàn),service_line業(yè)務(wù)線標(biāo)識(shí),用于識(shí)別匹配用的詞表,conent要匹配的文本,以及文本的配置,用于識(shí)別需要哪個(gè)生效位置的敏感詞。如圖18:
(2)將文本中的中文、字母、數(shù)字、特殊符號(hào)抽取組合生成不同組合的文字片段,用于強(qiáng)過(guò)濾匹配。如圖19:
(3)根據(jù)業(yè)務(wù)線以及文本的位置將文本送到對(duì)應(yīng)的字典樹(shù)匹配出單個(gè)敏感詞,信息包含敏感詞、敏感詞在文本中的位置、敏感詞的長(zhǎng)度,位置和長(zhǎng)度用于多模詞,詞間距是否有效的計(jì)算。匹配出的結(jié)果,如圖20:
(4)通過(guò)業(yè)務(wù)線,生效位置、敏感詞,從 match_data(圖13)緩存中獲取到敏感詞所屬的敏感詞ID,再通過(guò)敏感詞ID從line_cahe緩存中獲取到敏感詞的屬性規(guī)則;如果匹配到的敏感詞是包含詞或者過(guò)濾詞,直接命中輸出;如果是多模詞,則再查找多模詞中的其他詞是否命中,如果命中切兩個(gè)詞的順序和詞間距滿足多模詞的屬性規(guī)則,則命中輸出。結(jié)果返回,如圖21:
6.2大文本匹配超時(shí)解決方案PGC圖文經(jīng)常有幾十萬(wàn)字的大文本文章過(guò)詞表,由于字?jǐn)?shù)太多,召回的詞量能達(dá)到幾萬(wàn),這些詞在做匹配規(guī)則計(jì)算時(shí)耗時(shí)太長(zhǎng),導(dǎo)致匹配超時(shí)。
優(yōu)化方案如圖21:
(1)優(yōu)化前,一個(gè)大文本文章,標(biāo)題字?jǐn)?shù)100,正文19.9w,詞表匹配時(shí)先匹配標(biāo)題,耗時(shí)10ms,再匹配正文,由于正文字?jǐn)?shù)多,耗時(shí)19s,最終匹配的耗時(shí)兩者累加達(dá)到20s。
(2)優(yōu)化后,大文本文章過(guò)詞表,先將字?jǐn)?shù)超過(guò)5000的正文,拆成多個(gè)小于等于5000的正文,詞表匹配時(shí),多個(gè)文字片段并行匹配,最終耗時(shí)結(jié)果是多個(gè)并行計(jì)算中耗時(shí)最大的一個(gè),我舉的例子50ms。
6.3 字典樹(shù)(Trie樹(shù))的實(shí)現(xiàn)字典樹(shù)匹配算法使用了廠內(nèi)的開(kāi)源C 庫(kù) dictmatch,dictmatch實(shí)現(xiàn)了最簡(jiǎn)單的Trie樹(shù)的算法,沒(méi)有進(jìn)行穿線改進(jìn),因此是需要回朔的。但是其使用2個(gè)表來(lái)表示Trie樹(shù),并對(duì)其占用空間大的問(wèn)題進(jìn)行了很大的優(yōu)化,特點(diǎn)是在建樹(shù)的時(shí)候比較慢,但在查詢的時(shí)候非??臁?/p>
字典樹(shù)結(jié)構(gòu),如圖23:
七、發(fā)展&思考詞表特殊字符支持:現(xiàn)在的詞表詞的存儲(chǔ)以及字典樹(shù)的匹配算法對(duì)于表情及其他特殊字符不支持,詞表服務(wù)下一步的優(yōu)化迭代會(huì)主要放在特殊字符的支持上,能夠滿足更多業(yè)務(wù)的需求。
詞表分業(yè)務(wù)線部署:現(xiàn)在詞表服務(wù) 60 的業(yè)務(wù)方,各業(yè)務(wù)線都是混部,所有業(yè)務(wù)線的詞表都在實(shí)例中加載一份,耗費(fèi)內(nèi)存特大,而且詞表服務(wù)出問(wèn)題會(huì)影響所有的業(yè)務(wù)方;如果每個(gè)業(yè)務(wù)線都分集群部署,會(huì)增加維護(hù)成本,所以我們?cè)谔剿饕环N自動(dòng)分業(yè)務(wù)線部署的方式。
作者:百度Geek說(shuō) 鏈接: https://juejin.cn/post/6986882343998849060 來(lái)源:掘金
[聲明]本網(wǎng)轉(zhuǎn)載網(wǎng)絡(luò)媒體稿件是為了傳播更多的信息,此類稿件不代表本網(wǎng)觀點(diǎn),本網(wǎng)不承擔(dān)此類稿件侵權(quán)行為的連帶責(zé)任。故此,如果您發(fā)現(xiàn)本網(wǎng)站的內(nèi)容侵犯了您的版權(quán),請(qǐng)您的相關(guān)內(nèi)容發(fā)至此郵箱【779898168@qq.com】,我們?cè)诖_認(rèn)后,會(huì)立即刪除,保證您的版權(quán)。
官網(wǎng)優(yōu)化
整站優(yōu)化
渠道代理
400-655-5776