From 42ac5d8d813c2d486d18e0af3d0fccd5e2b3ebb7 Mon Sep 17 00:00:00 2001 From: Jonas Weinz Date: Wed, 9 May 2018 16:50:59 +0200 Subject: [PATCH] Jonas: first stuff for task 2 --- Jonas_Solutions/Task_02_JonasWeinz.ipynb | 316 ++++++++++++++++++++++- Jonas_Solutions/Task_2_gen_data.sh | 72 ++++++ Jonas_Solutions/Untitled.ipynb | 85 ++++++ 3 files changed, 470 insertions(+), 3 deletions(-) create mode 100755 Jonas_Solutions/Task_2_gen_data.sh create mode 100644 Jonas_Solutions/Untitled.ipynb diff --git a/Jonas_Solutions/Task_02_JonasWeinz.ipynb b/Jonas_Solutions/Task_02_JonasWeinz.ipynb index f5507ab..4caca7b 100644 --- a/Jonas_Solutions/Task_02_JonasWeinz.ipynb +++ b/Jonas_Solutions/Task_02_JonasWeinz.ipynb @@ -6,13 +6,25 @@ "source": [ "# NLP-LAB Exercise 01 by jonas weinz\n", "----\n", + "## links:\n", + "\n", + "* Article: https://miguelmalvarez.com/2017/03/23/how-can-machine-learning-and-ai-help-solving-the-fake-news-problem/\n", + " * corresponding code: https://github.com/kjam/random_hackery/blob/master/Attempting%20to%20detect%20fake%20news.ipynb\n", + "\n", + "* Tutorial on Datacamp: https://www.datacamp.com/community/tutorials/scikit-learn-fake-news\n", + "\n", + "* liar dataset paper: https://www.cs.ucsb.edu/~william/papers/acl2017.pdf\n", + " * dataset: https://www.cs.ucsb.edu/~william/data/liar_dataset.zip\n", + "\n", + "## Dependencies for this Notebook:\n", "* library [rdflib](https://github.com/RDFLib/rdflib)\n", + " * install: `pip3 install rdflib`\n", "* " ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -24,7 +36,287 @@ } ], "source": [ - "%pylab inline" + "%pylab ipympl" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import itertools\n", + "import sklearn.utils as sku\n", + "import os" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate/Download Datasets we are working on\n", + "\n", + "* running bash script to download all needed data and store it into the `data` subfolder" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================================================================\n", + "downloading and unpacking https://www.cs.ucsb.edu/~william/data/liar_dataset.zip if not already existing\n", + "================================================================================\n", + "UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.\n", + "\n", + "Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip/ ;\n", + "see ftp://ftp.info-zip.org/pub/infozip/UnZip.html for other sites.\n", + "\n", + "Compiled with gcc 6.3.0 20170415 for Unix (Linux ELF).\n", + "\n", + "UnZip special compilation options:\n", + " ACORN_FTYPE_NFS\n", + " COPYRIGHT_CLEAN (PKZIP 0.9x unreducing method not supported)\n", + " SET_DIR_ATTRIB\n", + " SYMLINKS (symbolic links supported, if RTL and file system permit)\n", + " TIMESTAMP\n", + " UNIXBACKUP\n", + " USE_EF_UT_TIME\n", + " USE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)\n", + " USE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)\n", + " UNICODE_SUPPORT [wide-chars, char coding: UTF-8] (handle UTF-8 paths)\n", + " LARGE_FILE_SUPPORT (large files over 2 GiB supported)\n", + " ZIP64_SUPPORT (archives using Zip64 for large files supported)\n", + " USE_BZIP2 (PKZIP 4.6+, using bzip2 lib version 1.0.6, 6-Sept-2010)\n", + " VMS_TEXT_CONV\n", + " WILD_STOP_AT_DIR\n", + " [decryption, version 2.11 of 05 Jan 2007]\n", + "\n", + "UnZip and ZipInfo environment options:\n", + " UNZIP: [none]\n", + " UNZIPOPT: [none]\n", + " ZIPINFO: [none]\n", + " ZIPINFOOPT: [none]\n", + "Archive: liar_dataset.zip\n", + " inflating: README \n", + " inflating: test.tsv \n", + " inflating: train.tsv \n", + " inflating: valid.tsv \n", + "================================================================================\n", + "successfully finished action: downloading and unpacking https://www.cs.ucsb.edu/~william/data/liar_dataset.zip if not already existing\n", + "================================================================================\n", + "================================================================================\n", + "downloading and unpacking https://raw.githubusercontent.com/GeorgeMcIntire/fake_real_news_dataset/master/fake_or_real_news.csv.zip if not already existing\n", + "================================================================================\n", + "Archive: fake_or_real_news.csv.zip\n", + " inflating: fake_or_real_news.csv \n", + " creating: __MACOSX/\n", + " inflating: __MACOSX/._fake_or_real_news.csv \n", + "================================================================================\n", + "successfully finished action: downloading and unpacking https://raw.githubusercontent.com/GeorgeMcIntire/fake_real_news_dataset/master/fake_or_real_news.csv.zip if not already existing\n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "100 989k 100 989k 0 0 366k 0 0:00:02 0:00:02 --:--:-- 366k\n", + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "100 11.3M 100 11.3M 0 0 2590k 0 0:00:04 0:00:04 --:--:-- 2751k\n" + ] + } + ], + "source": [ + "%%bash\n", + "./Task_2_gen_data.sh" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Read in fake news table" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "df_1 = pd.read_csv('data/fake_or_real_news.csv').set_index('Unnamed: 0')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* display first 10 entries" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(6335, 3)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titletextlabel
Unnamed: 0
8476You Can Smell Hillary’s FearDaniel Greenfield, a Shillman Journalism Fello...FAKE
10294Watch The Exact Moment Paul Ryan Committed Pol...Google Pinterest Digg Linkedin Reddit Stumbleu...FAKE
3608Kerry to go to Paris in gesture of sympathyU.S. Secretary of State John F. Kerry said Mon...REAL
10142Bernie supporters on Twitter erupt in anger ag...— Kaydee King (@KaydeeKing) November 9, 2016 T...FAKE
875The Battle of New York: Why This Primary MattersIt's primary day in New York and front-runners...REAL
6903Tehran, USA\\nI’m not an immigrant, but my grandparents ...FAKE
7341Girl Horrified At What She Watches Boyfriend D...Share This Baylee Luciani (left), Screenshot o...FAKE
95‘Britain’s Schindler’ Dies at 106A Czech stockbroker who saved more than 650 Je...REAL
4869Fact check: Trump and Clinton at the 'commande...Hillary Clinton and Donald Trump made some ina...REAL
2909Iran reportedly makes new push for uranium con...Iranian negotiators reportedly have made a las...REAL
\n", + "
" + ], + "text/plain": [ + " title \\\n", + "Unnamed: 0 \n", + "8476 You Can Smell Hillary’s Fear \n", + "10294 Watch The Exact Moment Paul Ryan Committed Pol... \n", + "3608 Kerry to go to Paris in gesture of sympathy \n", + "10142 Bernie supporters on Twitter erupt in anger ag... \n", + "875 The Battle of New York: Why This Primary Matters \n", + "6903 Tehran, USA \n", + "7341 Girl Horrified At What She Watches Boyfriend D... \n", + "95 ‘Britain’s Schindler’ Dies at 106 \n", + "4869 Fact check: Trump and Clinton at the 'commande... \n", + "2909 Iran reportedly makes new push for uranium con... \n", + "\n", + " text label \n", + "Unnamed: 0 \n", + "8476 Daniel Greenfield, a Shillman Journalism Fello... FAKE \n", + "10294 Google Pinterest Digg Linkedin Reddit Stumbleu... FAKE \n", + "3608 U.S. Secretary of State John F. Kerry said Mon... REAL \n", + "10142 — Kaydee King (@KaydeeKing) November 9, 2016 T... FAKE \n", + "875 It's primary day in New York and front-runners... REAL \n", + "6903 \\nI’m not an immigrant, but my grandparents ... FAKE \n", + "7341 Share This Baylee Luciani (left), Screenshot o... FAKE \n", + "95 A Czech stockbroker who saved more than 650 Je... REAL \n", + "4869 Hillary Clinton and Donald Trump made some ina... REAL \n", + "2909 Iranian negotiators reportedly have made a las... REAL " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_1.shape)\n", + "display(df_1[:10])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* create test dataset" ] }, { @@ -32,7 +324,25 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "def create_test_dset(dset, cutoff=0.7):\n", + " shuffled = sku.shuffle(dset)\n", + " y = shuffled.label\n", + " df_1 = shuffled.drop('label', axis=1)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cut = 0.7\n", + "\n", + "y = df_1.label\n", + "df_1 = df_1.drop('label', axis=1)\n" + ] } ], "metadata": { diff --git a/Jonas_Solutions/Task_2_gen_data.sh b/Jonas_Solutions/Task_2_gen_data.sh new file mode 100755 index 0000000..452bf35 --- /dev/null +++ b/Jonas_Solutions/Task_2_gen_data.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash + +# helper functions: + +function lineprint { + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +} + +function message { + lineprint + printf "$1\n" + lineprint +} + +current_action="IDLE" + +function confirm_action { + message "successfully finished action: $current_action" +} + +function set_action { + current_action="$1" + message "$1" +} + +function perform { + "$@" + local status=$? + if [ $status -ne 0 ] + then + message "$current_action failed!" + fi + return $status +} + +function perform_and_exit { + perform "$@" || exit +} + +# Downloading and unzipping dataset + +D1_URL=https://www.cs.ucsb.edu/~william/data/liar_dataset.zip +D1_ZIP=${D1_URL##*/} + +D2_URL=https://raw.githubusercontent.com/GeorgeMcIntire/fake_real_news_dataset/master/fake_or_real_news.csv.zip +D2_ZIP=${D2_URL##*/} + +set_action "downloading and unpacking $D1_URL if not already existing" + +# testing for unzip: +perform_and_exit unzip -v + +perform_and_exit mkdir -p ./data +perform_and_exit cd ./data/ + +if [ ! -e $D1_ZIP ]; +then + perform_and_exit curl $D1_URL --output ./$D1_ZIP + perform_and_exit unzip $D1_ZIP +fi + +confirm_action + +set_action "downloading and unpacking $D2_URL if not already existing" + +if [ ! -e $D2_ZIP ]; +then + perform_and_exit curl $D2_URL --output ./$D2_ZIP + perform_and_exit unzip $D2_ZIP +fi + +confirm_action diff --git a/Jonas_Solutions/Untitled.ipynb b/Jonas_Solutions/Untitled.ipynb new file mode 100644 index 0000000..f726968 --- /dev/null +++ b/Jonas_Solutions/Untitled.ipynb @@ -0,0 +1,85 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sandbox" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## How to plot a directed Graph:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import networkx as nx\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "fig_1, ax_1 = plt.subplots()\n", + "\n", + "G = nx.DiGraph()\n", + "G.add_nodes_from(range(1,10))\n", + "G.add_edges_from([(i,1) for i in range(2,10)])\n", + "\n", + "nx.draw(G)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}