【问题标题】:building a lexer with very many tokens构建一个有很多标记的词法分析器
【发布时间】:2016-11-16 16:05:48
【问题描述】:

我已经找了两个小时了,我真的不知道该怎么办。

我正在尝试构建一个分析器,它使用可以匹配数千个单词的词法分析器。这些是自然语言单词,这就是它们如此之多的原因。

我首先尝试了一种简单的方法,一个令牌只有 1000 个不同的匹配项:

    TOKEN :
{
    <VIRG: ",">
|   <COORD: "et">
|   <ADVERBE: "vraiment">
|   <DET: "la">
|   <ADJECTIF: "bonne">
|   <NOM: "pomme"
        |   "émails"
        |   "émaux"
        |   "APL"
        |   "APLs"
        |   "Acide"
        |   "Acides"
        |   "Inuk"

[...]

javac编译后返回代码太大。

那么,我如何在我的词法分析器中管理数千个标记?

  1. 我读到过,对每个单词使用 n 个标记比对 n 个单词使用一个标记更有效。但在这种情况下,我将有 1000 多个令牌的规则,这看起来不是一个更好的主意;

  2. 我可以修改令牌管理器,或者构建一个,所以它只匹配列表中的单词;

  3. 在这里我知道词法分析器是一个有限状态机,这就是为什么它不可能,所以无论如何要使用其他词法分析器吗? ;

  4. 我可以自动生成一个匹配每个单词的巨大正则表达式,但这不会让我在之后独立处理这些单词,而且我不确定编写一个 60 行正则表达式会是好主意;

  5. 也许有办法从文件中加载令牌,这个解决方案非常接近解决方案 2 和 3;

  6. 也许我应该使用另一种语言?我正在尝试从 XLE(可以处理超过 70 000 个令牌的词典)迁移到 java,这里有趣的是生成 java 文件!

就是这样,我可以找到使用 javacc 词法分析器处理数千个标记的方法。如果有人对此有所了解并有想法,那就太好了?

最好的

科伦丁

【问题讨论】:

  • 如果您使用 JavaCC 构建解析器,您可能希望使用自定义词法分析器(请参阅选项 USER_TOKEN_MANAGER),该词法分析器使用以下 @rici 提到的实现技术。如果你只想要一个词法分析器,JavaCC 可能不是最好的工具。

标签: parsing nlp lexer javacc lexicon


【解决方案1】:

我不知道 javacc 如何构建它的 DFA,但可以肯定的是,能够区分数千个单词的 DFA 会非常大。 (但绝不是不合理的大:我已经获得了灵活性,可以构建具有数十万个州的 DFA,而不会出现重大问题。)

对于具有大量固定词素的词典,通常的方法是使用 DFA 识别一个潜在的单词(例如,一系列字母字符),然后在字典中查找该单词以获取标记类型。这也更加灵活,因为您无需重新编译即可更新字典。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多