2

ドキュメントのテキストを抽出して、検索用にインデックスを作成しようとしています。以下は、さまざまな単語と句読点が一緒に実行されることを除いて、ほとんど機能します。タグを削除するときは、この問題が発生しないようにスペースに置き換える必要があります。私はこれを行うための最も効率的な方法を見つけようとしてきましたが、今のところ空っぽになっています。

doc = Nokogiri::HTML(html)
doc.xpath("//script").remove
doc.xpath("//style").remove
doc.xpath("//a").remove
text = doc.text.gsub(/\s+/,' ')

これが私がhttp://www.washingtontimes.com/blog/redskins-watch/2012/oct/18/redskins-linemen-respond-jason-pierre-paul-rg3-com/から抽出したサンプルテキストです。

シーズン前は、ニューヨーク・ジャイアンツのディフェンシブエンドであるオシ・ウメニーラが、何かをするまで「RG3」でロバート・グリフィン3世に電話しないと言って波を立てた。それまでは「ボブグリフィン」でした。ミネソタバイキングスに対するワシントンレッドスキンズの勝利でグリフィンが76ヤードのタッチダウンを行った後、ジャイアンツのディフェンシブエンドであるジェイソンピエールポールがグリフィンについてコメントしました。ピエールポールはニューヨークのメディアにこう語った。「反対の方向に進んでください。…「はい、それは非常に良い対戦になるでしょう。しかし、私の側ではありません。私の側ではありません。または反対側です。グリフィンは水曜日にオフィスに立候補することについて冗談めかして尋ねた。 、グリフィンはすべきではない」日曜日にオープンフィールドに入った場合、心配する必要はほとんどありません。「ロバートがそのような状況になった場合、彼を倒すことができる人はあまりいないと思います」と右衛兵のクリス・チェスターは語った。「私はまだそこに出かけて、ブロックして、誰もロバートに触れないようにします。しかし、彼はこのリーグで多くの人々を追い抜くことができる十分な優秀なアスリートです。」ピエールポールのコメントを促されて、左タックルのトレントウィリアムズは答えました。ピエールポールは知りません。なぜ彼がそのようなことを言うのか分かりません」と彼は言った。「たぶん彼は私が知らないことを知っているでしょう。」</p> 右衛兵のクリス・チェスターは言った。「私はまだそこに出かけて、ブロックして、誰もロバートに触れないようにします。しかし、彼はこのリーグで多くの人々を追い抜くことができる十分な優秀なアスリートです。」ピエールポールのコメントを促されて、左タックルのトレントウィリアムズは答えました。ピエールポールは知りません。なぜ彼がそのようなことを言うのか分かりません」と彼は言った。「たぶん彼は私が知らないことを知っているでしょう。」</p> 右衛兵のクリス・チェスターは言った。「私はまだそこに出かけて、ブロックして、誰もロバートに触れないようにします。しかし、彼はこのリーグで多くの人々を追い抜くことができる十分な優秀なアスリートです。」ピエールポールのコメントを促されて、左タックルのトレントウィリアムズは答えました。ピエールポールは知りません。なぜ彼がそのようなことを言うのか分かりません」と彼は言った。「たぶん彼は私が知らないことを知っているでしょう。」</p> 「それについて私に何を言ってほしいですか?」「ロバートは私の男です。ピエールポールは知りません。なぜ彼がそのようなことを言うのか分かりません」と彼は言った。「たぶん彼は私が知らないことを知っているでしょう。」</p> 「それについて私に何を言ってほしいですか?」「ロバートは私の男です。ピエールポールは知りません。なぜ彼がそのようなことを言うのか分かりません」と彼は言った。「たぶん彼は私が知らないことを知っているでしょう。」</p>

4

2 に答える 2

0

他の回答では、ドキュメントに空白を挿入することについて説明していますが、(質問で尋ねられるように)要件がそれらのノードを空白に置き換えることである場合、Nokogiriにはreplaceメソッドがあります。したがって、スクリプトタグをスペースに置き換えるには、次のようにします。

doc.xpath('//script').each do |node|
  node.replace(' ') 
end

質問は、「正しい」間隔についても尋ねます。ほとんどのブラウザは、<script>タグの周囲にレンダリングするときにスペースを挿入しないため、テキスト抽出には役立ちますが、これは必ずしも「正しい」ことではありません。

于 2014-10-09T11:20:44.603 に答える
-1

各pタグの前にスペースを挿入してみてください。

doc.search('p').each{|el| el.before ' '}

しかし、より良いアプローチはおそらく次のようなものです。

text = doc.search('div.story p').map{|p| p.text}.join(" ")
于 2012-10-20T02:04:26.623 に答える