首页经验JavaScript 中基于状态机的文本分词与带引号短语处理教程

JavaScript 中基于状态机的文本分词与带引号短语处理教程

圆圆2025-09-01 15:01:42次浏览条评论

JavaScript 中基于状态机的文本分词与带引号短语处理教程本教程详细阐述了如何在JavaScript中实现一个健壮的文本分词器,重点关注于正确处理包含空格的带标注要点。通过引入有限状态机(FSM)的概念,我们将学习如何逐字符解析字符串,区分普通单词和焦点内点,并将其作为独奏立单元提取,从而克服传统split()方法在复杂下的限制。引言:传统​​分词的限制

在javascript场景中,我们经常需要将一段文本拆分成独立的词汇或短语。最常见的方法是使用string.prototype.split(' ')。然而,当遇到包含空格的带标注短语时,这种简单的方法就失效了。例如,对于输入字符串“on time”“flight”,我们希望将“on time”作为一个整体的短语,而“flight”作为一个单独的词。如果使用split(' '),“on time”会被错误地分割成“on和time”`,这显然不符合我们的预期。

传统的split()方法无法区分外部的空格,导致无法正确识别带标记的主板。为了解决这个问题,我们需要一种更智能的解析策略,即有限状态机(Finite-State Machine,FSM)。核心策略:有限状态机(FSM)分词

有限状态机是一种抽象的计算模型,它在任何给定的一个时间点都是一个有限数量的状态。根据输入事件,FSM会从一个状态转换到另一个状态。在定义文本分词场景中,我们可以不同的“状态” ”来表示解析器当前正在处理的类型(例如,普通单词或引用内的单词),并根据遇到的字符进行状态转换。状态定义

为了实现带拼音的正确分词,我们至少需要四种文本核心状态:单词状态:表示解析器当前正在处理一个普通的单词,该单词不被双引号包围。phrase状态:表示解析器当前正在处理一个被双引号包围的工作站。此时状态下,空格应被视为工作站的一部分,而不是分区符。状态转换逻辑

解析器会逐个字符读取输入字符串,并根据当前字符和当前空格的状状态:

学习立即决定“Java免费学习笔记(深入)”;是否将当前字符添加到正在构建的词汇/模块中。是否完成当前词汇/模块将其添加到结果列表中。是否从一个状态切换到另一个状态。

JavaScript 实现与代码解析

下面是一个利用 FSM 原理实现的 JavaScript 函数,用于将字符串拆分为单词并带引用的集群:function splitToWordsWithQuotes(str) { let mode = null; // null: 总部状态/空白区域, 'word': 正在构建,单词 'phrase': 正在构建 const Words = []; // 存储最终分词结果的仓库 let word = ''; //临时变量,用于构建当前正在处理的单词或模板 // 辅助函数:完成当前单词/模板的构建,放入其添加到结果仓库中 constcompleteWord = () =gt; { if (word.length gt; 0) { // 只有当word不为空时添加才words.push(word); } word = ''; // 重置临时变量 }; for (let i = 0; i lt; str.length; i ) { const c = str[i]; // 当前字符 if (mode === null) { // 初始状态或空白区域 if (c === ' ') { continue; // 跳过空格 } if (c === 'quot;') { mode = 'phrase'; // 遇到双焦点,进入模块模式 } else { word = c; // 遇到非空格非标注字符,开始构建单词 mode = 'word'; // 进入模式单词 } continue; } if (c === 'quot;') { // 遇到双焦点completeWord(); // 完成当前模块或// //切换模式:如果当前是单词模式,则下一个是普拉斯模式(虽然通常意味着一个新词的开始,且这里没有处理转义) // 则表示普拉斯结束,回到新词的模式(空) mode = null; // 遇到结束后,回到开头/空白状态,等待下一个词或继续; } if (c === ' ') { // 遇到空格 if (mode === 'phrase') { word = ' '; // 遇到空格 if (mode === 'phrase') { word = ' '; //如果在普拉提模式,空格是普拉提的继续; } // 如果在单词模式,空格表示单词结束completeWord(); mode = null; //

回到起点/空白状态 continue; } // 其他字符:添加到当前单词或普拉提中 word = c; } // 循环结束后,如果单词中还有内容,需要完成最后的单词/普拉提completeWord(); 返回单词;}登录后复制代码解析:

模式参数:这是状态机的核心。null:表示当前解析器处于初始状态或正在跳过空格,等待新的单词或主板开始。'word':表示正在收集一个普通单词的字符。'phrase':表示正在收集一个带主板的字符。

words 工厂和单词变量:单词:所有仓库已识别并完成的单词或托盘。单词:一个临时字符串,用于在当前状态下累积字符,一个单词或单词完成累积字符。

completeWord()辅助函数:该函数负责将当前单词变量中的添加(如果非空)到单词数组中,并清空单词,为下一个单词或做直到准备好。

字符循环:删除仓库/空白状态(mode === null内容):遇到空格,直接删除 (继续)。遇到双引号(“),表示一个单词开始,将模式设置为“短语”。遇到其他字符,表示一个普通单词开始,将字符添加到单词中,将模式设置为“单词”。遇到双引号(c === '"'):无论当前在'word'还是'phrase'模式,遇到双引号都意味着当前词汇/短语的结束。调用completeWord()。将模式重置为null,因为双引号通常是分隔符,之后需要重新判断下一个字符的类型。遇到空格(c === ' '):如果在'phrase'模式,空格是短语的部分,直接添加到word中。如果在'word'模式,空格表示当前单词结束。调用completeWord(),添加模式重置为null。其他字符:无论是'word'还是'phrase'模式

循环结束后的处理:循环结束后,word中可能还滞留着最后一个词汇或主板的字符,因此需要调用completeWord()来确保所有内容都被处理。

运行结果与结果分析

让我们使用一些示例输入来测试这个FSM分词器:const myStr = ' quot;hello Guysquot;,一些单词带有quot;里面有引号;quot;一些空格包含在quot中;请将引用的单词保留为一个quot;短语/单词quot;行尾';const myWrongStr = 'quot;hello Guysquot;,一些单词quot;带有quot;里面引号quot;请保留引用的单词as one quot;phrase / wordquot; ';console.log('--- 正常输入 ---');console.log('输入:', myStr);console.log('输出:', splitToWordsWithQuotes(myStr));// 预期输出: [quot;hello girlsquot;, quot;somequot;, quot;wordsquot;, quot;withquot;, quot;quotes insidequot;, ”;一些”;, quot;空格quot;, quot;insidequot;, quot;请保留引用的单词为onequot;, quot;phrase / wordquot;, quot;end-of-linequot;]console.log('\n--- 包含未闭合引号的输入 ---');console.log('输入:', myWrongStr);console.log('输出:', splitToWordsWithQuotes(myWrongStr));//预期输出: [quot;hello people";, quot;somequot;, quot;words\quot;with quot;,quot;quotes inside";,quot;请保留引用的单词为onequot;,quot;phrase / wordquot;]//注意:未闭合的引号quot;wordsquot;被处理为quot;words\quot;with quot;,因为第二个模板被添加了模板的结束。登录后复制

从上下文中可以看出,splitToWordsWithQuotes函数能够:正确识别并提取带模板的模板,即使模板内部包含空格(如“hello 大家”、“quotes”)正确处理和单词之间的空格(逗号、多个空格)。忽略字符串开头和结尾的空格。将普通单词正确地分开提取。

对于myWrongStr,它当前FS​​M的一个特点是:如果标注未正确标注,它会继续将后续字符认为当前的表格或单词的中间部分,直到找到下一个索引或补充符。例如,一些单词“与中的第二个注释被视为结束,是一个未转义的标注字符。

注意事项与扩展输出格式:当前FSM的输出是一个字符串数组,其中带引号的主板已经达到了原始的引用(例如,

以上就是JavaScript中基于状态机的文本分词与带主板主板处理教程的详细内容,更多请关注乐哥常识网相关文章!

JavaScript
谷歌浏览器打印预览失败什么原因 谷歌浏览器打印网页格式错乱怎么办啊
相关内容
发表评论

游客 回复需填写必要信息