注目キーワード
  1. Photoshop
  2. Python
  3. Raspberry Pi
  4. Arduino

Python自然言語処理とnewspaper3kで記事分析をしてみる

  • 2020年9月12日
  • 2020年11月20日
  • Python

ここでは「Python」をコマンドプロンプト環境下で使用して、ニュース記事のスクレイピング方法を紹介していきます。

 

この記事を読むことで

各言語に対応したニュース記事内容の表示

自然言語処理を用いたキーワード分析

記事の要約の取得

などを学ぶことができます。

 

ニュース記事のキーワード分析や、記事内容の取得をプログラムで実際に操作してみたい方は是非挑戦してみましょう。

それでは始めていきますね。

Python の動作環境「cmd」について

この記事ではPython をコマンドプロンプト(cmd)にて動作させています。

 

python-scraping1

Windowsの方なら、画面左下の検索窓に「コマンドプロンプト」または「cmd」を入力することでコマンドプロンプトアプリが起動できます。

Pythonのインストールおよびコマンドプロンプトの細かな使い方については、割愛します。

 

したがって、パッケージ等はすべて「pip install」を使用します。

Python ファイルの実行はコマンドプロンプト内で

python ファイル名.py

とコマンド入力して実行させます。

コマンドプロンプトで結果を表示させるため、今回はprint文を多用している点もご理解いただけると幸いです。

 

newspaper3kを使った記事内容の取得

では早速本題のnewspaper3kを使えるようにしていきます。

 

まずはパッケージをインストールします。

pip install newspaper3k

とコマンドプロンプトに入力してインストールしましょう。

 

また、newspaper3k ver0.2.8の公式サイトより利用可能な言語とコード一覧が示されているので先に確認しておきます。

 

newspaper3k 公式説明サイトはこちら

 

newspaper3kで取得できる言語コード例

英語:en

 

中国語:zh

 

韓国語:ko

 

スペイン語:es

 

フランス語:fr

 

ロシア語:ru

 

日本語:ja

 

これらを参考にして各国の言語に対応してニュースサイトのテキストデータを取得していきます。

 

Python で日本のニュース記事内容を取得

まずはnewspaper3kとPython を用いて日本のニュース記事内容を取得していきます。

 

日本語の記事としてこちらのニュースを取得することにしました。

 

news-jp1

この記事のURLをコピペして「引数url」に渡します。

url = ‘サイトURL’

 

またこの記事は日本語なので、取得記事言語の情報を

language=’ja’

として指定し、下記のPythonコードを実行しました。

# ライブラリをインストール
from newspaper import Article

# 記事情報を取得
url = 'サイトURL' article = Article(url,language='jp')

# 記事をダウンロード
article.download()

# 記事の解析
article.parse()

# 記事のタイトルを取得
print(article.title)

#記事のURLを取得
print(article.url)

# 記事の著者情報を取得
print(article.authors)

# 記事の発行日を取得
print(article.publish_date)

# 記事の全文を取得
print(article.text)

# 記事の最初の写真のURLを取得
print(article.top_image)

 

このPython コードの実行結果は

newsresult-jp

となり、しっかりとタイトル、本文を取得できていることがわかります。

 

Python で英語のニュース記事内容を取得

続いて英語のニュース記事も取得していきましょう。

 

英語ののニュース記事として

 

news-en1

の記事内容を取得していきます。

 

上記のPythonコードのlanguage部分の記述を

article = Article(url,language=’en’)

としてPythonコードを実行します。

 

newsresult-en

実行すると、しっかりと英語のタイトル、本文を取得できていることがわかります。

 

言語の複数指定方法は…

これは僕が調べ、試行錯誤をしても解決しなかったことを学習ログとしてまとめておきます。

 

上記では単一言語に対して記事内容を取得していましたが、複数の言語をlanguageに指定すると記事内容を取得できませんでした。

試した記述は

article = Article(url,language=’jp’ or ‘en’)

という記述と

article = Article(url,language=’jp’ and ‘en’)

という記述。

 

文法エラーが出ず、実行ができる記事もありましたが、なぜか記事内容は取得できませんでした。

このあたり、ご存じの方がいたらご指導いただけると幸いです。(TwitterのDM等で)

 

自然言語処理を使ってキーワード等を解析する

続いて、自然言語処理を使ってキーワード・記事内容の要約の解析を行っていきます。

 

