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"]]を引き出したい、つまり、entityTypesがPROPER_NOUNである2つのトークンが行にある場合、これら2つのトークンから単語を抽出したいと思います。
私は次のようになりました:
"//token[entityType='PROPER_NOUN']/following-sibling::token[1][entityType='PROPER_NOUN']"
...これは2つの連続するPROPER_NOUNトークンの2番目を見つけるところまで到達しますが、最初のトークンを一緒に発行する方法がわかりません。
いくつかのメモ:
- 問題が単純化されれば、NodeSetの高レベルの処理(Ruby / Nokogiriなど)を実行してもかまいません。
- 3つ以上の連続したPROPER_NOUNトークン(A、B、Cと呼びます)がある場合、理想的には[A、B]、[B、C]を発行したいと思います。
アップデート
これが、高レベルのRuby関数を使用した私のソリューションです。しかし、私はXPathのいじめっ子が私の顔に砂を蹴るのにうんざりしていて、REAL 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