parsing - 构建一个具有大量标记的词法分析器

标签 parsing nlp lexer javacc lexicon

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

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

我首先以一种简单的方式进行了尝试,一个 token 只有 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 多个 token 的规则,这看起来不是一个更好的主意;

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

  3. 在这里我知道词法分析器是一个有限状态机,这就是为什么它不可能的原因,那么有没有办法使用其他词法分析器? ;

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

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

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

所以在这里,我可以找到使用 javacc 词法分析器处理数千个标记的方法。如果有人习惯了这一点并且有一个想法,那就太好了?

最佳

科朗坦

最佳答案

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

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

关于parsing - 构建一个具有大量标记的词法分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40636787/

相关文章:

scripting - 如何将 Cortana 命令连接到自定义脚本?

python - spacy 在 Windows 10 和 Python 3.5.3::Anaconda 自定义(64 位)上找不到模型 'en_core_web_sm'

regex - 多行 Flex 模式定义

parsing - Gnu Bison 移位/减少描述分层表达式的基于缩进的语法中的冲突

php - PHP解析/语法错误;以及如何解决它们

java - 如何获取A时间和B时间之间的差距?

java - 将 PoJo 的 JSON String 属性解析为对象

python - 如何提取 WordNet 同义词集的偏移量以在 Python NLTK 中提供同义词集?

java - 采用 "not"但不采用 "not like"的词法分析器

Java:使用 split 方法添加时,字符串数组列表中出现额外的空格