欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js實(shí)現(xiàn)敏感詞過濾算法及實(shí)現(xiàn)邏輯

 更新時(shí)間:2018年07月24日 11:28:02   作者:小黎也  
這篇文章主要介紹了js實(shí)現(xiàn)敏感詞過濾算法及實(shí)現(xiàn)邏輯,文中介紹了dfa算法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

最近弄了一個(gè)用戶發(fā)表評(píng)論的功能,用戶上傳了評(píng)論,再文章下可以看到自己的評(píng)論,但作為社會(huì)主義接班人,踐行社會(huì)主義核心價(jià)值觀,所以給評(píng)論敏感詞過濾的功能不可少,在網(wǎng)上找了資料,發(fā)現(xiàn)已經(jīng)有非常成熟的解決方案。 常用的方案用這么兩種

1.全文搜索,逐個(gè)匹配。這種聽起來就不夠高大上,在數(shù)據(jù)量大的情況下,會(huì)有效率問題,文末有比較

2.DFA算法-確定有限狀態(tài)自動(dòng)機(jī) 附上百科鏈接確定有限狀態(tài)自動(dòng)機(jī)

DFA算法介紹

DFA是一種計(jì)算模型,數(shù)據(jù)源是一個(gè)有限個(gè)集合,通過當(dāng)前狀態(tài)和事件來確定下一個(gè)狀態(tài),即 狀態(tài)+事件=下一狀態(tài),由此逐步構(gòu)建一個(gè)有向圖,其中的節(jié)點(diǎn)就是狀態(tài),所以在DFA算法中只有查找和判斷,沒有復(fù)雜的計(jì)算,從而提高算法效率

參考文章 Java實(shí)現(xiàn)敏感詞過濾

實(shí)現(xiàn)邏輯

構(gòu)造數(shù)據(jù)結(jié)構(gòu)

將敏感詞轉(zhuǎn)換成樹結(jié)構(gòu),舉例敏感詞有著這么幾個(gè) ['日本鬼子','日本人','日本男人'] ,那么數(shù)據(jù)結(jié)構(gòu)如下(圖片引用參考文章)

 

每個(gè)文字是一個(gè)節(jié)點(diǎn),連續(xù)的節(jié)點(diǎn)組成一個(gè)詞, 日本人 對(duì)應(yīng)的就是中間的那條鏈,我們可以使用對(duì)象或者map來構(gòu)建樹,這里的栗子采用 map 構(gòu)建節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)中有個(gè)狀態(tài)標(biāo)識(shí),用來表示當(dāng)前節(jié)點(diǎn)是不是最后一個(gè),每條鏈路必須要有個(gè)終點(diǎn)節(jié)點(diǎn),先來看下構(gòu)建節(jié)點(diǎn)的流程圖

 

判斷邏輯

先從文本的第一個(gè)字開始檢查,比如 你我是日本鬼子 ,第一個(gè)字 你 ,在樹的第一層找不到這個(gè)節(jié)點(diǎn),那么繼續(xù)找第二個(gè)字,到了 日 的時(shí)候,第一層節(jié)點(diǎn)找到了,那么接著下一層節(jié)點(diǎn)中查找 本 ,同時(shí)判斷這個(gè)節(jié)點(diǎn)是不是結(jié)尾節(jié)點(diǎn),若是結(jié)尾節(jié)點(diǎn),則匹配成功了,反之繼續(xù)匹配

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

####構(gòu)造數(shù)據(jù)結(jié)構(gòu)

/**
* @description
* 構(gòu)造敏感詞map
* @private
* @returns
*/
private makeSensitiveMap(sensitiveWordList) {
 // 構(gòu)造根節(jié)點(diǎn)
 const result = new Map();
 for (const word of sensitiveWordList) {
  let map = result;
  for (let i = 0; i < word.length; i++) {
   // 依次獲取字
   const char = word.charAt(i);
   // 判斷是否存在
   if (map.get(char)) {
    // 獲取下一層節(jié)點(diǎn)
    map = map.get(char);
   } else {
    // 將當(dāng)前節(jié)點(diǎn)設(shè)置為非結(jié)尾節(jié)點(diǎn)
    if (map.get('laster') === true) {
     map.set('laster', false);
    }
    const item = new Map();
    // 新增節(jié)點(diǎn)默認(rèn)為結(jié)尾節(jié)點(diǎn)
    item.set('laster', true);
    map.set(char, item);
    map = map.get(char);
   }
  }

 }
 return result;
}

最終map結(jié)構(gòu)如下

 

查找敏感詞

