読者です 読者をやめる 読者になる 読者になる

歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【R】weblioの住宅用語辞典をスクレイピングして住宅関連の単語のcsvを作る

自然言語処理をやっている人はよく辞書の整備が大変だと言います。

そんな話をしていたところ、「自分が詳しくない分野の言葉を知るときはweblio辞書が便利だよ」という知見を教えてもらいました。

www.weblio.jp

しかし、私は怠惰なプログラマーなので、スクレイピングでデータを取得しました。 試しに、建築・不動産の辞書スクレイピングで引っ張ってくることにしました。

PythonRubyスクレイピングするのは飽きたのでRでコードを書きました。 問題になった(工夫した)のは以下の点です。

  • 英字('a', 'b', 'c'...)、日本語('aa', 'ka', 'sa'...)、数字(0:9)、記号('sign')のURLがある
    • JavaScriptの即時実行式を真似たのはトリッキーすぎるかな…
  • 単語と読みが別々に表示されている
    • 例えば「アウトフレーム工法」「アウトフレームコウホウ」のリンクが2つある
    • リンク先が同じなので、リンク先のデータを取得した後に一意(dplyr::distinct)にする
  • サーバーに負荷をかけすぎないように、3秒ごとにsleepさせています
    • 本当は404の例外が来たときに例外をキャッチして、数秒sleepした後に再実行するようにしたかった
    • 書き捨てのコードなのでやってないです

コードはgistに公開しています。

returnの後にパイプ処理を重ねるのは先輩のコードの癖が移ったものです。お元気でしょうか…。

スクレイピングには、みんな大好きHadley Wickhamrvestライブラリを利用しました。PythonurllibBeautifulSoupRubyopen-uriNokogiri)の処理を一気にやってくれます。

xpath方式などでHTMlの要素を指定できるので、 RubyNokogiriに似た感覚で使うことができました。

github.com

また、高階関数を扱うライブラリpurrrmap_dfがめちゃめちゃ便利ですね。 Map関数(purrr::mapの)戻り値は通常listなのですが、それをデータフレームにしてくれます。

notchained.hatenablog.com

また、細かいところではRには定数(letters)でアルファベットの一覧のベクトルが使えることを初めて知りました。 詳しくはR-Tipsの記事へ。