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敏感词过滤 大部分论坛.网站等,为了方便管理,都进行了关于敏感词的设定. 在多数网站,敏感词一般是指带有敏感政治倾向(或反执政党倾向).暴力倾向.不健康色彩的词或不文明语,也有一些网站根据自身实 ...
随机推荐
- vue学习笔记(八)---- vue中的实例属性(wacth和computed的使用)
一.watch属性的使用 1.传统方式实现双向数据改变监听事件(姓名拼接案例) <div id="app"> 姓: <input type="text& ...
- 走进Linux
走进Linux Linux诞生 BSD,Unix,Minix都是操作系统. 1991年,林纳斯托瓦兹在上大学时,对操作系统很好奇.但是由于 386 BSD 还没有出来.可是他不喜欢他的 386 ...
- USACO 2023 January Contest, Bronze Problem 3. Moo Operations
这道题目灰常简单,我们先从最简单的3个字符串开始 有以下几种情况: 可以看到,只有在中间是O的情况下才有可能变成MOO 辣么我们不妨在在s串中枚举这个中间 O 每枚举到一个就看看能不能用他的本身操作次 ...
- 经典this指向问题
代码如下 function f1() { this.p = function(){ // 这里 this 跟的是p这个func,谁调用p,就跟谁 console.log(this); } return ...
- 复制内容到剪切板通用的js方法
复制内容到剪切板通用的js方法 /** * 复制内容到剪切板 * @param text 要复制的内容 */ function Clipboard(text) { if (navigator.clip ...
- 视觉十四讲:第六讲_ceres非线性优化
使用Ceres求解非线性优化问题,一共分为三个部分: 1. 第一部分:构建cost fuction,即代价函数,也就是寻优的目标式.这个部分需要使用仿函数(functor)这一技巧来实现,做法是定义一 ...
- 关于Powerlink和EtherCAT的对比
https://www.amobbs.com/thread-5679636-1-2.html 转发自:http://book.2cto.com/201508/55093.html 这个问题经常会被人问 ...
- 【Go并发编程】Goroutine的基本使用
goroutine是什么 goroutine即协程,使用go关键字开启一个协程异步执行代码. 注意,main函数也是个goroutine. 基本使用 使用go执行子任务,会交替执行(和时间片一样). ...
- 网关与网络地址(网络号)以及IP地址、广播地址
转载新浪博客: http://blog.sina.com.cn/s/blog_406127500101i8bp.html
- python实现移动二级目录下的文件到一级目录
python实现移动二级目录下的文件到一级目录 import os import shutil import sys def move_to_work_folder(work_path, cur_pa ...