ヤフーニュースのタイトルからPythonでカテゴリ予測[スクレイピング編]

まがりかど

自然言語処理せっかく勉強したし機械学習も勉強したから一回自分でなんかつくってみたいなー
なに作ろう?

こんなふうに思っていたとき思いつきました。

ヤフーニュースのタイトルからカテゴリを分類できるかな?

ということで今回はヤフーニュースを自然言語処理でカテゴリ分けする者の作り方を解説していきたいと思います。

本当はヤフーニュースのカテゴリーは8個あるんですがちょっと面倒そうだなあと思ったので「経済」と「スポーツ」の二つに分類していきます。

でははじめましょー

 

全体の流れ

  1. ヤフーニュースから経済とスポーツのカテゴリそれぞれからWebスクレイピングでタイトルを取得する (わたしはそれぞれ230個くらいとってきました)   Selenium
  2. スクレイピングしてきたタイトルを形態素解析で単語に分けて無駄なやつは省いて名詞と形容詞だけにする   janome
  3. さらに半角全角、小文字大文字や数字を統一したり記号を消したりしてデータの前処理をする
  4. 辞書を作る   gensim
  5. コーパスを作る   gensim
  6. コーパスを特徴ベクトル化する
  7. 正解ラベルを作ってランダムフォレストで分類する   scikit-learn
  8. ハイパーパラメータを調整して精度を上げていく
  9. おわり

 

こうやってまとめてみるといっぱいありますね。

やっぱり自然言語処理とか機械学習って大変

まず1のスクレイピングをやっていきましょう

 

ヤフーニュースからタイトルをスクレイピング

本当はbeautifulsoupとかも使えるのかもしれませんがあまり使ったことないのでSeleniumを使っていきます

とりあえずコード

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
options = Options()
driver = webdriver.Chrome(executable_path='C:/Users/ka5ry_000/Downloads/chromedriver_win32_2/chromedriver.exe'
,options=options)
driver.get("https://news.yahoo.co.jp/categories/business")
texts=[]
for i in range(50):
    if (i+1)%6==0 and i!=0:#上から50記事までは6行ことに広告があるのでとばします
        time.sleep(3)#
        continue
    texts.append(driver.find_element_by_xpath("/html/body/div/main/div[1]/div/div/ul/li[%s]/a/div[2]/div[1]"%str(i+1)).text)#上から%sのところが1ずつ増えていたのでこうしてます
for i in range(50,100):#上から50個目からは広告がなくなるので普通に行きます
    if (i+1)%6==0:
        time.sleep(3)
    texts.append(driver.find_element_by_xpath("/html/body/div/main/div[1]/div/div/ul/li[%s]/a/div[2]/div[1]"%str(i+1)).text)#さっきと同じ
f = open('business.txt', 'a')#business.txtにtextsリストを保存します
for x in texts:
    f.write(str(x) + "\n")
f.close()

スクレイピングですね。

for i in range(50):
    if (i+1)%6==0 and i!=0:#上から50記事までは6行ことに広告があるのでとばします
        time.sleep(3)#
        continue
    texts.append(driver.find_element_by_xpath("/html/body/div/main/div[1]/div/div/ul/li[%s]/a/div[2]/div[1]"%str(i+1)).text)#上から%sのところが1ずつ増えていたのでこうしてます

まずここでは上から50個までの記事のタイトルを取得していきます。
ですが6個ごとに広告が入るのでそこはとばすようにしています。ついでに3秒待っておきます。
あとタイトルのxpathを見たときに%sのところが1ずつ上がっていたのでこう書いています。

50個目以降は広告が出てこなくなるので6個ずつはとばさずに普通に行きます。
ですが一応6個ずつ3秒待ちます。

f = open('business.txt', 'a')#business.txtにtextsリストを保存します
for x in texts:
    f.write(str(x) + "\n")
f.close()

ここでは取得してできたリストをbusiness.txtにいったん保存しておきます。

スポーツのほうも同じようにします

driver.get("https://news.yahoo.co.jp/categories/business")

ここのbusinessをsportsに変えてスポーツのカテゴリのサイトにアクセスします。

f = open('business.txt', 'a')

そしてここのbusiness.txtも一緒にごちゃ混ぜにならないようにsports.txtにして保存しましょう。

これを同じタイトルが重ならないように何回か繰り返して学習データを増やしましょう。
私は250個にしました。広告がちょくちょくあるので235個くらいですね。

 

あとですねここからがちょっと強引になってしまっていてあまり気に入らないんですけど、上から50個ごとに「もっと見る」ボタンをクリックしないと次にいけないんですね。
本来だったら

find_element_by_xpath("").click()

でやるべきなんでしょうけどなぜかできなくてエラーになってしまったので、ここは手作業で「もっと見る」を押していきます。6回ごとに3秒待ってるのもそのためでもあります

強引ですみません。何か方法があったらコメントなどで教えてください。

今回の記事ではここまでです。

次の記事では形態素解析で単語に分けて不要な部分を取り除いていて名詞と形容詞だけにしていきます。

道のりはまだまだ長いですがその分できたら嬉しいので頑張ってください

 

ありがとうございました

4件のコメント