エンジニア

なんくるないさ

「このブログはアフィリエイト広告を利用しています」

fastTextで文章を2つに分類する(文章2値分類)

今流行りのfastTextを用いて、新卒クラウドエンジニアが文章を分類した記事です。

普段は、AWS, Azure, Terraformやpythonを使っています。

東京オリンピックも終わって約3ヶ月、2021年コロナの年も終わりそうです。

(最近はオミクロン株がなんたら〜とか言ってますが)

そこで、今朝思い浮かんだ疑問はこちらです。

  • 2021年12月につぶやかれた”オリンピック”に関係するツイート」
  • 2010年12月につぶやかれた”オリンピック”に関係するツイート」

この二つは何か違いがあるか、判別できるかと言うことです。

早速やってみます。

データに関して

ツイスポでデータを指定して1000件ずつとってきました。

検索ワード:

オリンピック since:2009-11-7_15:30:00_JST until:2010-12-7_13:00:00_JST -filter:replies exclude:retweets

olympic_tweet.csvとして保存します。

label1を2021年、label0を2010年のツイートしています

(広告のツイートが入ってるのは目をつぶる)

https://docs.google.com/spreadsheets/d/1Qq6d3kHAW5EDArLimBsTmQ1i--VpkfYZDE6IQQ-3u6Y/edit?usp=sharing

コード

以下に推論したときに使ったコードをまとめています。

import pandas as pd
import csv 
from sklearn.model_selection import train_test_split
import csv
import fasttext

## trainとtestデータ作成
with open("olympic_tweet.csv", "r", errors="", newline="" ) as f:
    lst = csv.reader(f, delimiter=",")
    df = pd.DataFrame(lst)
df=df[1:].set_axis(['label', 'date', 'text'], axis=1)
train, test = train_test_split(df, test_size=0.2, random_state=0)

# 以下は異常データがあって取得できなかった
# news_corpora = pd.read_csv('olympic_tweet.csv',quoting=csv.QUOTE_NONE)

## 少し加工して、fastTextで学習と評価できる形式に変更
train=train.replace('"', ' ')
train=train.replace('"', ' ')
fast_train_df=("__label__"+train['label'] +" "+ train['text'])
fast_train_df.to_csv("fast_train.txt",index=False,header=False)

test=test.replace('"', ' ')
test=test.replace('"', ' ')
fast_test_df=("__label__"+test['label'] +" "+ test['text'])
fast_test_df.to_csv("fast_test.txt",index=False,header=False)


## 学習
model = fasttext.train_supervised(input="fast_train.txt",lr=0.5, epoch=500, minn=3, maxn=5, wordNgrams=3, loss='ova', dim=300, bucket=200000)
model.save_model("tweet_olympic_model.bin")

## 評価
print("ValidData:", model.test('fast_test.txt')) # ValidData: (405, 0.8864197530864197, 0.8864197530864197)

## 推論
ret = model.predict("今まで頑張って練習した。東京オリンピック頑張る")
print(ret) # (('__label__1',), array([0.99930036]))
ret1 = model.predict("冬のバンクーバで結果出す")
print(ret1) # (('__label__0',), array([0.92631376]))

こうやってみると結構精度良いかも?

testデータの正答率88%??

そして推論時も、

である。

ここら辺はこうなって欲しかったのでよかった。

また、以下に示すように2010年のテキストをぶっ込んでみた

(2010年のツイートなのでラベル0が望ましい。)

for date, text in zip(text_2010_df['date'], text_2010_df['text']):
    results=model.predict(text)
    print(date, text)
    print(results[0],"の確率: ",round(results[1][0]*100),"%")
    print("-"*50)

↓残念ながら、結構ラベル1が出てきてますね。

