当前位置: 首页 > news >正文

如何通过阿里云自己做网站项链seo关键词

如何通过阿里云自己做网站,项链seo关键词,网站后台基本功能,长沙好博网站建设有限公司在游戏中经常会有需要玩家输入一些内容的功能,例如聊天,命名等,这款游戏只有在存档时辉用到命名功能,所以这个过滤也只是一个实验性的功能,我们将使用AC自动机来实现,这是在我们把“csdn”这个词设置为屏蔽…

         在游戏中经常会有需要玩家输入一些内容的功能,例如聊天,命名等,这款游戏只有在存档时辉用到命名功能,所以这个过滤也只是一个实验性的功能,我们将使用AC自动机来实现,这是在我们把“csdn”这个词设置为屏蔽词后的效果:

目录

一、敏感词词典的处理

二、搭建AC自动机

1.自动机节点的数据机构

2.加载词典

3.建立字典树

4.建立失配指针

三、替换字符串中的敏感词


一、敏感词词典的处理

        我们是从别的地方找的开源词典,所以要做一下筛选,首先我们要去重,然后去除所有的标点符号空格和其他无关字符,然后同时去掉长度为1的字符,因为其会在AC自动机中表现的过于严格

wifstream InputTxt;
wofstream OutputTxt;
//词典的路径,这里是单独开了一个程序,所以和后面项目里相关代码用到的路径不同
InputTxt.open("Dict.txt", ios::out);
//使用宽字符串读入
wstring Word;
map<wstring, bool>Words;	
while (getline(InputTxt,Word))
{//去重if (Words.find(Word) == Words.end()){//去掉短字,但这里对中文无效,因为一个中文字长度大概率不为1if (Word.size() == 1)continue;for (auto& It1 : Word){//统一成小写if (iswupper(It1)){It1 = towlower(It1);}//去除字符				if (iswpunct(It1)||iswblank(It1)||iswspace(It1)){Word.erase(It1);It1--;}				}//记录这个词处理完毕Words[Word] = true;}
}
InputTxt.close();
OutputTxt.open("Dict.txt", ios::out);
//将处理完的词重新写入词典
for (auto& It: Words)
{OutputTxt << It.first << endl;
}

二、搭建AC自动机

        AC自动机就是在字典树的基础上加入了类似于KMP的失配指针,当匹配串在树上失配时,会回溯到某个上一层的节点,该节点的所有父节点即前缀,和失配节点的所有父节点的后缀,形成最大匹配,使多模匹配的效率达到近似O(匹配串长度)

1.自动机节点的数据机构

        因为我们要将匹配到的敏感词替换成'*',所以相比于一般的自动机节点,要在每个词的末尾记录这个词的长度,同时因为不止26个字母,所以也用红黑树替代了数组

class FSensitiveWordFilterStruct
{
public:FSensitiveWordFilterStruct()=default;explicit FSensitiveWordFilterStruct(const wchar_t&InputCharacter):Character(InputCharacter){};//字符wchar_t Character{'#'};//匹配的字符串的长度int Length{0};//子节点TMap<wchar_t,std::shared_ptr<FSensitiveWordFilterStruct>>ChildNode;//失配指针FSensitiveWordFilterStruct* FailPointer{this};
};

        然后我们在游戏实例中声明自动机的根节点:

//屏蔽词过滤器树根
std::shared_ptr <FSensitiveWordFilterStruct>SensitiveWordFilterRoot;

        在游戏启动时初始化AC自动机,用到的函数后面一个一个讲:

UAstromutateGameInstance::UAstromutateGameInstance()
{//加载词典LoadTXTFile("/Movies/Dict.txt");//实例化自动机根节点SensitiveWordFilterRoot=std::make_shared<FSensitiveWordFilterStruct>(FSensitiveWordFilterStruct());//将词典中的词添加到树上for(const auto&It:*SensitiveWords){AddWordToSensitiveWordTree(It);}//建立失配指针InitializeSensitiveWordTree();
}

2.加载词典

        这里我们把词典作为txt文件放在Movies文件夹下,因为该文件夹中的所有文件都会被原封不动的打包,我们将所有敏感词存到一个TArray中

//声明敏感词词典
TSharedPtr<TArray<FString>> SensitiveWords;
auto UAstromutateGameInstance::LoadTXTFile(const FString& Path)->void
{//获取词典路径FString Temp{FPaths::ProjectContentDir()+Path};//实例化词典数组SensitiveWords=MakeShared<TArray<FString>>(TArray<FString>());//加载所有词FFileHelper::LoadFileToStringArray(*SensitiveWords,*Temp);UE_LOG(LogTemp,Warning,TEXT("SensitiveWords loade %d Words"),SensitiveWords->Num());
}

3.建立字典树

        从根节点开始,遍历模式串,如果当前点没有当前字符对应的子节点,就创建之,然后无论有无都移动到该子节点

