这是 XPath 专家的一个简单点!:)
文件结构:
<tokens>
<token>
<word>Newt</word><entityType>PROPER_NOUN</entityType>
</token>
<token>
<word>Gingrich</word><entityType>PROPER_NOUN</entityType>
</token>
<token>
<word>admires</word><entityType>VERB</entityType>
</token>
<token>
<word>Garry</word><entityType>PROPER_NOUN</entityType>
</token>
<token>
<word>Trudeau</word><entityType>PROPER_NOUN</entityType>
</token>
</tokens>
忽略文档的语义不可能性,我想拉出[["Newt", "Gingrich"], ["Garry", "Trudeau"]],即:当连续有两个token的entityTypes为PROPER_NOUN时,我想从这两个标记中提取单词。
我已经做到了:
"//token[entityType='PROPER_NOUN']/following-sibling::token[1][entityType='PROPER_NOUN']"
...它可以找到两个连续的 PROPER_NOUN 令牌中的第二个,但我不确定如何让它与它一起发出第一个令牌。
一些注意事项:
- 如果可以简化问题,我不介意对 NodeSet 进行更高级别的处理(例如,在 Ruby / Nokogiri 中)。
- 如果有三个或更多连续的 PROPER_NOUN 标记(称为 A、B、C),理想情况下我想发出 [A、B]、[B、C]。
更新
这是我使用高级 Ruby 函数的解决方案。但是我厌倦了所有那些在我脸上踢沙子的 XPath 恶霸,我想知道真正的 XPath 编码人员是如何做到的!
def extract(doc)
names = []
sentences = doc.xpath("//tokens")
sentences.each do |sentence|
tokens = sentence.xpath("token")
prev = nil
tokens.each do |token|
name = token.xpath("word").text if token.xpath("entityType").text == "PROPER_NOUN"
names << [prev, name] if (name && prev)
prev = name
end
end
names
end