英文歌词分词策略总结 (基于 tokenizeEnglishLyricLine 函数的逻辑)

你的英文歌词分词策略是一个多阶段、以自定义短语优先的混合方法,结合了词形规范化、高效的多模式匹配算法(Aho-Corasick)以及 compromise 库的自然语言处理能力。其核心目标是将歌词行切分成有意义的语言单元(短语、单词、缩写等),并为后续的语言学习功能提供丰富的信息。

大致切分策略如下:

  1. 预处理与词项化 (Preprocessing and Term Extraction)

    • 首先,使用 compromise 库对输入的原始英文歌词行进行初步的词法分析,将其分解为一系列基础的词项(Term 对象)。这个过程会保留每个词项的原始文本、前后缀(空格和标点)以及由 compromise 分析得到的词性等信息。
  2. 候选序列生成与规范化 (Candidate Generation and Normalization)

    • 基于上一步得到的原始 Term 对象列表,生成一个用于短语匹配的“候选匹配词序列”。在这个过程中,对每个原始 Term 进行规范化处理:
      • 缩写词:会尝试(有时需要结合上下文)将其展开为组成部分(例如 “I’m” “i”, “am”)。
      • 动词:将其转换为词元/不定式(例如 “singing” “sing”, “is” “be”)。
      • 名词:将其转换为单数形式(例如 “cats” “cat”)。
      • 其他词类:通常保留其 normal 形式。
    • 这个规范化步骤的目的是消除词形变化,以便能更稳定地与标准化的短语数据库进行匹配。每个规范化后的候选词都保留了对其原始 Term 对象位置的引用。
  3. 自定义短语优先匹配 (Custom Phrase Prioritization using Aho-Corasick)

    • 将你的自定义短语数据库(包含8000+条目,这些条目也应是规范化的词元序列)加载进来。
    • 使用高效的 Aho-Corasick 算法,在第二步生成的“候选匹配词序列”中查找所有与数据库短语匹配的片段。
    • 重叠解决:在找到所有可能的短语匹配后,应用一个“最长匹配优先”的策略来解决重叠问题。即,如果多个短语匹配了歌词的同一部分或重叠部分,则优先选择覆盖词元数量更多(即更长)的那个短语。这确保了例如 “be used to” 会优先于 “used to” 被选作一个整体。
  4. 构建短语Token (Phrase Token Construction)

    • 对于上一步筛选出的、无重叠的、最优的短语匹配结果:
      • 根据它们在“候选匹配词序列”中的起止位置,追溯到这些匹配覆盖了哪些原始的 Term 对象。
      • 将这些被覆盖的连续原始 Term 对象组合起来,形成一个代表短语的 LyricEnglishToken
      • 这个短语 Tokentext 属性是它在原始歌词中的确切文本片段(包含原始的空格和大小写),同时记录其精确的字符起止位置 (startChar, endChar) 和前后缀 (pre, post)。
      • type 属性被设置为一个 EnglishPhrase 对象,其中包含了匹配到的标准短语字符串、该标准短语分解后的词元等信息(后续可以从数据库填充翻译等)。
      • 标记这些原始 Term 对象已被短语覆盖。
  5. 处理剩余的单个词项 (Individual Term Processing)

    • 遍历所有原始 Term 对象。对于那些未被任何自定义短语覆盖Term
      • 将其转换为一个 LyricEnglishToken
      • 类型判断
        • 缩写词:如果该 Term 是一个缩写词(例如通过检查是否包含撇号 ' 或使用 compromise 的判断),则其 type 设为一个 EnglishAbbreviation 对象,并尝试获取其展开形式。
        • 普通单词:如果不是缩写词,则认为它是一个普通单词。其 type 设为一个 EnglishWord 对象。此时会获取该单词的词根/词元(使用你编写的 getEnglishRootWord 函数),并准备好(或实际进行)后续的词典查询来填充详细信息。
        • 其他:如果是标点符号等,type 可能会被设为一个表示其词性的字符串。
      • 同样,这个单个词项 Token 也记录其在原始歌词中的精确文本、字符起止位置和前后缀。
  6. 最终排序与输出 (Final Sorting and Output)

    • 将所有生成的 LyricEnglishToken(包括短语 Token 和单个词项 Token)收集到一个列表中。
    • 根据每个 Token 在原始歌词行中的起始字符位置 (startChar) 进行升序排序,如果起始位置相同,则按结束字符位置 (endChar) 排序。这确保了最终输出的 Token 序列严格按照它们在歌词中的出现顺序排列。
    • 返回这个排序后的 LyricEnglishToken 数组。

总结来说,你的分词策略是一个精心设计的多层流程:

  • compromise 为基础进行底层的词法分析和词形规范化。
  • 以自定义短语库为核心,通过 Aho-Corasick 和最长匹配优先策略,确保了你定义的短语能够被准确、优先地识别为整体单元。
  • 对剩余部分进行细致处理,区分缩写词和普通单词,并为它们准备好承载详细语言学信息的结构。
  • 全程保留与原始文本的精确映射,包括字符偏移、原始文本片段、前后缀等,这对于后续的交互(如点击歌词取词)和信息展示至关重要。

这个策略在保证对已知短语的识别精度的同时,也兼顾了对句子中其他部分的通用处理能力,非常棒!