2010/12/04 23:21 まさかのオリンピック金メダリストと飲み。
('__label__0',) の確率:  66 %
--------------------------------------------------
2010/12/04 23:46 今日はレスリング部飲み会でした。チャンピオンになった漆谷もオリンピックにいった笹本も今後の人生にエールをおくりたい!
('__label__1',) の確率:  59 %
--------------------------------------------------
2010/12/04 23:14 柔道見学いってきた。強くなりそうな子だと言われた。オリンピックに連れてってもらえるかもしれんな・・
('__label__0',) の確率:  52 %
--------------------------------------------------
2010/12/04 23:44 ライサイドな毎日。 Ly-side Diary: 気づいたらもうすぐファイナルですね。 :男子シングルもいいな~って思うのはあるんだけどオリ… http://bit.ly/fim1lS #followmeJP  #followdaibosyu
('__label__0',) の確率:  100 %
--------------------------------------------------
2010/12/04 23:24 シドニーの町には他のオーストラリアの町に比して東洋人の多さが目立つのは住みついたという人がいたけどオリンピック建設に大量の中国人が移住してきて
('__label__1',) の確率:  59 %
--------------------------------------------------
2010/12/04 23:19 「坂の上の雲」の広瀬中佐役の藤本さんは元オリンピック選手です http://bit.ly/hCM9Yb
('__label__0',) の確率:  100 %
--------------------------------------------------
2010/12/04 23:18 そういえば石原慎太郎様いまだに何の責任もとらずオリンピックを招致できなかったら責任とると豪語なさってましたが
('__label__0',) の確率:  85 %
--------------------------------------------------
2010/12/04 23:08 五輪野球復活目指しイベント 愛知古田氏ら魅力伝える(47NEWS) ⇒ http://bit.ly/hD8qlQ #olympic #gorin
('__label__0',) の確率:  100 %
--------------------------------------------------
2021/12/10 10:45 週3からのリモート案件探しはFindy Freelanceで。掲載案件の90%以上がリモート案件。
('__label__1',) の確率:  74 %
--------------------------------------------------
2010/12/04 23:25 そいえばアイコンの写真は東京オリンピックのメダルだぴょ☆ 五輪万歳☆
('__label__1',) の確率:  100 %
--------------------------------------------------
2010/12/04 23:20 一昨年良いイメージと自信をもってJ1に殴り込んだ。今年J2得点王のハーフナー・マイクは再来年のオリンピックに向けて香川と乾がJ2で旋風を巻き起こして
('__label__1',) の確率:  69 %
--------------------------------------------------
2010/12/04 23:38 野球の五輪復活訴えイベント(NHK) ⇒ http://bit.ly/hiVn5d #olympic #gorin
('__label__0',) の確率:  100 %
--------------------------------------------------
2010/12/04 23:37 直ちゃん…!入団した時からずっと見てたよ。クリーンでしっかりした守備をする大型DFとして期待して期待通りだったよ。1998年のオリンピックも見に行ったよ。カッコよかったよ。どうしてかなぁ。マリノスで終わらせてあげたかったな(泣)。http://bit.ly/ib1
('__label__0',) の確率:  100 %
--------------------------------------------------
2010/12/04 23:10 オリンピック総合コーチが教えるバドミントン上達法
('__label__1',) の確率:  85 %
--------------------------------------------------
2010/12/04 23:38 大菅中村が優勝…スピードスケート(スポーツ報知) ⇒ http://bit.ly/enR9L4 #olympic #gorin
('__label__0',) の確率:  100 %
--------------------------------------------------
2010/12/04 23:35 女子短距離選手の足の筋肉の動きとかすごいエロイしオリンピックがあればAVとかいらなごめんいるけどそれはそれで
('__label__1',) の確率:  89 %
--------------------------------------------------
2010/12/04 23:42 あれ?オリンピックなんてやったらすぐに75%超えるよね
('__label__1',) の確率:  70 %
--------------------------------------------------
2021/01/01 11:49 【内定するまで年収がわからないって面接練習…そしてむかえた本選考…晴れてようやく内定!!と思いきやおかしくない?】選考に向けてレジュメ作成転職後年収を知ってから転職活動をしませんか?
('__label__1',) の確率:  100 %
--------------------------------------------------
2010/12/04 23:54 そういえば前なんで東京の人ってあんなオッサン知事に選ぶん。そんなに慎太郎好きなん」て聞いたら「私らが好きなんじゃないよ!年寄りが好きなんだよ!」と憤慨されたのをふと思い出した。都内在住の友達(非オタ)に「オリンピック招致失敗とか石原銀行とか色々やらかしてんのに
('__label__0',) の確率:  62 %
--------------------------------------------------

まぁデータが悪いので仕方ないです。

今後はもっとデータ集めて実験しようと思います。

fin