ヤフーニュースのタイトルからPythonでカテゴリ予測[形態素解析編]

この記事は前回のヤフーニュースのタイトルからカテゴリ予測[スクレイピング編]の続きとなっているのでそれをまだ読んでいない方はそっちから先に読んでおいてください。

https://magarikado0.com/yahoo-news-scrape/

ということで前回はヤフーニュースのタイトルをスクレイピングしたのでつぎはそのタイトルを形態素解析して名詞と形容詞だけにしていきます。

名詞と形容詞だけにする理由は一応説明しておきます。

なぜ名詞と形容詞だけにするんですか?

文章には名詞や形容詞のほかにも助詞や助動詞がいっぱりあります。むしろ助詞や助動詞のほうが多いんじゃないかなと思います。

いっぱいあるので機械学習にも影響は出てきますが、助詞や助動詞自体に意味は特にありません。付属語ってやつですね。

なのでそうゆうやつは無視していこうということでここでは名詞と形容詞だけにしています。

さて名詞と形容詞だけにする理由が分かったところでコードを書いていきましょう。

プログラムを書きます

とりあえず最初に全部貼っておきます。

前回とは別のファイルにしておいてください

 

from janome.tokenizer import Tokenizer#形態素解析用のライブラリ
f=open("business.txt","r")#前の記事でbusiness.txtに経済のタイトルを保存しましたね
titles= []#このリストに保存しておいたリストを入れます
for title in f:#保存しておいた経済のリストをtitlesリストに入れていきます
    titles.append(title.rstrip("\n"))#改行コードはとばします
f.close()
f=open("sports.txt","r")#経済と同じようにします
for title in f:
    titles.append(title.rstrip("\n"))
f.close()
t=Tokenizer()
documents=[]#全部の名詞と形容詞だけになった文章を入れるリスト
for i in range(len(titles)):
    tokens=t.tokenize(titles[i])
    document="#名詞と形容詞だけになった文章を入れる変数
    for token in tokens:
        part_of_speech=token.part_of_speech.split(",")[0]#品詞を代入
        if part_of_speech=="名詞" or part_of_speech=="形容詞":
            document+=token.surface+" "#文章の変数に単語を空白を開けて代入
    documents.append(document)#文章をdocumentsリストに追加

f = open('titles.txt', 'w')#documentsリストを保存しておきます
for x in documents:
    f.write(str(x) + "\n")
f.close()

上から順番に解説していきます

 ファイルからリストを取得

f=open("business.txt","r")#前の記事でbusiness.txtに経済のタイトルを保存しましたね
titles= []#このリストに保存しておいたリストを入れます
for title in f:#保存しておいた経済のリストをtitlesリストに入れていきます
    titles.append(title.rstrip("\n"))#改行コードはとばします
f.close()

まずf=open()で前の記事で経済のタイトルを保存したファイルを開きます。
で、改行コードはとばしながらタイトルをtitlesリストに追加していきます。

名詞と形容詞だけにする

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

t=Tokenizer()
documents=[]#全部の名詞と形容詞だけになった文章を入れるリスト
for title in titles:
    tokens=t.tokenize(title)
    document=""#名詞と形容詞だけになった文章を入れる変数
    for token in tokens:
        part_of_speech=token.part_of_speech.split(",")[0]#品詞を代入
        if part_of_speech=="名詞" or part_of_speech=="形容詞":
            document+=token.surface+" "#単語を空白を開けて代入
    documents.append(document)#文章をdocumentsリストに追加

一行目でjanomeのTokenizerをインスタンス化します。

for文でtitlesリストのタイトルを一個ずつtokenizeで形態素解析をしてtokensにTokenオブジェクトのリストを代入します。

そしてさらにそのtokensの中でfor文を使います。

part_of_speech.split(“,”)[0]はそのTokenオブジェクトの品詞を返しています。

で、その品詞が名詞か形容詞だったらdocumentに空白を開けて代入します。

documentの例としては

銀行 融資 基準 新規 先 厳しく 既存 先 ない 理由

みたいな感じになっています。

そしてそのdocumentをdocumentsにいれます。

documentsは

['銀行 融資 基準 新規 先 厳しく 既存 先 ない 理由 ', '日本 ジェンダーフルイドブランド 宝庫 ', '美輪 明宏 芸術 利用 GQ JAPAN 連載 特集 希望 伝言 ', '来週 5 / 25 ~ 29 日経 平均 株価 予想 レンジ 2 万 ~ 2 万 800 円 米 中 対立 警戒 中 インデックス 売買 影響 づらい 中小 型 株 期待 ', ・・・・・・]

全部書くと量がやばいので省略していますが大体こんな感じになっていますということです。

documentsリストを保存

f = open('titles.txt', 'w')#documentsリストを保存しておきます
for x in documents:
    f.write(str(x) + "\n")
f.close()

最後に今回作成したdocumentsリストを前回と同じようにtitles.txtに保存しておきます。

とりあえずおわります

今回はjanomeというライブラリを使って前回スクレイピングしてきたタイトルを名詞と形容詞だけにしてきました。

便利ですね、蛇の目。

ですけどやっぱり機械学習とか自然言語処理ってデータの前処理が大変ですね。

次回もどんどんデータを前処理していくので頑張りましょう。

 

ありがとうございました