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"]]