lua 文件读写处理(操作敏感词库)
最近需要给游戏做一个敏感词新系统,我采用的方法是比较常用的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 文件读写处理(操作敏感词库)的更多相关文章
- unity对敏感词库处理的记录
string txt = Resources.Load<TextAsset>("minganci").ToString(); //string txt = " ...
- lua文件读写
lua里的文件读写模型来自C语言,分为完整模型(和C一样).简单模型. 1.简单模型 io.input([file]) 设置默认的输入文件,file为文件名(此时会以文本读入)或文件句柄(可以理解为 ...
- C++中文件读写的操作
在C++中读读写文件一般指的就是磁盘中的文本文件和二进制文件: 文本文件:以字符序列组成的文件 二进制文件:由二进制组成的文件 读写文件采用ofstream和ifstream文件流,两者可用头文件&l ...
- 文件读写io操作范例
系统io读写,copy int main(int argc, char **argv) { if(argc != 3) { printf("Usage: %s <src> ...
- C语言基础文件读写操作
整理了一份C语言的文件读写件操作代码,测试时打开相应的注释即可. #include <stdio.h> #include <stdlib.h> #include <uni ...
- C/C++文件读写操作总结
本文主要从两方面介绍读写文件操作,一个是C,另一个是C++. 一.基于C的文件操作. 在ANSI C中对文件操作有两种方式,一种是流式文件操作,另一种是I/O文件操作.下面分别介绍. 1.流式文件操作 ...
- Java实现敏感词过滤
敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...
- 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)
转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...
- Java实现敏感词过滤(转)
敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...
- Jsp敏感词过滤
Jsp敏感词过滤 大部分论坛.网站等,为了方便管理,都进行了关于敏感词的设定. 在多数网站,敏感词一般是指带有敏感政治倾向(或反执政党倾向).暴力倾向.不健康色彩的词或不文明语,也有一些网站根据自身实 ...
随机推荐
- cnpm : 无法将“cnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。所在位置 行:1 字符: 1
出现问题原因: 使用vscode终端powershell控制台查看cnpm版本或者运行cnpm的相关命令时提示如标题错误(cmd控制台提示:'cnpm' 不是内部或外部命令,也不是可运行的程序或批处理 ...
- 学习Java Day20
类的导入的第一种方式就是使用完全限定名,就是包名后面跟着类名 java.time.LocalDate totay=java.time.LocalDate.now(); 另一种可以直接用import j ...
- javaEE(单元测试、反射、动态代理、xml)
单元测试 最小的功能单元编写测试代码,java针对方法,检查方法的正确性 JUnit单元测试框架 @Test注解 public class A { @Test public void a(){ ... ...
- DELLR740服务器安装centos7.9操作系统时发现无法检测到硬盘
问题:RAID卡:PERC H750 安装centos7.9操作系统时发现无法检测到硬盘 解决办法: 1.需要先配置RAID2.如果不配RAID的话,需要在F2选项中的RAID配置中开启NON-RAI ...
- python-最近面试遇到的代码题,mark一下
1. 打印1000以内的质数 draft版本: def printlist(): a = [] for i in range(1, 1001): b.append(i) for j in range( ...
- JZOJ 100149. 一道联赛A题
\(\text{Solution}\) 一眼 \(ODT\) 为避免每次都数颜色数量,提前记录下来,每次修改更新下 \(\text{Code}\) #include <cstdio> #i ...
- Hexo系列(一):Hexo简介
作者:独笔孤行 官网: http://anyamaze.com 公众号:云实战 前言 博客网站的实现方法有很多种,常用的博客框架主要有wordpress.Z-Blog.hexo.Typech ...
- 如何获取win10用户最高权限
第五步,在(输入对象名称)方框中输入"System Managed Accounts Group",再点击"检查名称" 转载: 百度经验: https: ...
- 我做的FFmpeg开源C#封装库Sdcb.FFmpeg
我做的FFmpeg开源C#封装库Sdcb.FFmpeg 写在前面: 该主题为2022年12月份.NET Conf China 2022我的主题,项目地址:https://github.com/sdcb ...
- Python实战项目5-Git远程仓库/分支合并/冲突解决
Git分支 为什么要有分支 可以保证主分支的版本都是可以查看的版本 我们都在开发分支开发,开发完成 合并代码 分支操作 分支查看 git branch 分支创建 git branch 分支名 分支切换 ...