英文歌词分词策略总结 (基于 tokenizeEnglishLyricLine 函数的逻辑)
你的英文歌词分词策略是一个多阶段、以自定义短语优先的混合方法,结合了词形规范化、高效的多模式匹配算法(Aho-Corasick)以及 compromise 库的自然语言处理能力。其核心目标是将歌词行切分成有意义的语言单元(短语、单词、缩写等),并为后续的语言学习功能提供丰富的信息。
大致切分策略如下:
-
预处理与词项化 (Preprocessing and Term Extraction):
- 首先,使用
compromise库对输入的原始英文歌词行进行初步的词法分析,将其分解为一系列基础的词项(Term对象)。这个过程会保留每个词项的原始文本、前后缀(空格和标点)以及由compromise分析得到的词性等信息。
- 首先,使用
-
候选序列生成与规范化 (Candidate Generation and Normalization):
- 基于上一步得到的原始
Term对象列表,生成一个用于短语匹配的“候选匹配词序列”。在这个过程中,对每个原始Term进行规范化处理:- 缩写词:会尝试(有时需要结合上下文)将其展开为组成部分(例如 “I’m” → “i”, “am”)。
- 动词:将其转换为词元/不定式(例如 “singing” → “sing”, “is” → “be”)。
- 名词:将其转换为单数形式(例如 “cats” → “cat”)。
- 其他词类:通常保留其
normal形式。
- 这个规范化步骤的目的是消除词形变化,以便能更稳定地与标准化的短语数据库进行匹配。每个规范化后的候选词都保留了对其原始
Term对象位置的引用。
- 基于上一步得到的原始
-
自定义短语优先匹配 (Custom Phrase Prioritization using Aho-Corasick):
- 将你的自定义短语数据库(包含8000+条目,这些条目也应是规范化的词元序列)加载进来。
- 使用高效的 Aho-Corasick 算法,在第二步生成的“候选匹配词序列”中查找所有与数据库短语匹配的片段。
- 重叠解决:在找到所有可能的短语匹配后,应用一个“最长匹配优先”的策略来解决重叠问题。即,如果多个短语匹配了歌词的同一部分或重叠部分,则优先选择覆盖词元数量更多(即更长)的那个短语。这确保了例如 “be used to” 会优先于 “used to” 被选作一个整体。
-
构建短语Token (Phrase Token Construction):
- 对于上一步筛选出的、无重叠的、最优的短语匹配结果:
- 根据它们在“候选匹配词序列”中的起止位置,追溯到这些匹配覆盖了哪些原始的
Term对象。 - 将这些被覆盖的连续原始
Term对象组合起来,形成一个代表短语的LyricEnglishToken。 - 这个短语
Token的text属性是它在原始歌词中的确切文本片段(包含原始的空格和大小写),同时记录其精确的字符起止位置 (startChar,endChar) 和前后缀 (pre,post)。 - 其
type属性被设置为一个EnglishPhrase对象,其中包含了匹配到的标准短语字符串、该标准短语分解后的词元等信息(后续可以从数据库填充翻译等)。 - 标记这些原始
Term对象已被短语覆盖。
- 根据它们在“候选匹配词序列”中的起止位置,追溯到这些匹配覆盖了哪些原始的
- 对于上一步筛选出的、无重叠的、最优的短语匹配结果:
-
处理剩余的单个词项 (Individual Term Processing):
- 遍历所有原始
Term对象。对于那些未被任何自定义短语覆盖的Term:- 将其转换为一个
LyricEnglishToken。 - 类型判断:
- 缩写词:如果该
Term是一个缩写词(例如通过检查是否包含撇号'或使用compromise的判断),则其type设为一个EnglishAbbreviation对象,并尝试获取其展开形式。 - 普通单词:如果不是缩写词,则认为它是一个普通单词。其
type设为一个EnglishWord对象。此时会获取该单词的词根/词元(使用你编写的getEnglishRootWord函数),并准备好(或实际进行)后续的词典查询来填充详细信息。 - 其他:如果是标点符号等,
type可能会被设为一个表示其词性的字符串。
- 缩写词:如果该
- 同样,这个单个词项
Token也记录其在原始歌词中的精确文本、字符起止位置和前后缀。
- 将其转换为一个
- 遍历所有原始
-
最终排序与输出 (Final Sorting and Output):
- 将所有生成的
LyricEnglishToken(包括短语 Token 和单个词项 Token)收集到一个列表中。 - 根据每个
Token在原始歌词行中的起始字符位置 (startChar) 进行升序排序,如果起始位置相同,则按结束字符位置 (endChar) 排序。这确保了最终输出的Token序列严格按照它们在歌词中的出现顺序排列。 - 返回这个排序后的
LyricEnglishToken数组。
- 将所有生成的
总结来说,你的分词策略是一个精心设计的多层流程:
- 以
compromise为基础进行底层的词法分析和词形规范化。 - 以自定义短语库为核心,通过 Aho-Corasick 和最长匹配优先策略,确保了你定义的短语能够被准确、优先地识别为整体单元。
- 对剩余部分进行细致处理,区分缩写词和普通单词,并为它们准备好承载详细语言学信息的结构。
- 全程保留与原始文本的精确映射,包括字符偏移、原始文本片段、前后缀等,这对于后续的交互(如点击歌词取词)和信息展示至关重要。
这个策略在保证对已知短语的识别精度的同时,也兼顾了对句子中其他部分的通用处理能力,非常棒!