NLTKのパッケージをインストールする

Pythonでは言語の形態素解析としていくつかのパッケージが用意されています。

 

その中で今回は、「NLTK」という自然言語処理を使って英語の記事内キーワードと要約を取得していきます。

まずは

pip install nltk

としてNLTKパッケージをインストールします。

インストールが完了したら、実際にPython コード内でインポートしていきます。

 

Python にNLTKをインポート&使えるよう記述

NLTKをPythonで使うには

import nltk

nltk.download(‘punkt’)

のように自然言語処理で使うためのNLTKをインポート&ダウンロードする記述を追加します。

 

nltk.download(‘all’)

ですべてのNLTKをダウンロードする記述もありますが、時間と容量がすごくかかるので、僕は諦めました。

 

インポート&ダウンロードする記述を追加したら、キーワード・要約の分析を行うコードを追加します。

print(article.keywords)

print(article.summary)

 

これらを踏まえたPython のプログラムはこちらになります。

# ライブラリをインストール
from newspaper import Article

import nltk

nltk.download('punkt')

# 記事情報を取得
url = 'サイトのURL'article = Article(url,language='en')

# 記事をダウンロード
article.download()

# 記事の解析
article.parse()

# 自然言語処理の実行
article.nlp()

print('\n記事のタイトルを取得')
print(article.title)

print('\n記事のURLを取得')
print(article.url)

print('\n記事の著者情報を取得')
print(article.authors)

print('\n記事の発行日を取得')
print(article.publish_date)

"""
print('\n記事の全文を取得')
print(article.text)

print('\n記事の最初の写真のURLを取得')
print(article.top_image)
"""

print('\n記事のキーワードを取得')
print(article.keywords)

print('\n記事の要約')
print(article.summary)

※上記のPythonコードでは、記述内容の分量面から見て、英語記事の全文を取得する箇所はコメントアウトしています。

 

このPython コードを実行すると

news-nltk

となり、記事のキーワードおよび記事の要約が取得できていることがわかります。

 

Python で複数の記事を順に取得する

ここまでは一つの記事に対して、タイトル、URL、要約内容を取得してきましたが、for文を使えば複数の記事を取得することができます。

単にfor文で一定数ループさせるだけなので、こちらもアウトプットしておきます。

 

newspaper3kとfor文で複数記事を取得

まず、複数の記事を取得するサイトとしてロイター通信のページを解析することにします。

news-reuters-top

 

ロイター通信のURLを引数urlに渡し、最新の記事10個を記事番号をつけて解析します。

 

記事番号をつけるためには、引数に指定した数値などを文字列に変換する「str()関数」を使用します。

print(“\n記事”,str(i),”:”,article.title)

として、記事番号:記事タイトルと表示されるようにPythonコードを記述しました。

あとは

for article in ○○.articles:

としてfor文をループさせればOKですね。

 

Pythonプログラムの全文は

import newspaperurl = "https://jp.reuters.com/"

site = newspaper.build(url)
i = 1

for article in site.articles:
    article.download()
    article.parse()
    article.nlp()

    print("\n記事",str(i),":",article.title)
    print("\n記事",str(i),"のURL")
    print(article.url)
    print("\n記事",str(i),"の要約")
    print(article.summary)
    if i >= 10 :
        break
    i = i + 1

となります。

 

上記では記事タイトルを「1記事~10記事」分取得し、10記事取得し終えたら「break」でループから抜けるようにしました。

実行してみると

reuters-summary-10article

のようになり、記事タイトル、記事URL、記事の要約を記事番号とともに解析できていることがわかります。

 

これらをcsvファイルにまとめるも良し、キーワード解析をするのも面白そうだと思います。

 

今回は日本語、英語記事の内容取得および英語記事のキーワード、要約解析を行いましたが、まだまだ機能がたくさんあるので試してみたいと思いました。

 

参考にした記事

Qiita:Newspaper3kパッケージのarticleモジュール

 

Qiita:NLTKの使い方をいろいろ調べてみた

 

 

また当サイトやnoteでは

IBM Watsonを使ったPythonによる「画像分析」

[Graspy:AI初心者向け講座感想]IBM Watsonを使った画像分析・Python

 

seleniumを使ったInstagramの自動いいね&フォロー

も紹介しているので、是非ご覧くださいね。

お疲れ様でした。

newspaper3k-nltk-top
学びに関する情報をチェック!