{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from IPython.display import display, HTML, IFrame, Image" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "#### PyCon UK 2015 - Science track\n", "\n", "
\n", "\n", "##Getting meaning from scientific articles\n", "\n", "\n", "\n", "

\n", "

Eleonore Mayola, PhD

\n", "

Data wrangler at Mastodonc

\n", "

Organiser at PyLadies London

" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####Getting meaning from scientific articles\n", "\n", "1- Who I am\n", "\n", "2- Goal of this project\n", "\n", "3- My plan\n", "\n", "4- First iteration\n", "\n", "5- Improvements\n", "\n", "6- Second iteration\n", "\n", "7- Discussion\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####Getting meaning from scientific articles\n", "\n", "__1- Who I am__\n", "\n", "2- Goal of this project\n", "\n", "3- My plan\n", "\n", "4- First iteration\n", "\n", "5- Improvements\n", "\n", "6- Second iteration\n", "\n", "7- Discussion\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####Who I am\n", "\n", "* Background in biomedical research \n", "\n", "\n", "* Learned Python at an intensive course \n", "\n", "\n", "* Now developer, data wrangler, hardware tinkerer\n", "\n", "\n", "\n", "\n", "=> What would I have done had I known how to code back in my lab days?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####Getting meaning from scientific articles\n", "\n", "1- Who I am\n", "\n", "__2- Goal of this project__\n", "\n", "3- My plan\n", "\n", "4- First iteration\n", "\n", "5- Improvements\n", "\n", "6- Second iteration\n", "\n", "7- Discussion\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####Goal of the project\n", "\n", "*Problem*: Bibliography is an important activity that takes time off research work.\n", "![PhD Comics](../img/phdComics1_.png)\n", " \n", " -> Could the bibliography process be less time-consuming?\n", "\n", "\n", "\n", "*Idea*: What if it was possible to classify a new article in one of those sub-categories" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####Getting meaning from scientific articles\n", "\n", "1- Who I am\n", "\n", "2- Goal of this project\n", "\n", "__3- My plan__\n", "\n", "4- First iteration\n", "\n", "5- Improvements\n", "\n", "6- Second iteration\n", "\n", "7- Discussion" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####My plan\n", "\n", "\n", "![Plan chart](../img/precursor-doc-0.png) \n", " " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####Getting meaning from scientific articles\n", "\n", "1- Who I am\n", "\n", "2- Goal of this project\n", "\n", "3- My plan\n", "\n", "__4- First iteration__\n", "\n", "5- Improvements\n", "\n", "6- Second iteration\n", "\n", "7- Discussion" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####First iteration\n", "\n", "\n", "STEP 1: Gathering scientific articles\n", "\n", "\n", "![Plan chart](../img/precursor-doc-1.png)\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####First iteration\n", "\n", "\n", "STEP 1: Gathering scientific articles\n", "\n", "1 - Yay for Open Access research articles!\n", "\n", "2 - Hmmm, where's the API so I can upload hundreds of them?\n", "\n", "3 - My solution: eLifeScience articles on Github (http://github.com/elifesciences/elife-articles)\n", "\n", "4 - Parsing XML files using Beautiful Soup -> Group A: \"Neuroscience\" - Group B: \"Cell biology\"\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####First iteration\n", "\n", "\n", "\n", "STEP 2: Retrieve the most frequent terms\n", "\n", "![Plan chart](../img/precursor-doc-2.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####First iteration\n", "\n", "\n", "STEP 2: Retrieve the most frequent terms\n", " \n", "-> Use Nltk and Gensim libraries to implement the TF-IDF (Term frequency–inverse document frequency) model\n", "\n", "->Write functions to be executed on a collection of text files (converted from XML)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "There are 172 articles in articles/Neuroscience/\n", "There are 67 articles in articles/Cell biology/\n", "[u'scale', u'colocalization', u'vglut1', u'pearsons', u'coefficient', u'panel', u'red', u'colocalization', u'entire', u'hippocampal']\n" ] } ], "source": [ "# %load get_topics.py\n", "# now renamed scripts/lda_topics.py\n", "\n", "#!/home/eleonore/virtenvs/nltk-gensim-skl/bin/python2.7\n", "from nltk.stem.wordnet import WordNetLemmatizer\n", "from gensim import models\n", "from gensim.corpora import Dictionary\n", "from os import listdir\n", "from os.path import isfile, join\n", "import string, re, codecs, time, json\n", "\n", "\n", "## Global variables\n", "stop_words = ['a', 'also', 'an', 'and', 'are', 'as', 'at', 'be', 'by', 'but', 'for',\n", " 'from', 'has', 'he', 'if', 'in', 'is', 'it', 'its', 'it\\'s', 'not',\n", " 'of', 'on', 'our', 'than', 'that', 'the', 'therefore', 'to', 'was',\n", " 'were', 'will', 'with', 'may', 'need', 'have', 'been', 'their', 'this',\n", " 'these', 'which', 'do', 'did', 'red', 'blue', 'green', 'bar', 'chart',\n", " 'arrowhead', 'arrow', 'vice', 'versa']\n", "\n", "spe_char = {u'β': 'beta', u'α': 'alpha', u'µm': 'micron'}\n", "\n", "## Functions to break up the process:\n", "def parse_text(text_file):\n", " \"Gets a text file outputs a list of strings.\"\n", " with codecs.open(text_file, mode='r', encoding='utf-8') as f:\n", " read = f.read()\n", " r = [read.replace(unicode(i), spe_char.get(i)) for i in read if i in spe_char.keys()] or [read]\n", " text = [line for line in r[0].strip().split('. ') if line != '']\n", " return text\n", " \n", "def get_tokens(text_parsed):\n", " \"Gets a text and retrieves tokens.\"\n", " # Tokenisation\n", " texts = [t.lower().replace('\\n', ' ').split(' ') for t in text_parsed]\n", " # Remove punctuation and stop words\n", " tokens = [[filter(lambda x:x not in string.punctuation, i)\n", " for i in txt if i != '' and i not in stop_words] for txt in texts]\n", " \n", " tokens_cleaned = [[i for i in txt if len(i) > 2 and not i.isdigit()] for txt in tokens]\n", " \n", " return tokens_cleaned\n", "\n", "def lemmatize_tokens(tokens):\n", " \"Gets tokens and retrieves lemmatised tokens.\"\n", " # Lemmatisation using nltk lemmatiser\n", " lmtzr = WordNetLemmatizer()\n", " lemma = [[lmtzr.lemmatize(word) for word in data] for data in tokens]\n", " return lemma\n", "\n", "def bag_of_words(lemma):\n", " \"Takes in lemmatised words and returns a bow.\"\n", " ## Create bag of words from dictionnary\n", " dictionary = Dictionary(lemma)\n", " dictionary.save('../dicts/bow-text.dict')\n", " ## Term frequency–inverse document frequency (TF-IDF)\n", " bow = [dictionary.doc2bow(l) for l in lemma]\n", " return bow\n", "\n", "def tfidf_and_lsi(lemma, bow):\n", " \"Gets a bow and returns topics.\"\n", " dictionary = Dictionary(lemma)\n", " # Transform the count representation into the Tfidf space\n", " tfidf = models.TfidfModel(bow) \n", " corpus_tfidf = tfidf[bow]\n", " ## Build the LSI model\n", " lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=6)\n", " corpus_lsi = lsi[corpus_tfidf]\n", " list_topics = []\n", " for i in range(lsi.num_topics):\n", " list_topics.extend(lsi.show_topic(i))\n", " list_topics.sort(key=lambda tup: tup[0], reverse=True)\n", " topics = [i[1] for i in list_topics[:10]]\n", " return topics\n", "\n", "## Function to retrieve topics using nltk\n", "def get_topics(text_file):\n", " txt = parse_text(text_file)\n", " tokens = get_tokens(txt)\n", " lemma = lemmatize_tokens(tokens)\n", " bow = bag_of_words(lemma)\n", " return tfidf_and_lsi(lemma, bow)\n", "\n", "## Get all text articles from a path and retrieve topics:\n", "def list_all_articles(path):\n", " articles = [f for f in listdir(path) if isfile(join(path, f))] or []\n", " print \"There are %d articles in %s\" % (len(articles), path)\n", " return {\"path\": path, \"articles\": articles}\n", "\n", "# Write the topics to a json file:\n", "#{\"Neuroscience\": {\"pub_id1\":[topics_file1], \"pub_id2\":[topics_file2]...},\n", "# \"Cell biology\": {[], []...}}\n", "def get_articles_topics(path, filename):\n", " \"Store the topics in a json object and dump to a file.\"\n", " all_topics = {}\n", " #Get the directories in a path\n", " dirs = [d for d in listdir(path) if not isfile(join(path, d))]\n", " #For each dir and for each file in a dir\n", " for d in dirs:\n", " all_topics[d] = {}\n", " txt_files = [f for f in listdir(path+d) if isfile(join(path+d, f))]\n", " print txt_files\n", " for f in txt_files:\n", " all_topics[d][f[:-4]] = get_topics(path+d+'/'+f)\n", " with open(filename, 'w') as f:\n", " json.dump(all_topics, f)\n", " return all_topics\n", " \n", "\n", "if __name__ == \"__main__\":\n", "\n", " neuro_articles = list_all_articles(\"../articles/Neuroscience/\")\n", " \n", " cellbiol_articles = list_all_articles(\"../articles/Cell biology/\")\n", " \n", " print get_topics(neuro_articles.get(\"path\") + neuro_articles.get(\"articles\")[0])\n", "\n", " #print get_articles_topics(\"../articles/\", \"../json/filenames_topics.json\") \n" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false, "slideshow": { "slide_type": "slide" } }, "source": [ "####First iteration\n", "\n", "\n", "STEP 3: Build a classifier to predict the subcategory of an article\n", "\n", "![Plan chart](../img/precursor-doc-3.png)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "slide" } }, "source": [ "####First iteration\n", "\n", "\n", "STEP 3: Build a classifier to predict the subcategory of an article\n", "\n", "-> Exploring the data with Numpy and Scikit-learn" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[u'scale', u'detected', u'inset', u'could', u'scale', u'rnai', u'antiphosphoret', u'development', u'control', u'receptor']\n", "[u'allele', u'marker', u'vastus', u'lateralis', u'staining', u'ryr1ag', u'old', u'arrow', u'1year', u'background']\n" ] } ], "source": [ "import json\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import scipy as sp\n", "from scipy import stats\n", "import sklearn\n", "\n", "%matplotlib inline\n", "plt.style.use('ggplot')\n", "\n", "with open(\"../json/filenames_topics.json\", 'r') as f:\n", " topics_articles = json.load(f)\n", " \n", "print topics_articles['Neuroscience']['elife05116']\n", "\n", "print topics_articles['Cell biology']['elife02923']" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['article', 'subject', u'scale', u'detected', u'inset', u'could', u'scale', u'rnai', u'antiphosphoret', u'development', u'control', u'receptor', u'reduced', u'hand', u'reduced']\n", "[u'elife05116', u'Neuroscience', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0', '0', '0']\n" ] } ], "source": [ "# List of most frequent terms\n", "header = ['article', 'subject']\n", "\n", "for subject, articles in topics_articles.iteritems():\n", " for pub_id, topics in articles.iteritems():\n", " header.extend(topics) \n", " \n", "print header[:15]\n", "\n", "# Matrix representing the presence or absence of those terms in each article\n", "top_data = []\n", "\n", "for subject, articles in topics_articles.iteritems():\n", " for pub_id, topics in articles.iteritems(): \n", " ct = []\n", " ct.append(pub_id)\n", " ct.append(subject)\n", " tpcs = ['1' if h in topics else '0' for h in header[2:]]\n", " ct.extend(tpcs)\n", " top_data.append(ct)\n", " \n", "print top_data[0][:15]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[u'elife05116' u'Neuroscience' u'1' ..., u'0' u'0' u'0']\n", " [u'elife02094' u'Neuroscience' u'0' ..., u'0' u'0' u'0']\n", " [u'elife01206' u'Neuroscience' u'0' ..., u'0' u'0' u'0']\n", " ..., \n", " [u'elife04810' u'Cell biology' u'0' ..., u'0' u'0' u'0']\n", " [u'elife02678' u'Cell biology' u'0' ..., u'0' u'0' u'0']\n", " [u'elife05697' u'Cell biology' u'1' ..., u'1' u'1' u'1']]\n" ] } ], "source": [ "# Use a numpy array (data structure used with Scikit-learn)\n", "topics_data = np.array(top_data)\n", "print topics_data\n", "\n", "## Data matrix: column 3 to the end\n", "X = topics_data[:, 2:2392].astype(int)\n", "\n", "## Class vector: column 2\n", "Y = topics_data[:, 1] " ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "X dimension: (239, 2390)\n", "Y dimension: (239,)\n", "[[u'Cell biology' u'67']\n", " [u'Neuroscience' u'172']]\n" ] } ], "source": [ "print \"\\nX dimension: \", X.shape\n", "print \"Y dimension: \", Y.shape\n", "\n", "Yfreq = sp.stats.itemfreq(Y)\n", "print Yfreq\n", "cb_total = int(Yfreq[0][1])\n", "n_total = int(Yfreq[1][1])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\nm5R0BQQEQKPRSKNvu3btwptvvgkPD48i79eL4DNhRERERESvEDc3N6SmpkKv15tMxK5fv46BAwca\nbLexscGdO3eK3F6FChWkzwqFAhUqVEBCQoJRuYSEBPj6+krLPj4+SExMzLect7e3wTpfX18kJCQg\nNTUVOTk5Btufbh94Mpvjjh070KxZM2zfvh2DBg0q8j69KI6EERERERG9QgIDA6FSqbB3716TZXx8\nfLBhwwbExMRI/+Lj4+Hl5VXk9m7duiV91uv1uH37NsqXL29Urnz58rh+/bq0fPPmzXzbK1++PG7d\numUw6ceNGzdQoUIFeHh4wNbW1qDNpz8DQOfOnbF//37odDrEx8ejTZs2Rd6nF8UkjIiIiIjoFeLi\n4oKxY8di0qRJ2LdvHx49eoTs7Gz8+eefmDlzJgDgk08+wZw5c3Dz5k0AQEpKisHkF88qaBbEc+fO\nYe/evcjJycHKlSuhVqtRv359o3IdOnTAggULkJqaitTUVPzwww/o0qWLUbl69erBwcEBS5cuRXZ2\nNo4fP44DBw6gffv2UCqVaNu2Lb7//ns8evQIcXFx2L59u8FU+d7e3qhTpw5CQkLw3nvvQa1Wyz52\nxYW3IxIRERERWYC9ix3qf1zFrPXLNXjwYHh6emLBggUYMWIEnJ2dUadOHYwaNQoAMHDgQAgh0LNn\nTyQmJqJs2bJo3749/vOf/wAwfv9XQe8Je/fdd7F7926MHj0afn5+WLlyJWxsbIzKhoSEICMjA61a\ntQIAvP/++wgJCTFqQ6VSYe3atZg4cSIWL16MChUqYOHChahatSoAYObMmRg9ejTq1asHf39/dOzY\nEVFRUQZtdevWDSEhIZg+fbrsY1acFMIKJu9/doixNNFoNLh//35Jh0GlEPtGycm4/dis72l5UUF9\n/GHvyRsVyBivG2QK+0bpw59J6TFz5kwkJyfjhx9+kNadPHkSI0eOxD///PPC9Zv6WT/73NrT+L88\nERERERFZjbi4OMTExEAIgcjISPzyyy8G0/FnZ2cjNDQUvXr1KrEYeTsiERERERFZjQcPHmDYsGFI\nTExEuXLlMGTIEOk2ykuXLqFdu3bQarUlMitiHiZhRERERERkNerWrYtjx47lu61atWq4dOmShSMy\nxtsRiYiIiIiILIhJGBERERERkQUxCSMiIiIiIrIgJmFEREREREQWxCSMiIiIiIjIgpiEERERERHR\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "freqs_cb, freqs_n = [], []\n", "R, N = range(3, 15, 2), len(range(3, 15, 2))\n", "\n", "for j in R:\n", " cb = [int(i[1]) for i in topics_data[:, (1, j)] if i[0]=='Cell biology']\n", " n = [int(i[1]) for i in topics_data[:, (1, j)] if i[0]=='Neuroscience']\n", " cb_freq = sum(cb)*100./cb_total\n", " n_freq = sum(n)*100./n_total\n", " freqs_cb.append(cb_freq)\n", " freqs_n.append(n_freq)\n", "\n", "ind = np.arange(N)\n", "width = 0.3\n", "fig, ax = plt.subplots()\n", "rects_cb = ax.bar(ind, freqs_cb, width, color='#A770BF')\n", "rects_n = ax.bar(ind+width, freqs_n, width, color='#81ABD3')\n", "\n", "ax.set_ylabel('Percentage of occurence')\n", "ax.set_title('Occurence of frequent term in Cell biology vs Neuroscience')\n", "ax.set_xticks(ind+width)\n", "xlabels = [header[i] for i in R]\n", "ax.set_xticklabels(xlabels)\n", "ax.legend((rects_cb[0], rects_n[0]), ('Cell biology', 'Neuroscience'))\n", "\n", "fig.subplots_adjust(right=2)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nbqeiogLTp09HQUEBdu3ahddffx1bt24FAGzevBlBQUHYuHEjAgICUF5ejoCAACxfvhybN292FigR\nqYtTiKRp5eXlcDgcmDFjBvz8/DBx4kQkJiZ2Gufn5we73Y6qqirY7Xb079/fedV1Od8bFh0djdTU\nVAiCgKlTp6KhoQGNjY04f/48zGYzHn30UQQHB0On0yE5Odm5XSLyHh6BkaadP3++0/dE9e/fv1N5\nxMTEYO7cufjzn/+MqqoqjBo1CnPnzkVkZKSs57ly6i8gIADAD1962tzcjNDQUOfXzBORdvAIjDQt\nMjKy01fN19fXd/mN21OmTMHzzz+PvLw8CIKAd955B8DVv527J1FRUbhw4QIuXrzY6bHebJeIeo8F\nRpo2bNgw6HQ6fPLJJ7Db7Th06BAqKioAuE7hVVdX48iRI7h06RL69euHfv36wc/vh5d3REQEzp07\nd01TfpGRkRgzZgy2bduGlpYW2O12HD16FMAP3wDe3NzcZbkRkedxCpE0zd/fH0uXLsXWrVvx/vvv\nY8yYMc4vsLzyCMhut+O//uu/cObMGeh0Otx000147LHHAACTJk3CgQMHkJmZiYEDB+Kll17q9Dw9\nHU0tWrQIb731FpYsWQK73Y6RI0dixIgRGDRoECZPnoysrCyIooiNGzdyFSKRiriMnoiIfBKnEImI\nyCexwIiIyCexwIiIyCexwIiIyCexwIiIyCexwIiIyCexwIiIyCexwIiIyCexwIiIyCf9fxresF3b\nW4gpAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#x_index, y_index = 48, 350\n", "x_index, y_index = 859, 179\n", "\n", "classes = ['Cell biology', 'Neuroscience']\n", "formatter = plt.FuncFormatter(lambda i, *args: classes[int(i)])\n", "\n", "from sklearn import preprocessing\n", "le = preprocessing.LabelEncoder()\n", "le.fit(Y)\n", "targets = le.transform(Y)\n", "\n", "plt.scatter(topics_data[:, x_index], topics_data[:, y_index],\n", " s=50, c=targets, alpha=0.5)\n", "plt.colorbar(ticks=[0, 1], format=formatter)\n", "plt.clim(-0.2, 1.2)\n", "plt.xlabel(header[x_index])\n", "plt.ylabel(header[y_index])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####How I executed my plan\n", "\n", "\n", "STEP 3: Build a classifier to predict the subcategory of an article\n", "\n", "-> Building a classifier" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "slide" } }, "source": [ "Naive Bayes classifier:\n", "\n", "* Simple classifier applying Bayes' theorem\n", "\n", "* Assumes independence of the features\n", "\n", "* Widely used in different application (text categorisation)\n", "\n", "* Doesn't require a very large dataset" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "## NAIVE BAYES classifier:\n", "from sklearn.naive_bayes import BernoulliNB\n", "from sklearn import metrics, preprocessing\n", "from sklearn.cross_validation import train_test_split\n", "\n", "## Encode labels ('Cell biology', 'Neuroscience') as 0 and 1.\n", "le = preprocessing.LabelEncoder()\n", "le.fit(Y)\n", "y_transformed = le.transform(Y)\n", "#print Y\n", "#print y_transformed\n", "## => 1: Neuroscience, 0: Cell biology\n", "\n", "## Randomly split the data between training and testing:\n", "X_train, X_test, Y_train, Y_test = train_test_split(X, y_transformed)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True positive: 10 - False negative: 7\n", "False positive: 3 - True negative: 40\n" ] } ], "source": [ "## Bernoulli NB classifier\n", "\n", "nbmodel_train = BernoulliNB().fit(X_train, Y_train)\n", "predicted_bnb = nbmodel_train.predict(X_test)\n", "\n", "## Confusion matrix:\n", "cm_bnb = metrics.confusion_matrix(Y_test, predicted_bnb)\n", "print \"True positive: \", cm_bnb[0][0],\" - False negative: \", cm_bnb[0][1]\n", "print \"False positive: \", cm_bnb[1][0], \" - True negative: \", cm_bnb[1][1]" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.77 0.59 0.67 17\n", " 1 0.85 0.93 0.89 43\n", "\n", "avg / total 0.83 0.83 0.83 60\n", "\n", "Accuracy: 0.833333333333\n" ] } ], "source": [ "## Bernoulli NB classifier\n", "\n", "# Precision: fraction of retrieved instances that are relevant (TP / TP + FP)\n", "# Recall: fraction of relevant instances that are retrieved\n", "print metrics.classification_report(Y_test, predicted_bnb)\n", "\n", "# Accuracy: overall correctness of the model\n", "print \"Accuracy: \", metrics.accuracy_score(Y_test, predicted_bnb) \n", "\n", "## => Test with a high precision and recall for class 1 = Neuroscience" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "K-nearest neighbor algorithm:\n", "\n", "* Predict the label of a new point from its neighbours\n", "\n", "* Simplest classifier in Machine Learning\n", "\n", "* Lazy learner: computationally demanding for large datasets" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True positive: 8 - False negative: 10\n", "False positive: 5 - True negative: 37 \n", "\n" ] } ], "source": [ "## K NEAREST NEIGHBOUR classifier\n", "from sklearn import metrics\n", "from sklearn import neighbors\n", "\n", "X_train, X_test, Y_train, Y_test = train_test_split(X, y_transformed)\n", "\n", "knn = neighbors.KNeighborsClassifier(n_neighbors=3).fit(X_train, Y_train)\n", "predicted_knn = knn.predict(X_test)\n", "\n", "cm_knn = metrics.confusion_matrix(Y_test, predicted_knn)\n", "print \"True positive: %d - False negative: %d\" % (cm_knn[0][0], cm_knn[0][1])\n", "print \"False positive: %d - True negative: %d \\n\" % (cm_knn[1][0], cm_knn[1][1])" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.62 0.44 0.52 18\n", " 1 0.79 0.88 0.83 42\n", "\n", "avg / total 0.74 0.75 0.74 60\n", "\n", "Accuracy: 0.75\n" ] } ], "source": [ "## K NEAREST NEIGHBOUR classifier\n", "\n", "# Precision: fraction of retrieved instances that are relevant (TP / TP + FP)\n", "# Recall: fraction of relevant instances that are retrieved\n", "print metrics.classification_report(Y_test, predicted_knn)\n", "\n", "# Accuracy: overall correctness of the model\n", "print \"Accuracy: \", metrics.accuracy_score(Y_test, predicted_knn) \n", "\n", "## => Test with a high precision and recall for class 1 = Neuroscience" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.74307116104868909, 0.74854126146151712, 0.77028436539306111, 0.77063492063492067, 0.75300333704115685, 0.7373626373626373, 0.72686100131752307, 0.7321080478975216, 0.74248366013071898, 0.73689839572192506, 0.75823412698412695, 0.73710904480135242, 0.74731815803244372, 0.74654234654234641, 0.74300699300699302, 0.74581105169340467, 0.73591470258136926, 0.75804093567251463, 0.75569444444444445]\n", "[0.0097378277153558068, 0.0039294625239596681, 0.036849480657926544, 0.049525335751818091, 0.055005815837847118, 0.035175822459327585, 0.042045989963185822, 0.054404434025065819, 0.064550549673863492, 0.065473035936487706, 0.063142873477736575, 0.06091209095622617, 0.061086699560089427, 0.083182950324958621, 0.093804744232841353, 0.08805579810894619, 0.077954833834140022, 0.084796581962805637, 0.089237489180885435]\n" ] } ], "source": [ "## Model validation: test several training/testing data\n", "# K fold cross validation: iterator that randomise the sampling\n", "\n", "from sklearn.cross_validation import cross_val_score\n", "\n", "kf = range(2, 21)\n", "\n", "knn = neighbors.KNeighborsClassifier(n_neighbors = 3)\n", "nb = BernoulliNB()\n", "\n", "means_knn, sds_knn, means_nb, sds_nb = [], [], [], []\n", "\n", "for k in kf:\n", " knn_scores = cross_val_score(knn, X_train, Y_train, cv=k)\n", " nb_scores = cross_val_score(nb, X_train, Y_train, cv=k)\n", " means_knn.append(knn_scores.mean()) \n", " sds_knn.append(knn_scores.std())\n", " means_nb.append(nb_scores.mean())\n", " sds_nb.append(nb_scores.std())\n", "\n", "print means_knn\n", "print sds_knn" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nPRVLfFg8qXdSy7y9r0J29bx18haH3zpM649a4zzYubzl5ItKrcJzrie1OtfiyDtHaNivIa2mtTKq\nQkpSfOLPxRMwMgBdug7XUa40n9xcvu1dAclOz+bYlGPcOXsHlVpFalwq6ffTsbCzwLKqJWoHteF3\nVTWWDo++Ta1Nn/m6qXDmf9H/Ir9/+judl3bGqZNTect5IrW8a9H/QH9+m/Ybu3rvovOyztg2ti1v\nWZKn4Pqh6xybcgzPeZ407NKQHQN3cP/SfTp+2VEW6hWI9PvpHHzzIBa2Frx66FVU6hwb1mXq0MZr\n0d7RkhqXqv9OupZE7J+xBut1WbqcgiBXATFo/aBi6Xii+YeGhrJ27Vp0Oh3e3t707dvXYPvu3bsJ\nDAwEIDs7m+joaPz8/NBoNEyYMAG1Wo1SqcTExIT//ve/xRJXkgghOLvsLOHrw/nP5v9g18Su3LQU\nF7W9mm5+3Tj/03l+fvVnWrzXAtc3XMtblqQYnPM7x9lvz9J9bXccWzpiZW1F7+29OTr5KHtf20s3\nv26o7dXlLVNSyiRHJ7N/+H5qeNWg3WftUJo8qnlXmirRVNOgqaZ5YjqZqZlo72jRxmlJvZNKalxq\nsbUUav46nQ4/Pz9mzpyJnZ0dH330Ea1atcLJ6dEds4+PDz4+PgCEhISwb98+NJpH4mfNmoWVlVWx\nhZUkuiwdJz4+QdyZOPrs7oOm+pMz19hQKBS4DHWh+ovVOTLpCNcPX6fXt72gUnkrkxSGLkvH77N+\nJ+ZEDL39e2NT20a/TaVW0WV5F4IXBbPrlV30WNdDPtU9xyREJLB/2H6ajm7KC2NfeKZqG1NLU0zr\nmGJTx+bJgQug0AbfixcvUq1aNRwcHFCpVHh5eREcHFxg+MDAQLy8vAzWlXd3xYzkDALeCCA5Jpne\nO3v/K40/N5XqV8Jnpw+OLR3Z2GEj51adky+GGSkZDzI4MPIA9y/dx8ffx8D4H6JQKmj9YWtavNeC\nnwf8zM1jN8tBqaS0iQ6MZu9re2k7sy3NxjUzinaeQs0/ISEBe3t7/bKdnR0JCQn5hk1PT+fs2bO0\nbdtWv06hUDB37lymT5/OoUOHSkhy0Um5lcKefnuwqmFFjzU9MLMyK3MNpYHSVEmLKS147cBrXA24\nyq5XdnHnLzk8hDGRHJ3Mnn570FTX0HN9T8wrFd6NuPHAxnRd2ZWj7x4lfF14GamUlAUXd17k17d/\n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\nDy7kkhfxrAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(kf, means_knn, label=\"KNN 3 mean accuracy\", color=\"purple\")\n", "plt.plot(kf, means_nb, label=\"NB mean accuracy\", color=\"blue\")\n", "plt.legend(loc=2)\n", "plt.ylim(0.6, 0.9)\n", "plt.title(\"Accuracy means with increasing K-fold\")" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAEPCAYAAACqZsSmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcVNX7B/DPLCwDDMsAAwqJiAg4LpiIC6hp4FYqFiHu\naZapuVTWN7dfIpFWLqV+K02SNPMrlma5hvtCLihYIgooqKDs+zbAzPn9QdwcGIYBQUbneb9e82Lu\n3HPmPjPMPPfOueeew2OMMRBCCNEr/LYOgBBCyJNHyZ8QQvQQJX9CCNFDlPwJIUQPUfInhBA9RMmf\nEEL0ECV/Qh7DqVOnwOfz8eDBg1Z5/hdeeAFvvvlmk+vx+Xz89NNPLRrL66+/Dn9//8d+ntTUVPD5\nfERHR7dAVKS5KPnruIyMDBgYGMDe3h7V1dVtHY7OEwqF2L59e1uH0WJ4PB54PF5bhwEA2LhxI37+\n+ecm1encuTNCQkJUHuvQoQMyMjLg7e3dkuGRJqLkr+O+//57dOnSBZWVlfj111/bOhwAQFVVVVuH\n0CAej4en7bpFXX4/HyUWi2FhYdGkOup2XHw+H1KpFEKhsKVCI81AyV+HKZVKfPfdd3jnnXcwefJk\nbNmypV6ZrKwsTJ8+Hfb29hCJRHB3d8e2bdu49bdv30ZgYCCsra1hamqKnj174uDBgwCAiIgIGBgY\nqDxfWloa+Hw+zpw5A+DfZo1Dhw7B19cXIpEI3333HQoKCjB58mQ4OTnBxMQE7u7uWLduXb34du/e\njd69e0MkEsHGxgajRo1CQUEBIiIiYGVlhfLycpXyK1euRKdOnRp8T+Lj4zF8+HBYWVnBzMwMXbt2\nxY8//ggA6NixIxQKBaZPnw4+nw+BQAAAyM/PbzTW2iaNLVu2wMnJCRYWFggICEBOTo5KuY0bN8LR\n0RGmpqYYMWIE7t27p7Jem/eldlsbN25Ex44dYWxsjLKyMty9excjRoyAiYkJOnTogI0bNzb4Pjzq\n5MmT6NGjB0QiEXr27ImTJ0/WK5OZmYnXX38dUqkU5ubm8PX1xdmzZwHUfM46dOiATz/9VKWOXC6H\nlZUV97mr2+xz9epVjBw5EnZ2dhCLxfD29sbRo0e59S+88AJu376NkJAQ8Pl88Pl83Lt3T22zz61b\nt/DSSy9BLBZDLBZjzJgxuH37Nre+9rMaHR2N559/HqampvD29sbVq1e1eo+IGozorMOHDzMzMzNW\nVFTErl+/zgQCAbtz5w63vqysjLm7u7PevXuz48ePs9TUVHb8+HG2e/duxhhjDx8+ZFKplPn7+7Pz\n58+zlJQUduDAAXb48GHGGGPbtm1jQqFQZZv3799nPB6PnT59mjHG2MmTJxmPx2Pu7u7s999/Z6mp\nqSwtLY1lZGSwzz77jMXGxrLU1FT2448/MjMzM7Zt2zbuub7//ntmYGDAPvnkE5aQkMCuX7/ONm3a\nxHJyclh5eTmzsrJiP/zwA1deoVAwJycn9umnnzb4nnTv3p1NmjSJJSQksJSUFHb48GF24MABxhhj\n2dnZTCgUsg0bNrDMzEyWmZnJGGNaxTpt2jRmYWHBJk6cyOLj41l0dDRzcnJi06ZN48r8+uuvTCgU\nsvXr17OkpCQWHh7OpFIp4/P5LD09vUnbMjc3Z6+88gq7du0au379OqusrGS9evVi3t7e7NKlSywu\nLo75+/szc3Nz9uabbzb4fqSnpzMTExM2Y8YMlpCQwKKiolj37t0Zj8djO3fu5D4nHh4eLDAwkF25\ncoXdvn2bhYWFMSMjI5aQkMAYY2zJkiXM3d1d5bn37NnDjI2NWUFBARe3v78/t/7UqVNs+/btLCEh\ngSUlJbFly5YxQ0NDlpiYyBhjLC8vjzk7O7MPPviA+38oFAqWkpLCeDweO3/+PBdfhw4dmJ+fH7t6\n9Sq7cuUKGzJkCOvcuTOrrKxkjNV8Vvl8Phs8eDA7d+4cu3nzJhs2bBhzcXFh1dXVDb4/pGGU/HVY\nQECAyhd/4MCBbPHixdzy1q1bmbGxMZd46lq2bBlr164dKysrU7u+Kcn/xx9/bDTe+fPnqySH5557\njs2bN09jeV9fX275yJEjzMDAgGVkZDRYx8LCgkVERDS4XigUquxQtI112rRpzM7Ojks2jDG2evVq\n1q5dO27Zx8eHTZ48WeV5Fi1axHg8XoP/g4a2ZWVlxUpLS7nHoqKiGI/HY0lJSdxj2dnZTCQSaUz+\nS5cuZR07dmQKhYJ77MCBAyrJf9u2bczR0bFekhw6dChbuHAhY4yxhIQExuPx2MWLF7n1o0ePZkFB\nQSpx+/n5NRgLY4z17NmThYWFccudO3dmISEhKmXqJv+tW7cyExMTlpuby5XJzMxkIpGIbd++nXsN\nPB6PxcbGcmUuXLjAeDwet7MhTUPNPjrq4cOHOHjwIN566y3usbfffhsRERFQKBQAgCtXrkAmk6F9\n+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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(kf, sds_knn, label=\"KNN 3 sds accuracy\", color=\"purple\")\n", "plt.plot(kf, sds_nb, label=\"NB sds accuracy\", color=\"blue\")\n", "plt.legend(loc=2)\n", "plt.ylim(0.01, 0.4)\n", "plt.title(\"Accuracy standard deviation\")" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[u'mouse', u'pathway', u'regulator', u'integrating', u'potential', u'identified', u'b16', u'data', u'pathway', u'potential']\n", "[u'over', u'week', u'postischaemia', u'hour', u'cerebral', u'evolution', u'hypointense', u'cerebral', u'ischaemia', u'ischaemia']\n", "[1]\n", "[1]\n" ] } ], "source": [ "## 10 folds\n", "\n", "X_train, X_test, Y_train, Y_test = train_test_split(X, y_transformed)\n", "\n", "NB_train = BernoulliNB()\n", "for i in range(10):\n", " NB_train.fit(X_train, Y_train)\n", " \n", "import get_topics as gt\n", "\n", "topics_test1 = gt.get_topics(\"../articles/conrad2013_melanoma.txt\")\n", "print topics_test1\n", "\n", "topics_test2 = gt.get_topics(\"../articles/panizzo2014_cerebral_ischaemia.txt\")\n", "print topics_test2\n", "\n", "test1 = [1 if h in topics_test1 else 0 for h in header[2:]]\n", "test2 = [1 if h in topics_test2 else 0 for h in header[2:]]\n", "\n", "NB_test1 = NB_train.predict(test1)\n", "print NB_test1\n", "\n", "NB_test2 = NB_train.predict(test2)\n", "print NB_test2" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####Getting meaning from scientific articles\n", "\n", "1- Who I am\n", "\n", "2- Goal of this project\n", "\n", "3- My plan\n", "\n", "4- First iteration\n", "\n", "__5- Improvements__\n", "\n", "6- Second iteration\n", "\n", "7- Discussion" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####Improvements\n", "\n", "\n", "\n", "* Use article abstracts only\n", "\n", "\n", "* Use Python 3 to avoid unicode issues\n", "\n", "\n", "* Use the Latent Dirichet Allocation model" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####Second iteration\n", "\n", "\n", "__Topic modeling__\n", "\n", ">\"A __topic model__ is a type of statistical model for discovering the abstract \"topics\" that occur in a collection of documents.\"\n", "\n", "> http://en.wikipedia.org/wiki/Topic_model\n", "\n", "* Latent Semantic Analysis (LSA)\n", "\n", "-> Analyse relationships between a set of documents and the terms they contain by producing a set of concepts related to the documents and terms.\n", "\n", "\n", "* Latent Derichelet Allocation (LDA)\n", "\n", "-> Differs from LSA by assuming each document to be characterized by a mixture of various topics. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####Second iteration\n", "\n", "__Latent Derichelet Allocation (LDA) with Gensim__\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "from nltk.stem.wordnet import WordNetLemmatizer\n", "\n", "from gensim import models\n", "from gensim.corpora import Dictionary\n", "from gensim.parsing.preprocessing import STOPWORDS\n", "\n", "from os import listdir\n", "from os.path import isfile, join\n", "\n", "import string \n", "import codecs\n", "import time\n", "import json\n", "\n", "\n", "# Testing data: 2 Cell bio article abstracts\n", "\n", "conrad2013 = \"\"\"The inability of targeted BRAF inhibitors to produce long-lasting improvement in the clinical outcome of melanoma highlights a need to identify additional approaches to inhibit melanoma growth. \n", " Recent studies have shown that activation of the Wnt/β-catenin pathway decreases tumor growth and cooperates with ERK/MAPK pathway inhibitors to promote apoptosis in melanoma. \n", " Therefore, the identification of Wnt/β-catenin regulators may advance the development of new approaches to treat this disease. \n", " In order to move towards this goal we performed a large scale small-interfering RNA (siRNA) screen for regulators of β-catenin activated reporter activity in human HT1080 fibrosarcoma cells. \n", " Integrating large scale siRNA screen data with phosphoproteomic data and bioinformatics enrichment identified a protein, FAM129B, as a potential regulator of Wnt/β-catenin signaling. \n", " Functionally, we demonstrated that siRNA-mediated knockdown of FAM129B in A375 and A2058 melanoma cell lines inhibits WNT3A-mediated activation of a β-catenin-responsive luciferase reporter and inhibits expression of the endogenous Wnt/β-catenin target gene, AXIN2. \n", " We also demonstrate that FAM129B knockdown inhibits apoptosis in melanoma cells treated with WNT3A. These experiments support a role for FAM129B in linking Wnt/β-catenin signaling to apoptosis in melanoma.\n", " The incidence of melanoma continues to rise across the U.S. at a rate faster than any other cancer. Malignant melanoma has a poor prognosis with a 5-year survival rate of only 15%3. \n", " The recently approved therapeutic, vemurafenib, extends median patient survival by 7 months. This major advance raises expectations that even greater rates of survival might be attainable with combination therapies.\"\"\"\n", "\n", "huang2015 = \"\"\"Mouse GnT1IP-L, and membrane-bound GnT1IP-S (MGAT4D) expressed in cultured cells inhibit MGAT1, the N-acetylglucosaminyltransferase that initiates the synthesis of hybrid and complex N-glycans. \n", " However, it is not known where in the secretory pathway GnT1IP-L inhibits MGAT1, nor whether GnT1IP-L inhibits other N-glycan branching N-acetylglucosaminyltransferases of the medial Golgi. We show here that the luminal domain of GnT1IP-L contains its inhibitory activity. \n", " Retention of GnT1IP-L in the endoplasmic reticulum (ER) via the N-terminal region of human invariant chain p33, with or without C-terminal KDEL, markedly reduced inhibitory activity. \n", " Dynamic fluorescent resonance energy transfer (FRET) and bimolecular fluorescence complementation (BiFC) assays revealed homomeric interactions for GnT1IP-L in the ER, and heteromeric interactions with MGAT1 in the Golgi. \n", " GnT1IP-L did not generate a FRET signal with MGAT2, MGAT3, MGAT4B or MGAT5 medial Golgi GlcNAc-tranferases. \n", " GnT1IP/Mgat4d transcripts are expressed predominantly in spermatocytes and spermatids in mouse, and are reduced in men with impaired spermatogenesis.\"\"\"" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['The inability of targeted BRAF inhibitors to produce long-lasting improvement in the clinical outcome of melanoma highlights a need to identify additional approaches to inhibit melanoma growth. \\n Recent studies have shown that activation of the Wnt/\\xce\\xb2-catenin pathway decreases tumor growth and cooperates with ERK/MAPK pathway inhibitors to promote apoptosis in melanoma. \\n Therefore, the identification of Wnt/\\xce\\xb2-catenin regulators may advance the development of new approaches to treat this disease. \\n In order to move towards this goal we performed a large scale small-interfering RNA (siRNA) screen for regulators of \\xce\\xb2-catenin activated reporter activity in human HT1080 fibrosarcoma cells. \\n Integrating large scale siRNA screen data with phosphoproteomic data and bioinformatics enrichment identified a protein, FAM129B, as a potential regulator of Wnt/\\xce\\xb2-catenin signaling. \\n Functionally, we demonstrated that siRNA-mediated knockdown of FAM129B in A375 and A2058 melanoma cell lines inhibits WNT3A-mediated activation of a \\xce\\xb2-catenin-responsive luciferase reporter and inhibits expression of the endogenous Wnt/\\xce\\xb2-catenin target gene, AXIN2. \\n We also demonstrate that FAM129B knockdown inhibits apoptosis in melanoma cells treated with WNT3A. These experiments support a role for FAM129B in linking Wnt/\\xce\\xb2-catenin signaling to apoptosis in melanoma.\\n The incidence of melanoma continues to rise across the U.S. at a rate faster than any other cancer. Malignant melanoma has a poor prognosis with a 5-year survival rate of only 15%3. \\n The recently approved therapeutic, vemurafenib, extends median patient survival by 7 months. This major advance raises expectations that even greater rates of survival might be attainable with combination therapies.']\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:5: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal\n" ] } ], "source": [ "spe_char = {u'β': 'beta', u'α': 'alpha', u'µm': 'micron'}\n", "\n", "def parse_text(text):\n", " \"Gets a text and outputs a list of strings.\"\n", " doc = [text.replace(unicode(i), spe_char.get(i)) for i in text if i in spe_char.keys()] or [text]\n", " return doc\n", "\n", "conrad2013_parsed = parse_text(conrad2013)\n", "\n", "huang2015_parsed = parse_text(huang2015)\n", "\n", "print conrad2013_parsed" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['inability', 'targeted', 'braf', 'inhibitors', 'produce', 'long', 'lasting', 'improvement', 'clinical', 'outcome', 'melanoma', 'highlights', 'need', 'identify', 'additional', 'approaches', 'inhibit', 'melanoma', 'growth', 'recent', 'studies', 'shown', 'activation', 'wnt', 'catenin', 'pathway', 'decreases', 'tumor', 'growth', 'cooperates', 'erk', 'mapk', 'pathway', 'inhibitors', 'promote', 'apoptosis', 'melanoma', 'therefore', 'identification', 'wnt', 'catenin', 'regulators', 'advance', 'development', 'new', 'approaches', 'treat', 'disease', 'order', 'goal', 'performed', 'large', 'scale', 'small', 'interfering', 'rna', 'sirna', 'screen', 'regulators', 'catenin', 'activated', 'reporter', 'activity', 'human', 'ht1080', 'fibrosarcoma', 'cells', 'integrating', 'large', 'scale', 'sirna', 'screen', 'data', 'phosphoproteomic', 'data', 'bioinformatics', 'enrichment', 'identified', 'protein', 'fam129b', 'potential', 'regulator', 'wnt', 'catenin', 'signaling', 'functionally', 'demonstrated', 'sirna', 'mediated', 'knockdown', 'fam129b', 'a375', 'a2058', 'melanoma', 'cell', 'lines', 'inhibits', 'wnt3a', 'mediated', 'activation', 'catenin', 'responsive', 'luciferase', 'reporter', 'inhibits', 'expression', 'endogenous', 'wnt', 'catenin', 'target', 'gene', 'axin2', 'demonstrate', 'fam129b', 'knockdown', 'inhibits', 'apoptosis', 'melanoma', 'cells', 'treated', 'wnt3a', 'experiments', 'support', 'role', 'fam129b', 'linking', 'wnt', 'catenin', 'signaling', 'apoptosis', 'melanoma', 'incidence', 'melanoma', 'continues', 'rise', 'rate', 'faster', 'cancer', 'malignant', 'melanoma', 'poor', 'prognosis', 'year', 'survival', 'rate', 'recently', 'approved', 'therapeutic', 'vemurafenib', 'extends', 'median', 'patient', 'survival', 'months', 'major', 'advance', 'raises', 'expectations', 'greater', 'rates', 'survival', 'attainable', 'combination', 'therapies']\n" ] } ], "source": [ "def get_tokens(text_parsed):\n", " \"Gets a text and retrieves tokens.\"\n", " # Tokenisation\n", " texts = text_parsed[0].lower().replace('\\n', ' ').replace('/', ' ').replace('-', ' ').split(' ')\n", " # Remove punctuation and stop words\n", " tokens = [filter(lambda x:x not in string.punctuation, i)\n", " for i in texts if i != '' and i not in STOPWORDS]\n", " tokens_cleaned = [i for i in tokens if len(i) > 2 and not i.isdigit()]\n", " return tokens_cleaned\n", "\n", "conrad2013_tokens = get_tokens(conrad2013_parsed)\n", "\n", "huang2015_tokens = get_tokens(huang2015_parsed)\n", "\n", "print conrad2013_tokens" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['inability', 'targeted', 'braf', u'inhibitor', 'produce', 'long', 'lasting', 'improvement', 'clinical', 'outcome', 'melanoma', u'highlight', 'need', 'identify', 'additional', u'approach', 'inhibit', 'melanoma', 'growth', 'recent', u'study', 'shown', 'activation', 'wnt', 'catenin', 'pathway', u'decrease', 'tumor', 'growth', 'cooperates', 'erk', 'mapk', 'pathway', u'inhibitor', 'promote', 'apoptosis', 'melanoma', 'therefore', 'identification', 'wnt', 'catenin', u'regulator', 'advance', 'development', 'new', u'approach', 'treat', 'disease', 'order', 'goal', 'performed', 'large', 'scale', 'small', 'interfering', 'rna', 'sirna', 'screen', u'regulator', 'catenin', 'activated', 'reporter', 'activity', 'human', 'ht1080', 'fibrosarcoma', u'cell', 'integrating', 'large', 'scale', 'sirna', 'screen', 'data', 'phosphoproteomic', 'data', 'bioinformatics', 'enrichment', 'identified', 'protein', 'fam129b', 'potential', 'regulator', 'wnt', 'catenin', 'signaling', 'functionally', 'demonstrated', 'sirna', 'mediated', 'knockdown', 'fam129b', 'a375', 'a2058', 'melanoma', 'cell', u'line', 'inhibits', 'wnt3a', 'mediated', 'activation', 'catenin', 'responsive', 'luciferase', 'reporter', 'inhibits', 'expression', 'endogenous', 'wnt', 'catenin', 'target', 'gene', 'axin2', 'demonstrate', 'fam129b', 'knockdown', 'inhibits', 'apoptosis', 'melanoma', u'cell', 'treated', 'wnt3a', u'experiment', 'support', 'role', 'fam129b', 'linking', 'wnt', 'catenin', 'signaling', 'apoptosis', 'melanoma', 'incidence', 'melanoma', 'continues', 'rise', 'rate', 'faster', 'cancer', 'malignant', 'melanoma', 'poor', 'prognosis', 'year', 'survival', 'rate', 'recently', 'approved', 'therapeutic', 'vemurafenib', 'extends', 'median', 'patient', 'survival', u'month', 'major', 'advance', u'raise', u'expectation', 'greater', u'rate', 'survival', 'attainable', 'combination', u'therapy']\n" ] } ], "source": [ "def lemmatize_tokens(tokens):\n", " \"Gets tokens and retrieves lemmatised tokens.\"\n", " # Lemmatisation using nltk lemmatiser\n", " lmtzr = WordNetLemmatizer()\n", " lemma = [lmtzr.lemmatize(t) for t in tokens]\n", " return lemma\n", "\n", "conrad2013_lemma = lemmatize_tokens(conrad2013_tokens)\n", "\n", "huang2015_lemma = lemmatize_tokens(huang2015_tokens)\n", "\n", "print conrad2013_lemma" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Bag of words representation of the first document (tuples are composed by token_id and multiplicity):\n", "[(0, 1), (1, 1), (2, 1), (3, 2), (4, 1), (5, 1), (6, 2), (7, 3), (8, 2), (9, 1), (10, 1), (11, 1), (12, 1), (13, 1), (14, 1), (15, 7), (16, 3), (17, 1), (18, 1), (19, 1), (20, 1), (21, 2), (22, 1), (23, 1), (24, 1), (25, 1), (26, 1), (27, 1), (28, 1), (29, 1), (30, 1), (31, 1), (32, 1), (33, 1), (34, 4), (35, 1), (36, 1), (37, 1), (38, 1), (39, 1), (40, 1), (41, 2), (42, 1), (43, 1), (44, 1), (45, 1), (46, 1), (47, 1), (48, 1), (49, 1), (50, 1), (51, 1), (52, 2), (53, 3), (54, 1), (55, 1), (56, 2), (57, 2), (58, 1), (59, 1), (60, 1), (61, 1), (62, 1), (63, 1), (64, 1), (65, 1), (66, 1), (67, 2), (68, 8), (69, 1), (70, 1), (71, 1), (72, 1), (73, 1), (74, 2), (75, 1), (76, 1), (77, 1), (78, 1), (79, 1), (80, 1), (81, 1), (82, 1), (83, 1), (84, 1), (85, 3), (86, 1), (87, 1), (88, 3), (89, 2), (90, 1), (91, 1), (92, 1), (93, 1), (94, 2), (95, 2), (96, 1), (97, 2), (98, 3), (99, 1), (100, 1), (101, 1), (102, 3), (103, 1), (104, 1), (105, 1), (106, 1), (107, 1), (108, 1), (109, 1), (110, 1), (111, 1), (112, 5), (113, 2), (114, 1)]\n", "\n", "In the document, topic_id 0 (word inability) appears 1 time[s]\n", "In the document, topic_id 1 (word targeted) appears 1 time[s]\n", "In the document, topic_id 2 (word braf) appears 1 time[s]\n", "In the document, topic_id 3 (word inhibitor) appears 2 time[s]\n", "In the document, topic_id 4 (word produce) appears 1 time[s]\n", "...\n" ] } ], "source": [ "def bag_of_words(lemma):\n", " \"Takes in lemmatised words and returns a bow.\"\n", " # Create bag of words from dictionnary\n", " dictionary = Dictionary(lemma)\n", " dictionary.save('../dicts/lda-text.dict')\n", " bow = [dictionary.doc2bow(l) for l in lemma] # Calculates inverse document counts for all terms\n", " return (bow, dictionary)\n", "\n", "\n", "docs = [conrad2013_lemma, huang2015_lemma] # testing corpus\n", "\n", "bow, dictionary = bag_of_words(docs)\n", "\n", "print \"Bag of words representation of the first document (tuples are composed by token_id and multiplicity):\\n\", bow[0]\n", "print\n", "for i in range(5):\n", " print \"In the document, topic_id %d (word %s) appears %d time[s]\" %(bow[0][i][0], docs[0][bow[0][i][0]], bow[0][i][1])\n", "print \"...\"" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:gensim.models.ldamodel:too few updates, training might not converge; consider increasing the number of passes or iterations to improve accuracy\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Score: 0.990722\n", "Topic: 0.080*gnt1ip + 0.027*golgi + 0.027*mgat1 + 0.018*activity + 0.018*reduced + 0.018*inhibitory + 0.018*interaction + 0.018*fret + 0.018*expressed + 0.018*medial\n" ] } ], "source": [ "def lda_model(dictionary, bow):\n", " ldamodel = models.ldamodel.LdaModel(bow, num_topics=10, id2word=dictionary, passes=5)\n", " return ldamodel\n", "\n", "\n", "lda = lda_model(dictionary, bow)\n", "\n", "for index, score in sorted(lda[bow[1]], key=lambda tup: -1*tup[1]):\n", " print \"Score: %f\\nTopic: %s\" %(score, lda.print_topic(index, 10))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Score: 0.610076\n", " Topic: 0.044*melanoma + 0.039*catenin + 0.028*wnt + 0.023*fam129b + 0.017*cell\n", "Score: 0.328385\n", " Topic: 0.080*gnt1ip + 0.027*golgi + 0.027*mgat1 + 0.018*activity + 0.018*reduced\n" ] } ], "source": [ "# Try the model on another article abstract:\n", "\n", "burns2015 = \"\"\"Duplication of the yeast centrosome (called the spindle pole body, SPB) is thought to occur through a series of discrete steps that culminate in insertion of the new SPB into the nuclear envelope (NE). \n", " To better understand this process, we developed a novel two-color structured illumination microscopy with single-particle averaging (SPA-SIM) approach to study the localization of all 18 SPB components during duplication using endogenously expressed fluorescent protein derivatives. \n", " The increased resolution and quantitative intensity information obtained using this method allowed us to demonstrate that SPB duplication begins by formation of an asymmetric Sfi1 filament at mitotic exit followed by Mps1-dependent assembly of a Spc29- and Spc42-dependent complex at its tip. \n", " Our observation that proteins involved in membrane insertion, such as Mps2, Bbp1, and Ndc1, also accumulate at the new SPB early in duplication suggests that SPB assembly and NE insertion are coupled events during SPB formation in wild-type cells.\"\"\"\n", "\n", "burns2015_tokens = lemmatize_tokens(get_tokens(parse_text(burns2015)))\n", "\n", "bow_vector = dictionary.doc2bow(burns2015_tokens)\n", "for index, score in sorted(lda[bow_vector], key=lambda tup: -1*tup[1]):\n", " print \"Score: %f\\n Topic: %s\" %(score, lda.print_topic(index, 5))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:gensim.models.ldamodel:too few updates, training might not converge; consider increasing the number of passes or iterations to improve accuracy\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "There are 67 articles in this folder.\n", "\n", "Article elife00772.txt\n", " Score: 0.999293 - Topic: 0.054*cell + 0.009*protein + 0.008*figure + 0.008*pom1 + 0.007*gfp + 0.005*membrane + 0.005*pom1p + 0.005*strain + 0.005*time + 0.005*intensity\n", "\n", "Article elife00654.txt\n", " Score: 0.999173 - Topic: 0.020*protein + 0.019*cell + 0.012*membrane + 0.007*cavin + 0.006*figure + 0.006*ap2 + 0.006*cargo + 0.006*ift + 0.005*function + 0.005*cilium\n", "\n", "Article elife02137.txt\n", " Score: 0.863058 - Topic: 0.022*cell + 0.011*protein + 0.010*cenp + 0.010*redox + 0.010*aging + 0.008*figure + 0.008*oxidation + 0.008*nadph + 0.008*yeast + 0.007*level\n", "\n", "Article elife02137.txt\n", " Score: 0.082134 - Topic: 0.020*protein + 0.019*cell + 0.012*membrane + 0.007*cavin + 0.006*figure + 0.006*ap2 + 0.006*cargo + 0.006*ift + 0.005*function + 0.005*cilium\n", "\n", "Article elife02137.txt\n", " Score: 0.053982 - Topic: 0.054*cell + 0.009*protein + 0.008*figure + 0.008*pom1 + 0.007*gfp + 0.005*membrane + 0.005*pom1p + 0.005*strain + 0.005*time + 0.005*intensity\n", "\n", "Article elife03083.txt\n", " Score: 0.998843 - Topic: 0.054*cell + 0.009*protein + 0.008*figure + 0.008*pom1 + 0.007*gfp + 0.005*membrane + 0.005*pom1p + 0.005*strain + 0.005*time + 0.005*intensity\n", "\n", "Article elife06156.txt\n", " Score: 0.998976 - Topic: 0.029*cell + 0.029*cln3 + 0.014*length + 0.013*whi5 + 0.012*start + 0.011*1—figure + 0.011*supplement + 0.011*decision + 0.009*signal + 0.009*http\n", "\n" ] } ], "source": [ "def prepare_text_for_lda(text):\n", " # Clean\n", " doc = [text.replace(unicode(i), spe_char.get(i)) for i in text if i in spe_char.keys()] or [text]\n", " # Tokenise\n", " texts = doc[0].lower().replace('\\n', ' ').replace('/', ' ').replace('-', ' ').split(' ')\n", " # Remove punctuation and stop words\n", " tokens = [filter(lambda x:x not in string.punctuation, i)\n", " for i in texts if i != '' and i not in STOPWORDS]\n", " tokens_cleaned = [i for i in tokens if len(i) > 2 and not i.isdigit()]\n", " # Lemmatise\n", " lmtzr = WordNetLemmatizer()\n", " lemmatised_text = [lmtzr.lemmatize(t) for t in tokens_cleaned]\n", " return lemmatised_text\n", "\n", "\n", "def parse_from_file(text_file):\n", " \"Retrieves the content of a text file\"\n", " with codecs.open(text_file, mode='r', encoding='utf-8') as f:\n", " reader = f.read()\n", " return reader\n", "\n", " \n", "from os import listdir\n", "from os.path import isfile, join\n", "\n", "# Gather the articles\n", "filepath = \"../articles/Cell biology/\"\n", "articles = [f for f in listdir(filepath) if isfile(join(filepath, f))] or []\n", "print \"There are %d articles in this folder.\\n\" % len(articles)\n", "\n", "# Create a corpus\n", "corpus = [prepare_text_for_lda(parse_from_file(filepath + a)) for a in articles[:45]]\n", "\n", "articles_bow, articles_dict = bag_of_words(corpus)\n", "\n", "articles_lda = lda_model(articles_dict, articles_bow)\n", "\n", "for i in range(5):\n", " for index, score in sorted(articles_lda[articles_bow[i]], key=lambda tup: -1*tup[1]):\n", " print \"Article %s\\n Score: %f - Topic: %s\\n\" %(articles[i], score, articles_lda.print_topic(index, 10))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cell biol article:\n", "elife03307.txt\n", "\n", "Score: 0.999176\n", "Topic: 0.054*cell + 0.009*protein + 0.008*figure + 0.008*pom1 + 0.007*gfp + 0.005*membrane + 0.005*pom1p + 0.005*strain + 0.005*time + 0.005*intensity\n", "\n", "----------------------------------------------------------------------\n", "Neuro article:\n", "elife05438.txt\n", "\n", "Score: 0.364755\n", "Topic: 0.020*protein + 0.019*cell + 0.012*membrane + 0.007*cavin + 0.006*figure + 0.006*ap2 + 0.006*cargo + 0.006*ift + 0.005*function + 0.005*cilium\n", "\n", "Score: 0.336101\n", "Topic: 0.054*cell + 0.009*protein + 0.008*figure + 0.008*pom1 + 0.007*gfp + 0.005*membrane + 0.005*pom1p + 0.005*strain + 0.005*time + 0.005*intensity\n", "\n", "Score: 0.111372\n", "Topic: 0.028*micos + 0.016*complex + 0.016*protein + 0.015*cell + 0.015*qil1 + 0.013*mitochondrial + 0.012*figure + 0.011*membrane + 0.010*cristae + 0.010*subunit\n", "\n", "Score: 0.055396\n", "Topic: 0.016*usp13 + 0.014*protein + 0.014*chac1 + 0.012*glutathione + 0.011*expression + 0.011*usp5 + 0.008*tagged + 0.007*activity + 0.007*figure + 0.006*mouse\n", "\n", "Score: 0.046261\n", "Topic: 0.029*cell + 0.029*cln3 + 0.014*length + 0.013*whi5 + 0.012*start + 0.011*1—figure + 0.011*supplement + 0.011*decision + 0.009*signal + 0.009*http\n", "\n", "Score: 0.036583\n", "Topic: 0.046*snap + 0.031*cell + 0.027*alpha + 0.022*rnai + 0.017*soce + 0.013*orai1 + 0.012*stim1 + 0.009*calcium + 0.009*figure + 0.009*1—figure\n", "\n", "Score: 0.030731\n", "Topic: 0.012*cell + 0.009*alpha + 0.008*bpac + 0.008*tnf + 0.007*figure + 0.007*protein + 0.007*control + 0.006*cftr + 0.005*expression + 0.005*golgi\n", "\n", "Score: 0.018469\n", "Topic: 0.022*cell + 0.011*protein + 0.010*cenp + 0.010*redox + 0.010*aging + 0.008*figure + 0.008*oxidation + 0.008*nadph + 0.008*yeast + 0.007*level\n" ] } ], "source": [ "print \"Cell biol article:\"\n", "cb_article = articles[50]\n", "print cb_article\n", "\n", "cb_tokens = prepare_text_for_lda(parse_from_file(filepath + cb_article))\n", "\n", "cb_bow = articles_dict.doc2bow(cb_tokens)\n", "\n", "for index, score in sorted(articles_lda[cb_bow], key=lambda tup: -1*tup[1]):\n", " print \"\\nScore: %f\\nTopic: %s\\n\" %(score, articles_lda.print_topic(index, 10))\n", " \n", "print \"-\" * 70\n", "print \"Neuro article:\" \n", "filepath_ns = \"../articles/Neuroscience/\"\n", "articles_ns = [f for f in listdir(filepath_ns) if isfile(join(filepath_ns, f))] or []\n", "\n", "ns_article = articles_ns[0]\n", "print ns_article\n", "\n", "ns_tokens = prepare_text_for_lda(parse_from_file(filepath_ns + ns_article))\n", "\n", "ns_bow = articles_dict.doc2bow(ns_tokens)\n", "\n", "for index, score in sorted(articles_lda[ns_bow], key=lambda tup: -1*tup[1]):\n", " print \"\\nScore: %f\\nTopic: %s\" %(score, articles_lda.print_topic(index, 10))" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "slide" } }, "source": [ "1- Who I am\n", "\n", "2- Goal of this project\n", "\n", "3- My plan\n", "\n", "4- First iteration\n", "\n", "5- Improvements\n", "\n", "6- Second iteration\n", "\n", "__7- Discussion__" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "####Discussion\n", "\n", "State of the project:\n", "\n", "* LDA seems like a good tool to compare articles on their content\n", "\n", "* Next step: train lda model on different types of articles\n", "\n", "* Idea: use the number of topics to evalute the proximity with a subject\n", "\n", "_______\n", "\n", "\n", "Tools used:\n", "\n", "* Python 2.7 and iPython notebook\n", "* Nltk library for natural text processing (nlp)\n", "* Gensim library for nlp and topic modeling\n", "* Scikit-learn library for Machine Learning" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##That's all folks!\n", "\n", "
\n", "####Questions and suggestions welcome =)\n", "\n", "
\n", "####@EleonoreMayola\n", "
\n", "github.com/Eleonore9/get-articles-meaning" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "s = \"\"\"\n", "\n", "\n", "\"\"\"\n", "display(HTML(s))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }