Fake News? Fake Tweet?

# Fake News!

トランプ氏が大統領に就任して以降、様々なニュースに対しこのように言及し批判することが多いですよね。

Twitterでも活動的で中にはアグレッシブな投稿も。

このようにメディアに対しFakeと攻撃的な言動を取っている一方、当の本人のツイートの信憑性がどれくらいあるかもまた疑問であることも事実。

そこで今回は機械学習の技術を用いてトランプ氏のツイートがTrueかFakeかを検証していきます。

# 今回行うこと
Kaggleというサイトにアクセスし、[Fake and real news dataset Classifying the news](https://www.kaggle.com/clmentbisaillon/fake-and-real-news-dataset)というページからニュースのデータセットを使ってトランプ氏が就任して以降のニュースの真偽を判定するモデルを作成します。

次に、[Trump Tweets Tweets from @realdonaldtrump](https://www.kaggle.com/austinreese/trump-tweets?select=realdonaldtrump.csv)にあるデータから大統領就任以降のツイートを抽出、TrueとFakeがどれくらいの比率で判定されたかを図にします。

# 【重要】記事の内容につき注意事項

今回「トランプ氏のツイート」という切り口から機械学習に取り組みましたが

政治的な意図など全くなく機械学習のアウトプットで今回トランプ氏のツイートを切り口にしているだけであり、これからお伝えする検証結果もFakeでブーメランとなる可能性が十分にあるということをご承知の上お読みいだだけますようお願い致します。

TrueかFakeはあくまで計算上の結果なので本当はどうなのかを保証するものでは全くないですし、特定の立場の方を指示したり批判したりするために記事を書いたわけではありませんのでご注意いただきますようお願い致します。

# Step1:ニュースのデータをモデル作成用に前処理

最初のステップとして[Fake and real news dataset Classifying the news](https://www.kaggle.com/clmentbisaillon/fake-and-real-news-dataset)にあるデータセットを前処理にモデル作成できる形に整えていきます。

```python
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import datetime as dt

import warnings
warnings.filterwarnings('ignore')

from sklearn.preprocessing import LabelEncoder
```

次に該当するページのcavファイルを読み込んでいきます。

```python
fake = pd.read_csv("Fake.csv")
true = pd.read_csv("True.csv")
```
該当するページでは正しいものとそうでないものをFakeとTrueの２つのファイルに分けられています。

コラムと型を見ていきましょう。

```python
fake.columns
Index(['title', 'text', 'subject', 'date'], dtype='object')

fake.dtypes
title      object
text       object
subject    object
date       object
dtype: object

true.columns
Index(['title', 'text', 'subject', 'date'], dtype='object')

true.dtypes
title      object
text       object
subject    object
date       object
dtype: object
```

どちらのファイルにもTrueかFakeかを直接示すものがないことがわかります。

そこを明記した上で１つにまとめます。

```python
fake["Reality"] = 0
true["Reality"] = 1
#新たにRealityを作成。Fakeを0、Trueを1にする。

df = pd.concat([fake, true], axis=0)
df = df.reset_index(drop=True)

df.isnull().sum()
title      0
text       0
subject    0
date       0
Reality    0
dtype: int64

df.head()

#もともとあったどちらのファイルも欠損はありませんでした。分量が多くなりすぎるので省略していますが事前にしっかり確認しておくことが大切です。
```
	

 |title|text|subject|date|Reality|
|:-----------|------------:|:------------:|:------------:|:------------:|:------------:|
|0|Donald Trump Sends Out Embarrassing New Year’...|Donald Trump just couldn t wish all Americans ...|News|December 31, 2017|0
|1|Drunk Bragging Trump Staffer Started Russian ...|House Intelligence Committee Chairman Devin Nu...|News|December 31, 2017|0
|2|Sheriff David Clarke Becomes An Internet Joke...|On Friday, it was revealed that former Milwauk...|News|December 30, 2017|0
|3|Trump Is So Obsessed He Even Has Obama’s Name...|On Christmas day, Donald Trump announced that ...|News|December 29, 2017|0
|4|Pope Francis Just Called Out Donald Trump Dur...|Pope Francis used his annual Christmas Day mes...|News|December 25, 2017|0

```python
df.tail()
```
　|title|text|subject|date|Reality|
|:-----------|------------:|:------------:|:------------:|:------------:|:------------:|
|44893|'Fully committed' NATO backs new U.S. approach...|BRUSSELS (Reuters) - NATO allies on Tuesday we...|worldnews|August 22, 2017|1
|44894|LexisNexis withdrew two products from Chinese ...|LONDON (Reuters) - LexisNexis, a provider of l...|worldnews|August 22, 2017|1
|44895|Minsk cultural hub becomes haven from authorities|MINSK (Reuters) - In the shadow of disused Sov...|worldnews|August 22, 2017|1
|44896|Vatican upbeat on possibility of Pope Francis ...|MOSCOW (Reuters) - Vatican Secretary of State ...|worldnews|August 22, 2017|1
|44897|Indonesia to buy $1.14 billion worth of Russia...|JAKARTA (Reuters) - Indonesia will buy 11 Sukh...|worldnews|August 22, 2017|1

以上から同一ファイル内でTrueとFakeが両方あることを確認できました。

subjectというものがあるので見てみましょう。もしトランプ氏とまず関係ないものがあればそのニュースはカットします。

```python
df["subject"].unique()
array(['News', 'politics', 'Government News', 'left-news', 'US_News',
       'Middle-east', 'politicsNews', 'worldnews'], dtype=object)
#トランプ関係はどのジャンルでも関わる可能性が高いのでここでは考えないことにします。
```
次に日付を分離してみます。

```python
df = pd.concat([df['title'], df['text'], df['subject'],df["date"]\
                .str.extract('(?P<Month>.*) (?P<Day>.*), (?P<Year>.*)',expand=True),df["date"],df["Reality"]], axis=1)
df.head()
```
 |title|text|subject|Month|Day|Year|date|Reality|
|:-----------|------------:|:------------:|:------------:|:------------:|:------------:|------------:|------------:|------------:|
|0	|Donald Trump Sends Out Embarrassing New Year’...	|Donald Trump just couldn t wish all Americans ...	|News	|December	|31	|2017	|December 31, 2017	|0
|1	|Drunk Bragging Trump Staffer Started Russian ...	|House Intelligence Committee Chairman Devin Nu...	|News	|December	|31	|2017	|December 31, 2017	|0
|2	|Sheriff David Clarke Becomes An Internet Joke...	|On Friday, it was revealed that former Milwauk...	|News	|December	|30	|2017	|December 30, 2017	|0
|3	|Trump Is So Obsessed He Even Has Obama’s Name...	|On Christmas day, Donald Trump announced that ...	|News	|December	|29	|2017	|December 29, 2017	|0
|4	|Pope Francis Just Called Out Donald Trump Dur...	|Pope Francis used his annual Christmas Day mes...	|News	|December	|25	|2017	|December 25, 2017	|0

これで日付もうまく分離できたように見えましたが問題が。

```python
df.isnull().sum()
title       0
text        0
subject     0
Month      45
Day        45
Year       45
date        0
Reality     0
dtype: int64
```
ここでうまくいってない日があるようです。うまくいっている部分と切り分けて確認をしていきます。

```python
nonull = df.dropna()
nonull.isnull().sum()
title      0
text       0
subject    0
Month      0
Day        0
Year       0
date       0
Reality    0
dtype: int64
```
```python
null = df[df.isnull().any(axis=1)]
#ここでうまくいっていないもののみを確認。
null.head()
```
　|title	|text	|subject	|Month	|Day	|Year	|date	|Reality
|:-----------|------------:|:------------:|:------------:|:------------:|:------------:|------------:|------------:|------------:|
|9050	|Democrat Senator Warns Mueller Not To Release ...	|According to The Hill, Democrat Senator Bob Ca...	|politics	|NaN	|NaN	|NaN	|19-Feb-18	|0
|9051	|MSNBC ANCHOR Flabbergasted at What Texas Teach...	|If we protect every other government building ...	|politics	|NaN	|NaN	|NaN	|19-Feb-18	|0
|9052	|WATCH: SNOWFLAKES ASKED Communist Party Platfo...	|Ami Horowitz is fantastic! Check out this man ...	|politics	|NaN	|NaN	|NaN	|19-Feb-18	|0
|9053	|JUST IN: BADASS GENERAL JOHN KELLY Shoved Chin...	|Just one more reminder of why President Trump ...	|politics	|NaN	|NaN	|NaN	|18-Feb-18	|0
|9054	|DOJ’s JEFF SESSIONS Opens Investigation Into W...	|Thank goodnesss Jeff Sessions is moving on fin...	|politics	|NaN	|NaN	|NaN	|18-Feb-18	|0

```python
null = null.drop(["Month", "Day", "Year"], axis=1)
#ここで改めて年月日を作り直す
null = null.reset_index(drop=True)
null.head()
```
 |title	|text	|subject	|date	|Reality
|:-----------|------------:|:------------:|------------:|------------:|------------:|
|0	|Democrat Senator Warns Mueller Not To Release ...	|According to The Hill, Democrat Senator Bob Ca...	|politics	|19-Feb-18	|0
|1	|MSNBC ANCHOR Flabbergasted at What Texas Teach...	|If we protect every other government building ...	|politics	|19-Feb-18	|0
|2	|WATCH: SNOWFLAKES ASKED Communist Party Platfo...	|Ami Horowitz is fantastic! Check out this man ...	|politics	|19-Feb-18	|0
|3	|JUST IN: BADASS GENERAL JOHN KELLY Shoved Chin...	|Just one more reminder of why President Trump ...	|politics	|18-Feb-18	|0
|4	|DOJ’s JEFF SESSIONS Opens Investigation Into W...	|Thank goodnesss Jeff Sessions is moving on fin...	|politics	|18-Feb-18	|0

終わりの部分も見てみましょう。

```python
null.tail()
```
 |title	|text	|subject	|date	|Reality
|:-----------|------------:|:------------:|------------:|------------:|------------:|
|40	|https://fedup.wpengine.com/wp-content/uploads/...|	https://fedup.wpengine.com/wp-content/uploads/...|	Government News|	https://fedup.wpengine.com/wp-content/uploads/...	|0
|41	|https://fedup.wpengine.com/wp-content/uploads/...|	https://fedup.wpengine.com/wp-content/uploads/...|	Government News|	https://fedup.wpengine.com/wp-content/uploads/...	|0
|42	|Homepage	|[vc_row][vc_column width= 1/1 ][td_block_trend...|	left-news|	MSNBC HOST Rudely Assumes Steel Worker Would N...	|0
|43	|https://fedup.wpengine.com/wp-content/uploads/...|	https://fedup.wpengine.com/wp-content/uploads/...|	left-news|	https://fedup.wpengine.com/wp-content/uploads/...	|0
|44	|https://fedup.wpengine.com/wp-content/uploads/...|	https://fedup.wpengine.com/wp-content/uploads/...|	left-news|	https://fedup.wpengine.com/wp-content/uploads/...	|0

日付がURLになっているものまで出てきています。他の情報までURLとなっているのでそういったものは除外しましょう。

日付が〇〇-〇〇-〇〇と表記されているものが多いのでそこから手をつけていきます。

```python
null_dates = null["date"].str.extract('(?P<Day>.*)-(?P<Month>.*)-(?P<Year>.*)',expand=True)
null_dates.dtypes
Day      object
Month    object
Year     object
dtype: object

null_dates
#年月日を分離したがそれでもうまくいってないものを見ます。分量が多くなりすぎてしまうので該当しない部分は「省略」します。
```

　|Day	|Month	|Year	|
|:-----------|------------:|:------------:|------------:|
|省略　|省略　|省略　|省略
|35	|https://100percentfedup.com/served-roy-moore-v...	|commander	|soldier/
|36	|https://100percentfedup.com/video-hillary-aske...	|some	|pie/
|37	|https://100percentfedup.com/12-yr-old-black-co...	|from	|left/
|38	|NaN	|NaN	|NaN
|39	|NaN	|NaN	|NaN
|40	|NaN	|NaN	|NaN
|41	|NaN	|NaN	|NaN
|42	|NaN	|NaN	|NaN
|43	|NaN	|NaN	|NaN
|44	|NaN	|NaN	|NaN

該当箇所が最後の方だったので該当箇所を見ていきます。

```python
null["date"].tail(10)
35    https://100percentfedup.com/served-roy-moore-v...
36    https://100percentfedup.com/video-hillary-aske...
37    https://100percentfedup.com/12-yr-old-black-co...
38    https://fedup.wpengine.com/wp-content/uploads/...
39    https://fedup.wpengine.com/wp-content/uploads/...
40    https://fedup.wpengine.com/wp-content/uploads/...
41    https://fedup.wpengine.com/wp-content/uploads/...
42    MSNBC HOST Rudely Assumes Steel Worker Would N...
43    https://fedup.wpengine.com/wp-content/uploads/...
44    https://fedup.wpengine.com/wp-content/uploads/...
Name: date, dtype: object
```
最早日付自体が滅茶苦茶になっていることがわかります。

該当箇所を削除します。

```python
null = null[:-10]
null_dates = null_dates[:-10]
```
日付のおかしな部分は削除したものの日付を同じ形にし就任前のものを削除するという課題が残っています。

続けて取り組んでいきましょう。

```python
#月の表記
df["Month"].unique()
array(['December', 'November', 'October', 'September', 'August', 'July',
       'June', 'May', 'April', 'March', 'February', 'January', nan, 'Dec',
       'Nov', 'Oct', 'Sep', 'Aug', 'Jul', 'Jun', 'Apr', 'Mar', 'Feb',
       'Jan'], dtype=object)

null_dates["Month"].unique()
array(['Feb'], dtype=object)

null_dates["Month"] = "February"
#FebのみなのでFebruaryに合わせます。
```
```python
#年の表記
null_dates["Year"].unique()
array(['18'], dtype=object)

null_dates["Year"] = "2018"
#18のみなので2018に統一
```
```python
null_filled = pd.concat([null['title'], null['text'], null['subject'],\
                null_dates["Month"],null_dates["Day"], null_dates["Year"],null["date"],\
                null["Reality"]], axis=1)
#nullとnull_datesを整える
```
```python
table = pd.concat([nonull, null_filled], axis=0)
table = table.drop("date", axis=1)
#これで日付の形式を統一できた
```

```python
table = table.reset_index(drop=True)
#ここでインデックスを順序通りにする
```
```python
#subject
le = LabelEncoder()
encoded = le.fit_transform(table['subject'].values)
decoded = le.inverse_transform(encoded)
table['subject'] = encoded
#直接関係はないがsubjectを数字に変換しておく
```
```python
#月の統一
table["Month"].unique()
array(['December', 'November', 'October', 'September', 'August', 'July',
       'June', 'May', 'April', 'March', 'February', 'January', 'Dec',
       'Nov', 'Oct', 'Sep', 'Aug', 'Jul', 'Jun', 'Apr', 'Mar', 'Feb',
       'Jan'], dtype=object)

table["Month"] = table["Month"].map({'December':12, 'November':11, 'October':10, 'September':9, 'August':8, 'July':7,
       'June':6, 'May':5, 'April':4, 'March':3, 'February':2, 'January':1, 'Dec':12,
       'Nov':11, 'Oct':10, 'Sep':9, 'Aug':8, 'Jul':7, 'Jun':6, 'Apr':4, 'Mar':3, 'Feb':2,
       'Jan':1})
```
```python
#型変換
table.dtypes
#Day,Yearがobjectになってるので直す
title      object
text       object
subject     int64
Month       int64
Day        object
Year       object
Reality     int

table["Day"] = table["Day"].astype("int64")
table["Year"] = table["Year"].astype("int64")

table.dtypes
title      object
text       object
subject     int64
Month       int64
Day         int64
Year        int64
Reality     int64
dtype: object
```
```python
table.isnull().sum()
title      0
text       0
subject    0
Month      0
Day        0
Year       0
Reality    0
#これで欠損値の問題は解決
```
ここまで型変換や表記の統一などを続けて行ってきました。

最後にトランプ氏が就任した2017年1月20日以前のニュースはカットします。

そのためdatetimeを用います。

```python
dates = table[["Year", "Month", "Day"]]

dates = pd.to_datetime(dates)
dates.head()
0   2017-12-31
1   2017-12-31
2   2017-12-30
3   2017-12-29
4   2017-12-25
dtype: datetime64[ns]
```
```python
news = pd.concat([table, dates], axis=1)
news = news.rename(columns={0: 'dates'})
news = news[["text", "dates", "Reality"]]
news[news["dates"] > dt.datetime(2017,1,20)]
#大統領が就任する前はすべてカット
news = news.drop("dates", axis=1)
news.head()
#これで完成。
```
　|text	|Reality	|
|:-----------|------------:|:------------:|
|0	|Donald Trump just couldn t wish all Americans ...	|0
|1	|House Intelligence Committee Chairman Devin Nu...	|0
|2	|On Friday, it was revealed that former Milwauk...	|0
|3	|On Christmas day, Donald Trump announced that ...	|0
|4	|Pope Francis used his annual Christmas Day mes...	|0

これでトランプ氏就任以降のニュースとその真偽をまとめたものが完成しました。

最後にcsvファイルに保存し次のステップに進んでいきましょう。

```python
news.to_csv("news_for_learning.csv", index=False)
```
# Step2:トランプ氏のツイートのデータを判定用に前処理
次に[Trump Tweets Tweets from @realdonaldtrump](https://www.kaggle.com/austinreese/trump-tweets?select=realdonaldtrump.csv)から大統領就任以降のツイートを抽出していきます。

データを読み込み中身を見てみましょう。

```python
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import datetime as dt

import warnings
warnings.filterwarnings('ignore')

trump = pd.read_csv("trumptweets.csv")

trump.head()
```


　|id	|link	|content	|date	|retweets	|favorites	|mentions	|hashtags	|geo
|:-----------|------------:|:------------:|------------:|------------:|------------:|------------:|------------:|------------:|------------:|
|0	|1698308935	|https://twitter.com/realDonaldTrump/status/169...	|Be sure to tune in and watch Donald Trump on L...	|2009-05-04 20:54:25	|500	|868	|NaN	|NaN	|NaN
|1	|1701461182	|https://twitter.com/realDonaldTrump/status/170...	|Donald Trump will be appearing on The View tom...	|2009-05-05 03:00:10	|33	|273	|NaN	|NaN	|NaN
|2	|1737479987	|https://twitter.com/realDonaldTrump/status/173...	|Donald Trump reads Top Ten Financial Tips on L...	|2009-05-08 15:38:08	|12	|18	|NaN	|NaN	|NaN
|3	|1741160716	|https://twitter.com/realDonaldTrump/status/174...	|New Blog Post: Celebrity Apprentice Finale and...	|2009-05-08 22:40:15	|11	|24	|NaN	|NaN	|NaN
|4	|1773561338	|https://twitter.com/realDonaldTrump/status/177...	|"My persona will never be that of a wallflower...	|2009-05-12 16:07:28	|1399	|1965	|NaN	|NaN	|NaN

```python
trump.dtypes
id             int64
link          object
content       object
date          object
retweets       int64
favorites      int64
mentions      object
hashtags      object
geo          float64
dtype: object
```
様々な内容がありますがここではdate(日付)とcontent(内容)のみを使うことになります。

日付をdatetimeに直していきます。

```python
trump['Date'] = pd.to_datetime(trump['date'])
trump[trump["Date"] > dt.datetime(2017,1,20)]
```
これで大統領就任前のツイートはすべて消去しました。

content以外のデータは削除しTruthとPercentageという新しい項目を追加します。

モデルを作成し検証をする際、TruthにTrueかFakeかの結論、Percentageに計算結果の可能性を格納します。

```python
trump = trump[["content"]]
trump["Truth"] = "Unknown"
#これで内容はcontentとTruthのみに。真偽判定の結果はTrueとFakeの文字型で。
trump["Percentage"] = 0
#パーセンテージも追加しておく
trump = trump.reset_index(drop=True)
#ここでインデックスを順序通りにする
trump.head()
```
　|content	|Truth	|Percentage	
|:-----------|------------:|:------------:|------------:|
|0	|Be sure to tune in and watch Donald Trump on L...	|Unknown	|0
|1	|Donald Trump will be appearing on The View tom...	|Unknown	|0
|2	|Donald Trump reads Top Ten Financial Tips on L...	|Unknown	|0
|3	|New Blog Post: Celebrity Apprentice Finale and...	|Unknown	|0
|4	|"My persona will never be that of a wallflower...	|Unknown	|0

これで必要な情報だけに絞り込めたので新たなcsvファイルに保存します。

```python
trump.to_csv("trump_for_judging.csv", index=False)
```
次のステップでモデル作成に取り組んでいきます。

# Step3:ニュースのデータを基にモデル作成
必要なcsvファイルは一通り揃ったので今度はニュースの判定をするモデルを作っていきます。

ここでは単純ベイズ分類器を利用します。

```python
import numpy as np
import pandas as pd

from sklearn.model_selection import train_test_split

from nltk.classify import NaiveBayesClassifier
from nltk.classify.util import accuracy as nltk_accuracy

import pickle

news = pd.read_csv("news_for_learning.csv")
#Step1で作成したcsvファイル
```
今回はTrueとFakeそれぞれでリストを作成しそれぞれに該当する単語を辞書形式で格納していきます。

```python
Fake =[]
Fact = []

for text, reality in zip(news['text'], news['Reality']):
    line = text.split(" ")
    dic = {}
    if reality == 0:
        for word in line:
            dic[word] = True
        ireru = (dic, 0)
        Fake.append(ireru)
    else:
        for word in line:
            dic[word] = True
        ireru = (dic, 1)
        Fact.append(ireru)
```
これでそれぞれのリストに単語を格納できました。

例えばFake[0]と出力させるだけでも膨大な量の単語が出てくるのでここでは省略します。

それでは訓練データとテストデータを作成しへと繋げていきます。ここではデータの９割を訓練に利用します。

```python
threshold = 0.9
num_fake = int(threshold * len(Fake))
num_fact = int(threshold * len(Fact))

features_train = Fake[:num_fake] + Fact[:num_fact]
features_test = Fake[num_fake:] + Fact[num_fact:]

classifier = NaiveBayesClassifier.train(features_train)
print('Accuracy of the classifier:', nltk_accuracy(classifier, features_test))
Accuracy of the classifier: 0.9585746102449889
```
精度を見ると95%以上でかなり高いことがわかります。どういった単語がカギを握るのか見ていきましょう。

```python
N = 15
print('Top ' + str(N) + ' most informative words:')
for i, item in enumerate(classifier.most_informative_features()[:N]):
    print(str(i+1) + '. ' + item[0]) 

Top 15 most informative words:
1. (Reuters)
2. -
3. -
4. screenshot
5. Image:
6. MOSCOW
7. BERLIN
8. screengrab
9. Images
10. Editing
11. WASHINGTON
12. Kurdistan
13. corrects
14. racists
15. Image
```
このように見ると記号や地名、中にはracistといったものが重要となることがわかります。

最後にモデルを保存しましょう。

```python
filename = 'model_for_trump.sav'
pickle.dump(classifier, open(filename, 'wb'))
```
これで保存完了です。

Step2でこれまで記述してきたコードに続き以下のコードを実行しニュースをコピペすると真贋判定が出ます。

冒頭でも言及したようにあくまで計算上の結果であり本当にそうなのかという保証はできないのであくまで自己責任でお願いします。

```python
def extract_features(words):
    return dict([(word, True) for word in words])
    print(dict([(word, True) for word in words]))
#先程のリストと同じ形式で辞書を格納させる

#文章をその場で入力したものを見る
input_review = input()
print("Fact Check:")
#extract_features(input_review)
print("\nNews Text:",input_review)
features = extract_features(input_review.split())
print(features)
probabilities = classifier.prob_classify(features)
predicted_truth = probabilities.max()
if predicted_truth == 0:
    answer = "Fake News!!!"
else:
    answer = "True News!!!"
print("Predicted Answer:", answer)
print("Probability:", round(probabilities.prob(predicted_truth), 2))
```
# Step4:モデルを用いてツイートの真偽を検証
最後のステップではいよいよトランプ氏のツイートの検証をしていきます。

ファイルやライブラリの読み込みから始めていきましょう。

```python
import pandas as pd
import pickle

trump = pd.read_csv("trump_for_judging.csv")
#トランプのツイートをロードする
classifier = pickle.load(open('model_for_trump.sav', 'rb'))
# 保存したモデルをロードする

import matplotlib.pyplot as plt
import seaborn as sns
#最後に真偽の比率を確認する
```
次に真贋判定をする関数を作成します。これは前のステップの最後のコードに少し手を加えたものです。

```python
def FactCheck(event):   
    global answer
    global percentage
    line = event.split(" ")
    dic = {}
    for word in line:
        dic[word] = True
    probabilities = classifier.prob_classify(dic)    
    predicted_truth = probabilities.max()
    percentage = round(probabilities.prob(predicted_truth))
    if predicted_truth == 0:
        answer = "Fake"
    else:
        answer = "True"
    return answer
```

ここでは各ニュースに対する判定結果をTrueとFakeの二択とし、どれくらいの可能性でその判定が出ているかの数値も出力できるようにしています。

これから判定作業を行いそれぞれの結果を先程読み込んだcsvファイルに書き込んでいきます。

```python
for i, v in trump.iterrows():
    FactCheck(v["content"])
    trump.at[trump.index[i], 'Truth'] = answer
    trump.at[trump.index[i], 'Percentage'] = percentage

trump.head()
```
　|content	|Truth	|Percentage	
|:-----------|------------:|:------------:|------------:|
|0	|Be sure to tune in and watch Donald Trump on L...	|Fake	|1
|1	|Donald Trump will be appearing on The View tom...	|Fake	|1
|2	|Donald Trump reads Top Ten Financial Tips on L...	|Fake	|1
|3	|New Blog Post: Celebrity Apprentice Finale and...	|Fake	|1
|4	|"My persona will never be that of a wallflower...	|True	|1
これでツイートに対し判定結果と数値を出すことができました。

それでは真贋の比率をグラフにしてみましょう。

```python
f,ax=plt.subplots(1,2,figsize=(18,8))
trump['Truth'].value_counts().plot.pie(explode=[0,0.1],autopct='%1.1f%%',ax=ax[0],shadow=True)
ax[0].set_title('Truth')
ax[0].set_ylabel('')
sns.countplot('Truth',data=trump,ax=ax[1])
ax[1].set_title('Truth')
plt.show()

trump.describe()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618104/25b26c46-408c-157c-e09d-bf344bc02410.png)

　|Percentage	
|:-----------|------------:|
|count	|41122.0
|mean	|1.0
|std	|0.0
|min	|1.0
|25%	|1.0
|50%	|1.0
|75%	|1.0
|max	|1.0

Trueが13.6%。ツイートのうち約7回に6回がFakeという結果でした。

また、全ツイートのパーセンテージが1、つまり100%正しいという計算結果が出ていたようでした。

# 終わりに
今回Kaggleにあるニュースの真贋を明記したファイルを用いてモデルを作成しトランプ氏のツイートの真贋判定を行いました。

その結果同氏のツイートの約7回に6回がフェイクの可能性が高いという結果が出ました。

パーセンテージのところですべて1と出てしまうのはどうしてなのかが疑問点なので検証していくつもりです。

初めでも述べましたがこれはあくまで計算上の結果なのでこの検証結果が事実と合致するという保証はできません。

また、特定の政治的立場に立ち誰かを擁護したり批判する意図はないので改めてご理解いただけると幸いです。

長い記事になりましたが最後まで読んでくださりありがとうございました。