/**
* @description
* 檢查敏感詞是否存在
* @private
* @param {any} txt
* @param {any} index
* @returns
*/
private checkSensitiveWord(sensitiveMap, txt, index) {
 let currentMap = sensitiveMap;
 let flag = false;
 let wordNum = 0;//記錄過濾
 let sensitiveWord = ''; //記錄過濾出來的敏感詞
 for (let i = index; i < txt.length; i++) {
  const word = txt.charAt(i);
  currentMap = currentMap.get(word);
  if (currentMap) {
   wordNum++;
   sensitiveWord += word;
   if (currentMap.get('laster') === true) {
    // 表示已到詞的結(jié)尾
    flag = true;
    break;
   }
  } else {
   break;
  }
 }
 // 兩字成詞
 if (wordNum < 2) {
  flag = false;
 }
 return { flag, sensitiveWord };
}
/**
* @description
* 判斷文本中是否存在敏感詞
* @param {any} txt
* @returns
*/
public filterSensitiveWord(txt, sensitiveMap) {
 let matchResult = { flag: false, sensitiveWord: '' };
 // 過濾掉除了中文、英文、數(shù)字之外的
 const txtTrim = txt.replace(/[^\u4e00-\u9fa5\u0030-\u0039\u0061-\u007a\u0041-\u005a]+/g, '');
 for (let i = 0; i < txtTrim.length; i++) {
  matchResult = checkSensitiveWord(sensitiveMap, txtTrim, i);
  if (matchResult.flag) {
   console.log(`sensitiveWord:${matchResult.sensitiveWord}`);
   break;
  }
 }
 return matchResult;
}

效率

為了看出DFA的效率,我做了個(gè)簡單的小測(cè)試,測(cè)試的文本長度為5095個(gè)漢字,敏感詞詞庫中有2000個(gè)敏感詞,比較的算法分別為 DFA算法 和 String原生對(duì)象提供的 indexOf API做比較

// 簡單的字符串匹配-indexOf
ensitiveWords.forEach((word) => {
 if (ss.indexOf(word) !== -1) {
  console.log(word)
 }
})

分別將兩個(gè)算法執(zhí)行100次,得到如下結(jié)果

 

可直觀看出, DFA 的平均耗時(shí)是在1ms左右,最大為5ms; indexOf 方式的平均耗時(shí)在9ms左右,最大為14ms,所以DFA效率上還是非常明顯有優(yōu)勢(shì)的。

總結(jié)

以上所述是小編給大家介紹的js實(shí)現(xiàn)敏感詞過濾算法及實(shí)現(xiàn)邏輯,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 前端常見的兩種pc適配方案介紹

    前端常見的兩種pc適配方案介紹

    這篇文章主要介紹了前端常見的兩種pc適配方案的相關(guān)資料,在PC端自適應(yīng)設(shè)計(jì)通過優(yōu)化用戶體驗(yàn)和提高網(wǎng)站適配性,確保了電商網(wǎng)站、企業(yè)官網(wǎng)和在線教育平臺(tái)等多種場(chǎng)景下內(nèi)容的清晰展示和流暢操作,需要的朋友可以參考下
    2024-10-10
  • Echarts實(shí)現(xiàn)暫無數(shù)據(jù)的三種方法

    Echarts實(shí)現(xiàn)暫無數(shù)據(jù)的三種方法

    本文將介紹如何使用Echarts實(shí)現(xiàn)暫無數(shù)據(jù)的三種方法,詳細(xì)講解這三種方法的實(shí)現(xiàn)步驟和效果展示,幫助讀者更好地理解如何在Echarts中處理暫無數(shù)據(jù)的情況
    2023-08-08
  • 簡單的js表格操作

    簡單的js表格操作

    這篇文章主要為大家詳細(xì)介紹了簡單的js表格操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 淺談js中的引用和復(fù)制(傳值和傳址)

    淺談js中的引用和復(fù)制(傳值和傳址)

    下面小編就為大家?guī)硪黄獪\談js中的引用和復(fù)制(傳值和傳址)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • 使用OpenLayers3 添加地圖鼠標(biāo)右鍵菜單

    使用OpenLayers3 添加地圖鼠標(biāo)右鍵菜單

    這篇文章主要介紹了使用OpenLayers3 添加地圖鼠標(biāo)右鍵菜單的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • 前端技巧之js-md5的簡單使用方法

    前端技巧之js-md5的簡單使用方法

    這篇文章主要給大家介紹了關(guān)于前端技巧之js-md5的簡單使用,js-md5是一種前端加密算法,用于在前端對(duì)密碼等敏感信息進(jìn)行加密,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 在Webpack中用url-loader處理圖片和字體的問題

    在Webpack中用url-loader處理圖片和字體的問題

    這篇文章主要介紹了在Webpack中用url-loader處理圖片和字體的問題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 詳解自動(dòng)生成博客目錄案例

    詳解自動(dòng)生成博客目錄案例

    本文主要對(duì)自動(dòng)生成博客目錄的具體實(shí)現(xiàn)方法進(jìn)行介紹,需要的朋友可以看看
    2016-12-12
  • 微信小程序?qū)⒆址啥S碼圖片的操作方法

    微信小程序?qū)⒆址啥S碼圖片的操作方法

    這篇文章主要介紹了微信小程序?qū)⒆址啥S碼圖片的操作方法,需要的朋友可以參考下
    2018-07-07
  • JS控制圖片等比例縮放的示例代碼

    JS控制圖片等比例縮放的示例代碼

    本篇文章主要是對(duì)JS控制圖片等比例縮放的示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-12-12

最新評(píng)論