【问题标题】:Matching plural words in Treetop匹配Treetop中的复数词
【发布时间】:2012-09-21 13:57:52
【问题描述】:

有没有办法使用 Treetop 以编程方式匹配复数单词。 Linguistics gem 会将一个单词复数,但如何将它插入到解析器中。

这是我正在尝试做的一个示例:

#!/usr/bin/env ruby
require 'treetop'
require 'linguistics'
include Linguistics::EN
Treetop.load_from_string DATA.read

parser = RecipeParser.new

p parser.parse('cans')

__END__
grammar Recipe
   rule units
      unit &{|s| plural(s[0].text_value) }  
   end
   rule unit
      'can'
   end
end

【问题讨论】:

  • 看看你的完整语法以及你用它做什么会很有帮助。另外:你绝对必须使用 Treetop 吗?像正则表达式这样简单的东西能否实现您的目标?

标签: ruby parsing nlp treetop peg


【解决方案1】:

一般来说,语言学 gem 不能将任意 Treetop 规则定义复数——它们不是字符串。

使用语义谓词,您的 recipe.treetop 文件可以在数组中定义所有有效的单数 unit 字符串,将它们复数,然后创建一个规则,将相关标记与每个复数单元进行比较:

require "linguistics"

grammar Recipe
  rule units
    [a-zA-Z\-]+ &{ |u|
      Linguistics.use(:en)
      singular_units = [ "can" ]

      singular_units.
        map(&:en).
        map(&:plural).
        include?(u[0].text_value)
    }
  end
end

【讨论】:

  • 这正是我想要的。我打算看看我是否可以先解析这个词,然后检查它的结尾,但我想这对于像 (goose and geese) 这样的不规则复数词没有意义。唯一的事情是,我可能想记住singular_units,因为它每次命中该节点时都会被使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2016-02-17
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多