最近需要给游戏做一个敏感词新系统,我采用的方法是比较常用的DFA(确定有穷状态机)算

法,先不讲算法,而这种算法的实现需要一个相应的敏感词库。

我拿到了词库后发现词库中大概有8000+个词,其中包括很多重复的,还有很多有着头包含关

系的词;

  什么是头包含词呢? 看如下例子:

  我们知道在DFA算法读取敏感词后如果存在这种情况:

  词1: "ab"  词2:  "abc"

  在读取之后“ ab “这个敏感词就会不复存在而被abc覆盖掉, 而我们游戏需要对敏感词进行的

操作不是以其他字符(如 * *)代替句子中的敏感词而是如果判断出句子中含有敏感词,则无法发

出。所以,如果 “ab” 已经是敏感词了,“abc”就没有必要出现在敏感词库中了所以我需要将敏感

词库中的

  1. 相同的词只留下一个

  2. 删除头包含其他敏感词的敏感词

  但是现有的敏感词库中有8000+ 个词我不可能一个个去找,所以我就想到了利用现有的lua io

文件库对原先的敏感词库进行处理这样可以节省太多的时间 代码如下

local function getNewWord()
local wordsDataInput = {}
local wordsDataOutput = {}
-- 读取文件
-- 以只读方式打开文件
local file_input = io.open("sensitive_words_input.txt", "r") -- 设置默认输入文件为 test.lua
io.input(file_input) -- 逐行读取文件
local string_l = file_input:read("*l")
while(string_l ~= nil)
do
table.insert(wordsDataInput, string_l)
string_l = file_input:read("*l")
end
io.close(file_input) -- 写入文件
-- 以只写方式打开文件
local file_output = io.open("sensitive_words.txt", "a") -- 设置默认输出文件为
io.output(file_output) -- 对数据进行处理
-- 如果有头包含
local function ifIsHeadInTable(str)
for i = 1, #wordsDataInput do
local startIndex, endIndex = string.find(wordsDataInput[i], str)
if startIndex ~= nil and endIndex ~= nil then
-- 如果find到头索引为1,尾索引不为字符串长度则可以认定为是头包含关系
if startIndex == 1 and endIndex ~= string.len(wordsDataInput[i]) then
wordsDataInput[i] = "\n"
end
end
end
end -- 是否已经有相同的
local function isHasSameInTable(str)
if not wordsDataOutput or not next(wordsDataOutput) then return false end for key, value in ipairs(wordsDataOutput) do
if value == str then
return true
end
end return false
end -- 先剔除头包含
for key, value in pairs(wordsDataInput) do
ifIsHeadInTable(value)
end -- 再剔除相同的
for key, value in ipairs(wordsDataInput) do
if not isHasSameInTable(value) then
table.insert(wordsDataOutput, value)
end
end for index, word in pairs(wordsDataOutput) do
io.write(word.."\n")
end
io.close(file_output)
end

  操作后的文件少了整整4000个词,差不多35kb,这样加载词库需要的空间和时间都大大减少。但是要注意的是lua对文件的操作都是以UTF-8编码来的,如果是其他编码的文件就不能用了。

lua 文件读写处理(操作敏感词库)的更多相关文章

  1. unity对敏感词库处理的记录

    string txt = Resources.Load<TextAsset>("minganci").ToString(); //string txt = " ...

  2. lua文件读写

    lua里的文件读写模型来自C语言,分为完整模型(和C一样).简单模型. 1.简单模型 io.input([file])  设置默认的输入文件,file为文件名(此时会以文本读入)或文件句柄(可以理解为 ...

  3. C++中文件读写的操作

    在C++中读读写文件一般指的就是磁盘中的文本文件和二进制文件: 文本文件:以字符序列组成的文件 二进制文件:由二进制组成的文件 读写文件采用ofstream和ifstream文件流,两者可用头文件&l ...

  4. 文件读写io操作范例

    系统io读写,copy int main(int argc, char **argv) {  if(argc != 3) {   printf("Usage: %s <src> ...

  5. C语言基础文件读写操作

    整理了一份C语言的文件读写件操作代码,测试时打开相应的注释即可. #include <stdio.h> #include <stdlib.h> #include <uni ...

  6. C/C++文件读写操作总结

    本文主要从两方面介绍读写文件操作,一个是C,另一个是C++. 一.基于C的文件操作. 在ANSI C中对文件操作有两种方式,一种是流式文件操作,另一种是I/O文件操作.下面分别介绍. 1.流式文件操作 ...

  7. Java实现敏感词过滤

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

  8. 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)

    转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...

  9. Java实现敏感词过滤(转)

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

  10. Jsp敏感词过滤

    Jsp敏感词过滤 大部分论坛.网站等,为了方便管理,都进行了关于敏感词的设定. 在多数网站,敏感词一般是指带有敏感政治倾向(或反执政党倾向).暴力倾向.不健康色彩的词或不文明语,也有一些网站根据自身实 ...

随机推荐

  1. 【学习日志】Java8的CompletableFuture

    Java 8引入的CompletableFuture,对Future做了改进: 1.可以传入回调对象,不再像Future那样循环查询执行结果. 2.另外可以将多个Future结合到一起并行或串行执行, ...

  2. 一次代码重构 JavaScript 图连通性判定

    简介 说重构其实就是整理了代码,第一次自己手写写的很丑,然后看了书上写的,虽然和书上的思路不同但是整理后几乎一样漂亮 效果 整体代码如下 class Node { AdjNodes = new Set ...

  3. Python学习常见问题及其解决方案(1)

    1.ModuleNotFoundError: No module named 'urllib2' 解决方案: 1)https://blog.csdn.net/weixin_45598506/artic ...

  4. 使用idea的maven项目使用mybatis时遇到的坑

    在使用idea的maven项目中使用mybatis时遇到的一个问题,这个问题困扰了我一段时间,所以我来这里记录一下! 出现的问题是: 我把相同的代码复制到eclipse中,在eclipse中却能正常运 ...

  5. windows定时任务执行python爬虫

    有一些定时爬取的操作,适合用定时任务去执行.个人单独用的项目不适合放在工作所用的服务器上,也没必要单独买个服务器,我们windows电脑本身就有这项功能.接下来是一个windows定时任务执行pyth ...

  6. HACKNOS: RECONFORCE (V1.1)

    HACKNOS: RECONFORCE (V1.1) 目录 HACKNOS: RECONFORCE (V1.1) 1 信息收集 1.1 端口扫描 1.2 ftp分析 1.3 后台目录扫描 1.2.1 ...

  7. ajax请求头添加参数

    在请求ajax时 ,有时后台要求在请求头里边上参数 ,这种情况下一般都是在原生APP项目当中,因为要在登录状态下才,所有要传token和登录id, var token = localStorage.g ...

  8. Ubuntu中用普通方法无法添加自启动

    参考了https://www.cnblogs.com/a5idc/p/13752839.html 如何知道你使用的是哪个init系统?你可以使用这个命令来知道与PID 1(系统上运行的第一个进程)相关 ...

  9. oracle to mogdb 迁移---mtk工具

    ## 一.MTK工具介绍--------- MTK–异构数据迁移工具 MTK全称为 Database Migration Toolkit,是一个可以将Oracle/DB2/MySQL/openGaus ...

  10. 时钟切换电路(无毛刺)——clock switching glitch free

    0.引言 随着越来越多的多频时钟被应用在今天的芯片中,尤其是在通信领域中,经常需要在芯片运行时切换时钟线的源时钟.这通常是通过在硬件中复用两个不同的频率时钟源,并通过内部逻辑控制多路选择器选择线来实现 ...