Ruby 使用相邻节点解析简单的类XML字符串

Ruby 使用相邻节点解析简单的类XML字符串,ruby,nokogiri,Ruby,Nokogiri,我正在使用engtagergem根据词性对句子进行分类。我得到的结果如下: puts text # => "<nnp>My</nnp> <nn>name</nn> <vbz>is</vbz> <nnp>Max</nnp>" 然而,我不确定如何使用Nokogiri(或另一个解析器库)实现这一点。以下是我尝试过的: (byebug) doc = Nokogiri::XML(text) #<N

我正在使用
engtager
gem根据词性对句子进行分类。我得到的结果如下:

puts text
# => "<nnp>My</nnp> <nn>name</nn> <vbz>is</vbz> <nnp>Max</nnp>"
然而,我不确定如何使用Nokogiri(或另一个解析器库)实现这一点。以下是我尝试过的:

(byebug) doc = Nokogiri::XML(text)
#<Nokogiri::XML::Document:0x3fd400286e78 name="document" children=[#<Nokogiri::XML::Element:0x3fd400286900 name="nnp" children=[#<Nokogiri::XML::Text:0x3fd400286464 "My">]>]>
(byebug) Nokogiri.parse(text)
#<Nokogiri::XML::Document:0x3fd40028cd50 name="document" children=[#<Nokogiri::XML::Element:0x3fd40028c7d8 name="nnp" children=[#<Nokogiri::XML::Text:0x3fd40028c378 "My">]>]>
(byebug)doc=Nokogiri::XML(文本)
#
(byebug)Nokogiri.parse(文本)
#
所以我尝试了两种不同的Nokogiri方法,但都只显示了第一个节点。我怎样才能得到其余的相邻节点呢


或者,如何获得
engtagger
调用以返回数组?在文档中,我没有找到如何返回包含所有标记的数组的示例,只返回包含一种特定标记的数组

主要问题是格式良好的XML应该有一个根节点。您之所以收到第一个节点,只是因为它被视为根节点(也就是说,最上面的节点),而当它关闭时,Nokogiri认为XML文档将结束

Nokogiri::XML("<root>#{text}</root>").
  children.first. # get root node
  children.map { |e| [e.text, e.name] }. # map to what’s needed
  reject { |e| e.last == 'text' } # filter out garbage
Nokogiri::XML(“#{text}”)。 儿童优先获取根节点 children.map{e|[e.text,e.name]}.#映射到所需的内容 拒绝{| e | e.last=='text'}过滤掉垃圾 这种过滤在语义上可能更正确:

Nokogiri::XML("<root>#{text}</root>").
  children.first.
  children.reject { |e| Nokogiri::XML::Text === e }.
  map { |e| [e.text, e.name] } 
Nokogiri::XML(“#{text}”)。 儿童优先。 children.reject{| e | Nokogiri::XML::Text==e}。 映射{e|[e.text,e.name]}
问题在于您对片段的分析不正确:

require 'nokogiri'
doc = Nokogiri::XML.fragment("<nnp>My</nnp> <nn>name</nn> <vbz>is</vbz> <nnp>Max</nnp>")
doc.to_xml # => "<nnp>My</nnp> <nn>name</nn> <vbz>is</vbz> <nnp>Max</nnp>"

啊,顺便说一句,我找到了解析一个句子并以数组形式返回所有词类的方法。用它来代替Entagger这是干什么的
children.reject{| e | Nokogiri::XML::Text===e}
这是一个三重相等,也称大小写相等。在这里,它完全等同于
e.is_a?(Nokogiri::XML::Text)
。整个构造过滤掉不需要的空文本节点。
require 'nokogiri'
doc = Nokogiri::XML.fragment("<nnp>My</nnp> <nn>name</nn> <vbz>is</vbz> <nnp>Max</nnp>")
doc.to_xml # => "<nnp>My</nnp> <nn>name</nn> <vbz>is</vbz> <nnp>Max</nnp>"
doc.children.each_with_object([]){ |n, a| a << [n.text, n.name] unless n.text? } 
# => [["My", "nnp"], ["name", "nn"], ["is", "vbz"], ["Max", "nnp"]]