|
導(dǎo)言
我經(jīng)常光顧cnbeta,那里的評(píng)論很精辟,有時(shí)我也會(huì)忍不住評(píng)上兩句,但近來(lái)突然發(fā)現(xiàn)發(fā)布評(píng)論都必須經(jīng)過(guò)審核才會(huì)顯示了,這讓我感到非常掃興。由此我又想起了此前我曾討論過(guò)的“非法內(nèi)容核查方法”,我想這種人機(jī)結(jié)合的審核方式應(yīng)該會(huì)比較適合現(xiàn)在的cnbeta吧。
而現(xiàn)在我已經(jīng)對(duì)此方案有了更深、更好的思路了,想在此分享出來(lái),和大家探討一下,我將在此逐步解析整個(gè)審查的流程:
準(zhǔn)備工作
要審查臟話,首先需要?jiǎng)?chuàng)建對(duì)應(yīng)的審查規(guī)則,每條規(guī)則需要提供以下基本信息:
1. 表達(dá)式:用于審查內(nèi)容是否匹配的正則表達(dá)式。使用正則的原因在于其靈活性,常規(guī)的純文本檢索雖然快,但遇到干擾符等情況時(shí)束手無(wú)策,而正則就可以輕松解決,例如表達(dá)式“[煞傻媽狗屎賤騷瘙搔臊][/s/S]{0,4}?[逼筆比BB鼻X]”可以匹配多種組合的臟話,并可兼容至多4個(gè)干擾字符。
2. 首字符列表:用于遍歷文章內(nèi)容時(shí)提取疑似首字符使用。對(duì)于表達(dá)式“[煞傻媽狗屎賤騷瘙搔臊][/s/S]{0,4}?[逼筆比BB鼻X]”來(lái)說(shuō),它的首字符列表中應(yīng)包含“煞傻媽狗屎賤騷瘙搔臊”。
3. 尾字符列表:用于遍歷文章內(nèi)容時(shí)提取疑似尾字符使用。對(duì)于表達(dá)式“[煞傻媽狗屎賤騷瘙搔臊][/s/S]{0,4}?[逼筆比BB鼻X]”來(lái)說(shuō),它的尾字符列表中應(yīng)包含“逼筆比BB鼻X”。
4. 分值:即匹配成功后,為該文章增加的危險(xiǎn)度分值。
5. 最大長(zhǎng)度:就是臟話內(nèi)容可能出現(xiàn)的最大字?jǐn)?shù)。對(duì)于表達(dá)式“[煞傻媽狗屎賤騷瘙搔臊][/s/S]{0,4}?[逼筆比BB鼻X]”來(lái)說(shuō),它的最大長(zhǎng)度應(yīng)當(dāng)是6。
6. 精確長(zhǎng)度:就是當(dāng)臟話內(nèi)容完全無(wú)干擾符的情況下的實(shí)際字?jǐn)?shù)。此屬性可以用于計(jì)算匹配內(nèi)容的精準(zhǔn)程度,比如還是用上面那個(gè)表達(dá)式“[煞傻媽狗屎賤騷瘙搔臊][/s/S]{0,4}?[逼筆比BB鼻X]”的例子,如果遇到語(yǔ)段“她的媽媽總是逼我們盡快完婚”也會(huì)匹配成功,但匹配到的內(nèi)容長(zhǎng)度會(huì)是5,與精確長(zhǎng)度2進(jìn)行比對(duì)的話,就可以得知此匹配項(xiàng)有可能屬于誤判;而且我們還可以讓程序依據(jù)精確程度為文章打分,比如此規(guī)則原始分值為10分,但只有40%的精確度,那么在加分時(shí)可以只加4分,這樣得出的危險(xiǎn)度分值將更具參考性。
盡管主要目的是為了檢驗(yàn)臟話,但此機(jī)制也完全適用于檢驗(yàn)文章內(nèi)的廣告、色情、血腥、政治、宗教等內(nèi)容,甚至還可能用來(lái)給內(nèi)容做積極方面的評(píng)分,比如用以審閱學(xué)生作文,對(duì)特定修辭手法予以加分。
初始化
在審查之前,需要事先載入先前創(chuàng)建的規(guī)則,并加以分類,以更方便及加速檢索。
分類的方法是建立一個(gè)Dictionary<規(guī)則>>類型的對(duì)象稱為規(guī)則字典,將規(guī)則可能觸發(fā)的首尾字符組合作為規(guī)則字典的鍵值,保存規(guī)則到對(duì)應(yīng)的字典內(nèi)的List中,這樣可以極大地提高檢索時(shí)獲取規(guī)則的速度。
比如規(guī)則的首尾字符分別為“王”和“蛋”,那么就將此規(guī)則存入規(guī)則字典[“王蛋”]內(nèi)的List中去,如果此規(guī)則存在多種首尾字符組合,那么就保存多個(gè)副本到各種首尾組合的規(guī)則字典鍵值中。
在分類的同時(shí),還應(yīng)該采集并創(chuàng)建以下數(shù)據(jù),并保存?zhèn)溆茫?/span>
1. 全局最大長(zhǎng)度:即所有規(guī)則中,最大長(zhǎng)度屬性的最大值。此屬性將用在檢索時(shí)進(jìn)行預(yù)判斷,以減少不必要的遍歷次數(shù),提高效率。
2. 全局首字符列表:即所有規(guī)則中出現(xiàn)的首字符總列表。此屬性用于檢索文章全文時(shí)使用。
3. 全局尾字符列表:即所有規(guī)則中出現(xiàn)的尾字符總列表。此屬性用于檢索文章全文時(shí)使用。
遍歷內(nèi)容全文
遍歷內(nèi)容的每一個(gè)字符,依據(jù)全局首字符列表和全局尾字符列表找出可能是非法內(nèi)容首字符或尾字符的字符,將該字符及其位置存入相應(yīng)列表中,我們?cè)谶@里將捕獲到的列表稱為疑似首字符列表及疑似尾字符列表。
這里我建議在捕獲到尾字符時(shí)倒序插入到疑似尾字符列表中,這樣在遍歷匹配時(shí)可以優(yōu)先匹配字符較多的內(nèi)容,比如“傻”和“傻瓜”都符合臟話規(guī)則的情況下,優(yōu)先匹配“傻瓜”。
分析并處理捕獲內(nèi)容
接著遍歷疑似首字符列表,從疑似尾字符列表中找出可能與之搭配的尾字符(根據(jù)當(dāng)前首字符索引位置及規(guī)則的全局最大長(zhǎng)度進(jìn)行預(yù)篩檢:尾字符索引位置>=首字符索引位置&&尾字符索引位置<=首字符索引位置+全局最大長(zhǎng)度)。
再將當(dāng)前的首尾字符組合成字符串,當(dāng)作鍵值,向規(guī)則字典查詢鍵值內(nèi)可能匹配的規(guī)則(根據(jù)當(dāng)前首尾字符索引位置進(jìn)行預(yù)篩檢:規(guī)則最大長(zhǎng)度>=尾字符索引位置-首字符索引位置+1)。
從原文中截取首字符索引位置到尾字符索引位置之間的片段,用當(dāng)前規(guī)則進(jìn)行檢驗(yàn),如匹配成功則依據(jù)匹配的精確度增加相應(yīng)比例的分值(算法就是使用規(guī)則的精確長(zhǎng)度除以實(shí)際捕獲到的文本內(nèi)容長(zhǎng)度,再乘以規(guī)則的分值),然后開(kāi)始檢驗(yàn)跨過(guò)當(dāng)前尾字符索引位置之后的下一個(gè)首字符。
除了輸出累計(jì)評(píng)分外,還可以在審核時(shí)生成最高評(píng)分、平均精確度、危險(xiǎn)內(nèi)容覆蓋比例等信息,供人工審核時(shí)參考。
總結(jié)
依照上述步驟,即完成了整個(gè)機(jī)審過(guò)程,然后就可以根據(jù)評(píng)分結(jié)果來(lái)決定如何處理文章了。整個(gè)過(guò)程的簡(jiǎn)略的流程示意圖如下:
這個(gè)經(jīng)過(guò)改進(jìn)的方案兼顧了性能與靈活性:只進(jìn)行一次全文掃描;使用正則表達(dá)式進(jìn)行語(yǔ)段匹配。預(yù)計(jì)稍加優(yōu)化,并加入緩存機(jī)制的話,常規(guī)文章的審核耗時(shí)不會(huì)超過(guò)半秒。
存在并期待改進(jìn)的缺點(diǎn):由于采用了首尾字符匹配形式觸發(fā)正則驗(yàn)證,正則中的斷言似乎就無(wú)用武之地了,這使得正則發(fā)揮的功能有所縮減,魚(yú)與熊掌真不可兼得嗎?
最后,再重申一下我對(duì)人機(jī)協(xié)作審核機(jī)制的處理建議:
不要嘗試將危險(xiǎn)文字自動(dòng)替換后直接發(fā)布,省去人工審核,那樣只會(huì)招致無(wú)限的道魔戰(zhàn)。
無(wú)危險(xiǎn)的內(nèi)容應(yīng)直接發(fā)布;
有一定危險(xiǎn)的內(nèi)容也會(huì)發(fā)布,但在發(fā)布的同時(shí)會(huì)在后臺(tái)提請(qǐng)管理員進(jìn)行人工審查;
高危險(xiǎn)度的內(nèi)容延遲發(fā)布并通知管理員。
NET技術(shù):改進(jìn)的臟話審查方案,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。