Python の Newspaper3k ライブラリ

2018年12月10日 月曜日

「Python の Newspaper3k ライブラリ」のイメージ

IIJ 2018 TECHアドベントカレンダー 12/10(月)の記事です】

こんにちは。ももいです。

先日、共著で書いたblog記事「素人がトピックモデルを試してみた(第1回)」で紹介したようなこともやっていたのですが、今回はその周辺調査をしている時に見つけた便利なライブラリを紹介します。

“男木島の神社にいた猫(写真と本文は関係ありません)”

Newspaper3kは、Webにある記事をスクレイピングするためのライブラリです。 HTMLなどの知識がなくても簡単に使えるように作られています。 英語などでは自然言語処理のライブラリ(nltk)を呼ぶこともできるようになっており、「とにかく適当なパラメーターで処理してみて、まずは結果を見たい(細かい調整はできないけど)」というようなライトユーザの利便性を優先したパッケージングがされています。

Newspaper3kは、下記のとおり数多くの言語に対応しています。

見つけて使い始めたころは日本語に対応していなかったので、実装してpull requestでも送ろうかな… などと考えていたのですが、今年の8月に日本語対応がcommitされました。 今年に入ってからだけでも10以上の言語が追加されています。

使い方

インストールに関しては、ドキュメントのインストールに関する節(Get it now)を参照してください。 使用しているライブラリとPython3本体をインストールする、ごく標準的な手順です。

インストールできたらさっそく使ってみましょう。

記事のスクレイピングは下記のような感じでできます。

このサンプルではタイトルと本文を参照していますが、他にも著者などの情報を取得できることがあります。 また、先に書いたとおり、英語など一部の言語では自然言語処理メソッドを呼んで結果を得ることができます。 対応していない言語では単に空の結果が返ってきます。

試しにWikiNewsの記事“NASA’s InSight Lander makes it to Mars”をスクレイピングしてみましょう。

タイトルや本文はうまく取得できているようです。 一方で、記事の日付は取得できませんでした。 本文の一部だと判定されているようですね。

“男木島にいた美人の三毛ちゃん(写真と本文は関係ありません)”

本文の判別方法

このライブラリを見つけてテストしている間に、楽に、そこそこの精度で使えそうだという感触を得られたので、日本語対応してみようと思い立ち実装を調べました。 前述したとおり、日本語対応が本家にcommitされるほうが早かったので、自分で実装することはありませんでしたけど…

ドキュメントの“Adding new languages”とソースコードを読んでみたら、新しい言語の追加方法は予想以上に簡単でした。

  • その言語のストップワードリストを登録する
  • 単語がスペースで区切られない言語の場合は、分かち書きに相当するものを実装する
    • 日本語の分かち書きはTinySegmenterが使われています

HTMLのあるブロックが含んでいるテキストに対して、分かち書きに相当することをした後にストップワードの数を数えてスコア付けをすることで、全言語共通の手法で本文抽出を実現しています。 これがどのくらい一般的なのかはわからないのですが、シンプルでわかりやすい方法だと思いました。

終わりに

手軽に使えるスクレイピングライブラリ、Newspaper3kを紹介しました。 その分野に疎くても簡単に使えるようにまとめられたライブラリは、プロトタイピングなどに最適です。 ぜひ皆さんも試してみてください。

“筆者の腹と登ってこようとしている猫(写真と本文は関係ありません)”

ももいやすなり3

ももいやすなり

2018年12月10日 月曜日

セキュリティ本部セキュリティ情報統括室。IIJグループの緊急対応チームIIJ-SECTメンバーとして、FIRST、日本セキュリティオペレーション事業者協議会(ISOG-J)などの活動や運営に参加。ヘヴィメタルと猫をこよなく愛し、ローカルなグルメを堪能しながらマイナースポットを訪ね歩くのが最近の趣味。

Related
関連記事