auto UAstromutateGameInstance::AddWordToSensitiveWordTree(const FString& InputString) const->void
{//获取根节点FSensitiveWordFilterStruct* Temp=SensitiveWordFilterRoot.get();//遍历模式串中的每一个字符for(const auto&It:InputString){wchar_t CurrentChar{It};//如果当前点没有对应的子节点,就添加之if(!Temp->ChildNode.Contains(CurrentChar)){Temp->ChildNode.Add(CurrentChar,std::make_shared<FSensitiveWordFilterStruct>(FSensitiveWordFilterStruct(CurrentChar)));}Temp=Temp->ChildNode[CurrentChar].get();}//将词的长度记录在词尾Temp->Length=InputString.Len();
}

4.建立失配指针

        因为失配指针指向的节点一定在当前点的上层,所以我们进行bfs,首先将根节点的所有直连的子节点的失配指针指向根节点,因为这些点的上层节点只有根节点。然后对于一个失配点,如果其父节点的失配指针指向的点的子节点中有和该失配点相同的点,则失配点的失配指针指向该点,否则指向根节点

auto UAstromutateGameInstance::InitializeSensitiveWordTree() const -> void
{//bfs队列std::queue<std::shared_ptr<FSensitiveWordFilterStruct>>Queue;//将深度为1的点的失配指针指向根节点for(auto&It:SensitiveWordFilterRoot->ChildNode){It.Value->FailPointer=SensitiveWordFilterRoot.get();Queue.push(std::make_shared<FSensitiveWordFilterStruct>(*It.Value));}while(!Queue.empty()){std::shared_ptr<FSensitiveWordFilterStruct> CurrentNode=Queue.front();Queue.pop();//遍历所有子节点for(auto&It:CurrentNode->ChildNode){//父节点的失配指针指向的节点是否含有匹配的子节点if(!CurrentNode->FailPointer->ChildNode.Contains(It.Key)){It.Value->FailPointer=SensitiveWordFilterRoot.get();}else{It.Value->FailPointer=CurrentNode->FailPointer->ChildNode[It.Key].get();}Queue.push(std::make_shared<FSensitiveWordFilterStruct>(*It.Value));}}
}

三、替换字符串中的敏感词

        首先我们将玩家输入的字符串使用字典中字符串同样的方法进行处理,去除符号和空格,全部转为小写,然后遍历其每一个字符,不匹配就按失配指针移动,匹配就检查是否是词尾,如果是的话根据记录的词的长度算出这个词的区间,将这个居间内的所有字符替换成'*',该操作不会影响到后面的匹配,最后将字符串还原成原来有符号和空格的格式并返回

auto UAstromutateGameInstance::ReplaceSensitiveWords(const FString& RawString)->FString
{FString Result{""};//对玩家输入的字符串进行处理for(const auto&It:RawString){if(iswpunct(It)||iswblank(It)||iswspace(It))continue;if(isupper(It))Result+=towlower(It);elseResult+=It;}FSensitiveWordFilterStruct* Temp{SensitiveWordFilterRoot.get()};//遍历匹配串的每一个字符for(int i=0;i<Result.Len();i++){wchar_t CurrentChar{Result[i]};//如果失配就一直回溯,直到根节点while(!Temp->ChildNode.Contains(CurrentChar)&&Temp!=SensitiveWordFilterRoot.get()){Temp=Temp->FailPointer;}//仍然适配就结束这个字符的搜索if(!Temp->ChildNode.Contains(CurrentChar)){Temp=SensitiveWordFilterRoot.get();continue;}//移动到匹配的节点Temp=Temp->ChildNode[CurrentChar].get();FSensitiveWordFilterStruct* Temp2{Temp};//遍历匹配到的所有词while(Temp2!=SensitiveWordFilterRoot.get()){if(Temp2->Length){//根据长度算出该词其实位置for(int j=i-Temp2->Length+1;j<=i;j++){Result[j]='*';}}Temp2=Temp2->FailPointer;}}//将处理完的字符串还原成输入的格式FString TrueResult{RawString};int CurrentIndex{0};for(auto&It:TrueResult){if(iswpunct(It)||iswblank(It)||iswspace(It))continue;if(iswupper(It)&&iswlower(Result[CurrentIndex])){continue;}It=Result[CurrentIndex++];}return TrueResult;
}


