2

私の目的はlibrary(tm)、かなり大きな単語文書でツールキットを使用することです。ドキュメントという単語には適切なタイポグラフィがあるh1ため、メイン セクション、サブヘッダー、h2およびh3サブヘッダーに使用しています。各セクションを比較してテキスト マイニングしたい (各セクションの下のテキストh1- 小見出しはほとんど重要ではないため、含めたり除外したりできます。)

私の戦略は、worddocument を html にエクスポートしてから、パッケージを使用しrvestて段落を抽出することです。

library(rvest)
# the file has latin-1 chars
#Sys.setlocale(category="LC_ALL", locale="da_DK.UTF-8")
# small example html file
file <- rvest::html("https://83ae1009d5b31624828197160f04b932625a6af5.googledrive.com/host/0B9YtZi1ZH4VlaVVCTGlwV3ZqcWM/tidy.html", encoding = 'utf-8')

nodes <- file %>%
  rvest::html_nodes("h1>p") %>%
  rvest::html_text()

<p>ですべてを抽出できますがhtml_nodes("p")、それは 1 つの大きなスープにすぎません。それぞれを個別に分析する必要がありh1ます。

おそらく最良の方法は、見出しpごとにタグのベクトルを含むリストです。h1そして、おそらく何かのようなループがありますfor (i in 1:length(html_nodes(fil, "h1"))) (html_children(html_nodes(fil, "h1")[i]))(これは機能していません)。

内部から単語htmlを整理する方法がある場合のボーナスrvest

4

1 に答える 1

6

>が子コンビネータであることに注意してください。現在持っているセレクターは、の子であるp要素を探しますが、これは HTML では意味がないため、何も返しません。h1

生成されたマークアップを調べると、少なくとも提供したサンプル ドキュメントでは、すべてのh1要素 (および代わりにマークアップされた目次の見出しp) に関連付けられた親があることがわかります。 div:

<body lang="EN-US">
  <div class="WordSection1">
    <p class="MsoTocHeading"><span lang="DA" class='c1'>Indholdsfortegnelse</span></p>
    ...
  </div><span lang="DA" class='c5'><br clear="all" class='c4'></span>

  <div class="WordSection2">
    <h1><a name="_Toc285441761"><span lang="DA">Interview med Jakob skoleleder på
    a_skolen</span></a></h1>
    ...
  </div><span lang="DA" class='c5'><br clear="all" class='c4'></span>

  <div class="WordSection3">
    <h1><a name="_Toc285441762"><span lang="DA">Interviewet med Andreas skoleleder på
    b_skolen</span></a></h1>
    ...
  </div>
</body>

pで示される各セクションのすべての要素はh1、それぞれの親にありdivます。pこれを念頭に置いて、それぞれの兄弟である要素を選択するだけですh1。ただし、現在 rvest にはコンテキスト ノードから兄弟を選択する方法がないため (html_nodes()ノードのサブツリー、つまりその子孫の参照のみをサポートしています)、これを別の方法で行う必要があります。

HTML Tidy が内に直接h1ある a にある構造を作成すると仮定すると、次のセレクターを使用して、目次以外のすべてを取得できます。divbodydiv

sections <- html_nodes(file, "body > div ~ div")

サンプル ドキュメントでは、これによりdiv.WordSection2とが生成されdiv.WordSection3ます。目次は で表されdiv.WordSection1、それは選択から除外されます。

次に、各から段落を抽出しますdiv

for (section in sections) {
  paras <- html_nodes(section, "p")
  # Do stuff with paragraphs in each section...

  print(length(paras))
}
# [1] 9
# [1] 8

ご覧のとおり、は各 の要素length(paras)数に対応します。それらの中には、必要に応じて面倒な場合がある のみを含むものがあることに注意してください。これらの外れ値の扱いは、読者の演習として残しておきます。pdiv&nbsp;

残念ながら、rvest は独自の HTML Tidy 機能を提供していないため、ボーナス ポイントはありません。Word ドキュメントを個別に処理する必要があります。

于 2015-02-14T19:10:25.857 に答える