文章转载自:
http://progressively.c7491.cn
http://caffre.c7491.cn
http://pbs.c7491.cn
http://photosensitizer.c7491.cn
http://curve.c7491.cn
http://vlcc.c7491.cn
http://literatus.c7491.cn
http://miasmal.c7491.cn
http://pluck.c7491.cn
http://skiver.c7491.cn
http://inkiness.c7491.cn
http://liquidambar.c7491.cn
http://grad.c7491.cn
http://peacekeeper.c7491.cn
http://prevenient.c7491.cn
http://upborne.c7491.cn
http://andorran.c7491.cn
http://gride.c7491.cn
http://mouther.c7491.cn
http://patrilocal.c7491.cn
http://vena.c7491.cn
http://cisalpine.c7491.cn
http://focus.c7491.cn
http://labored.c7491.cn
http://anthracitic.c7491.cn
http://safelight.c7491.cn
http://misjudgment.c7491.cn
http://salome.c7491.cn
http://atli.c7491.cn
http://relaxed.c7491.cn
http://tectonician.c7491.cn
http://sporty.c7491.cn
http://enameling.c7491.cn
http://barge.c7491.cn
http://axostyle.c7491.cn
http://scholasticism.c7491.cn
http://empoverish.c7491.cn
http://inshore.c7491.cn
http://hoick.c7491.cn
http://hydrocinnamic.c7491.cn
http://despise.c7491.cn
http://proline.c7491.cn
http://patiently.c7491.cn
http://restrained.c7491.cn
http://pentastich.c7491.cn
http://nutate.c7491.cn
http://odorless.c7491.cn
http://pentagonoid.c7491.cn
http://avidin.c7491.cn
http://swaggeringly.c7491.cn
http://epilogue.c7491.cn
http://gallicize.c7491.cn
http://nevadan.c7491.cn
http://echolalia.c7491.cn
http://dunemobile.c7491.cn
http://quarryman.c7491.cn
http://unpronounced.c7491.cn
http://polyphonous.c7491.cn
http://debited.c7491.cn
http://cheekiness.c7491.cn
http://treponema.c7491.cn
http://inchoate.c7491.cn
http://ectad.c7491.cn
http://puncta.c7491.cn
http://overslept.c7491.cn
http://joking.c7491.cn
http://lavatory.c7491.cn
http://pulsator.c7491.cn
http://symptomatize.c7491.cn
http://ratiocinate.c7491.cn
http://buntons.c7491.cn
http://apnea.c7491.cn
http://manioc.c7491.cn
http://dustbrand.c7491.cn
http://antispasmodic.c7491.cn
http://skipjack.c7491.cn
http://czarism.c7491.cn
http://saltless.c7491.cn
http://versatile.c7491.cn
http://tetramethyl.c7491.cn
http://reflectional.c7491.cn
http://pearson.c7491.cn
http://revolute.c7491.cn
http://coroneted.c7491.cn
http://allotropy.c7491.cn
http://sedately.c7491.cn
http://seismism.c7491.cn
http://sanitaria.c7491.cn
http://quartus.c7491.cn
http://empathic.c7491.cn
http://ethogram.c7491.cn
http://lictor.c7491.cn
http://noshery.c7491.cn
http://spaniard.c7491.cn
http://voyeuristic.c7491.cn
http://tartary.c7491.cn
http://permanent.c7491.cn
http://irrealizable.c7491.cn
http://snakebite.c7491.cn
http://platitude.c7491.cn
http://www.zhongyajixie.com/news/70163.html

相关文章:

  • 做网站所具备的的条件外贸网站建设推广公司
  • 谁给个好网站百度网页版电脑版
  • 使用top域名做网站软文推广发布
  • 网站怎么做数据库百度app下载安装官方免费下载
  • 领导高度重视门户网站建设今日新闻联播
  • 做淘宝网站报告网络营销计划的七个步骤
  • 北京网站建设的关键词十大舆情网站
  • 铭做网站建设公司网络组建方案
  • 网站内容管理平台线上销售平台如何推广
  • 上海网站制作团队淘宝seo关键词的获取方法有哪些
  • 网站建设 公司 常见问题搜索引擎优化入门
  • 河南住房和城乡建设委员会网站新媒体运营培训班
  • 百度网站关键词和网址北京seo邢云涛
  • 唐山网站制作专业友情链接检测
  • 企业网站程序源码百度推广需要多少钱
  • 龙岩网络三剑客seo的工具有哪些
  • 贵阳专业做网站公司新软件推广平台
  • 90设计网站可以商用吗找客户资源的软件哪个最靠谱
  • 学习建网站玩网站建设学习刷粉网站推广免费
  • 域名解析到网站沈阳关键词优化价格
  • wordpress教程全集(入门到精通)上海seo网络优化
  • 网站建设与维护内容全网推广外包公司
  • 做网站将文字放在图片上公司官网制作开发
  • 母婴类网站怎么建设流量宝
  • wordpress 写 wiki东莞百度seo电话
  • java做教程网站贵阳网站建设
  • 网站开发价格评估怎么做推广比较成功
  • 网站开发建设与维护网站推广要点
  • 网站焦点图制作教程违禁网站用什么浏览器
  • 爱站网是什么意思最好用的搜索引擎