{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Topic modelling with Spacy, Gensim and Textacy\n",
"By Max Munnecke, @maxmunnecke\n",
"\n",
"This notebook consists of following sections:\n",
"- Initialize: Setting up environment and loading data.\n",
"- Text extraction. Phrase and tokens extraction with Gensim and Spacy.\n",
"- Topic modelling. Using Textacy's LDA model.\n",
"- Data processing. Calculating data for visualization and export.\n",
"- Model evaluation. A collection of visualizations of the resulting topics.\n",
"- Export data. The data can be used for creating more visualization or import into a graph.\n",
"\n",
"General concept: \n",
"The emphasis in this notebook is on facilitating an iterative process where you can easily adjust stopwords and number of topics. Furthermore it contains features to re-focus on sub topics and thereby create a hierachy of topics."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## INITIALIZE\n",
"### Load environment"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# Load packages\n",
"import spacy\n",
"nlp = spacy.load(\"en\")\n",
"import textacy # 0.5.0, does not work with 0.6.0.\n",
"import textacy.datasets\n",
"import textacy.fileio\n",
"import matplotlib.pyplot as plt\n",
"import json # write to disk\n",
"import pandas as pd\n",
"%matplotlib inline\n",
"# nlp = spacy.load(\"en\") # Download spacy english vocabulary: `python -m spacy download en`\n",
"\n",
"import os, re, sys\n",
"import warnings\n",
"warnings.filterwarnings('ignore') # Let's not pay heed to them right now\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"cwd : /home/jovyan/work/prj-bib/tb/nlp\n",
"sys : sys.version_info(major=3, minor=6, micro=3, releaselevel='final', serial=0)\n",
"spacy : 2.0.8\n",
"textacy : 0.5.0\n"
]
}
],
"source": [
"# Log environment\n",
"print(\"cwd : \" + os.getcwd())\n",
"print(\"sys : \" + str(sys.version_info))\n",
"print(\"spacy : \"+ spacy.__version__)\n",
"print(\"textacy : \"+ textacy.__version__)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Set global variables and load data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"SET Change 'outroot' to reflect current investigation
"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"docs = [ str(a_) + \". \" + str(b_) for a_,b_ in zip(data['title'], data['abstract'])]\n",
"# Converting '-' to '_' to make sure that terms are not split up during subsequent Gensim and Textacy manipulation.\n",
"docs = [re.sub(r'\\b-\\b', '_', text) for text in docs] # Should not be touched as it is referenced later."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## TEXT EXTRACTION\n",
"### Find phrases\n",
"Concept: Identify freqent phrases and glue them together with an underscore \"_\".\n",
"\n",
"Inspiration: *Phrase model for bi- and tri-gram with Gensim: https://github.com/skipgram/modern-nlp-in-python/blob/master/executable/Modern_NLP_in_Python.ipynb\n",
"Other source: https://github.com/bhargavvader/personal/blob/master/notebooks/text_analysis_tutorial/topic_modelling.ipynb\n",
"#### Train phrase model"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"import re\n",
"import gensim\n",
"\n",
"# Split pargraph into sentences\n",
"grap_sentence = re.compile(r'(?\n",
"SET Stopwords. Topic and sub-topic specific words. As well as artifacts not captured by standard `is_stop` property."
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [],
"source": [
"# EXACT nlp object. Names, organisations etc.\n",
"exact_stop = 'someword'.split()\n",
"for w in exact_stop:\n",
" lexeme = nlp.vocab[w]\n",
" lexeme.is_stop = True\n",
"\n",
"# LOWERCASE in list. Safe choice.\n",
"lower_stop = ('the to a an background objective').lower().split()\n",
"\n",
"# LEMMA in list. Powerful\n",
"topic_stop = 'tb mdr mdr_tb tuberculosis'.split()\n",
"subtopic_stop = ''.split('|')\n",
"artifact = ['-PRON-','=', '+', 'in']\n",
"\n",
"lemma_stop = [item.strip() for item in (topic_stop + subtopic_stop + artifact)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Filter text\n",
"Overview of all token attributes: https://github.com/explosion/spaCy/blob/master/spacy/attrs.pyx"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['repurpos', 'revival', 'drug', 'new', 'approach', 'combat', 'drug_resistant', 'emergence', 'drug_resistant', 'like', 'multi_drug_resistant', 'extensively_drug_resistant', 'xdr_tb', 'totally', 'drug_resistant', 'tdr_tb', 'create', 'new', 'challenge', 'fight', 'bad', 'bug', 'mycobacterium', 'repurposing', 'revival', 'drug', 'new', 'trend', 'option', 'combat', 'worsen', 'situation', 'antibiotic', 'resistance', 'era', 'situation', 'global', 'emergency', 'bactericidal', 'synergistic', 'effect', 'repurpos', 'revive', 'drug', 'late', 'drug', 'bedaquiline', 'delamanid', 'treatment', 'xdr_tb', 'tdr_tb', 'choice', 'future', 'promising', 'combinatorial', 'chemotherapy', 'bad', 'bug']\n"
]
}
],
"source": [
"docs_tokens, tokens_tmp = [], []\n",
"for item in docs_phrased:\n",
" doc = nlp(item)\n",
" for w in doc:\n",
" # Filter away line endings,nlp stopwords, numbers and words in lists\n",
" if not (w.text == '\\n' or w.is_stop or w.is_punct or w.like_num or w.lemma_ in lemma_stop or w.text.lower() in lower_stop):\n",
" tokens_tmp.append(w.lemma_)\n",
" docs_tokens.append(tokens_tmp)\n",
" tokens_tmp = []\n",
"# check\n",
"print(docs_tokens[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## TOPIC MODELLING\n",
"We use Textacy because it has a nice suite of functions for topic modelling and connects with both termite and pyLDAvis"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {},
"outputs": [],
"source": [
"vectorizer = textacy.Vectorizer(\n",
" weighting='tf', normalize=False, smooth_idf=True,\n",
" min_df=3, max_df=0.95, max_n_terms=10000)"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [],
"source": [
"# Document-Term Matrix\n",
"doc_term_matrix = vectorizer.fit_transform(docs_tokens)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"SET Number of topics to model. Start with a larger number (10-20) and narrow down in subsequent iterations.
"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/lib/python3.6/site-packages/sklearn/decomposition/online_lda.py:294: DeprecationWarning: n_topics has been renamed to n_components in version 0.19 and will be removed in 0.21\n",
" DeprecationWarning)\n"
]
}
],
"source": [
"# SET\n",
"no_topics=6\n",
"model = textacy.tm.TopicModel('lda', n_topics=no_topics) # `n_components=x` is not being registered in 19.1 version\n",
"model.fit(doc_term_matrix)"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2101, 6)"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Document-Topic Matrix\n",
"doc_topic_matrix = model.transform(doc_term_matrix)\n",
"# check\n",
"doc_topic_matrix.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## DATA PROCESSING"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Topic/Term distribution"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {},
"outputs": [],
"source": [
"topic_weight_serie = pd.Series(model.topic_weights(doc_topic_matrix))"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {},
"outputs": [],
"source": [
"# convert list of terms to text string\n",
"topic_term_list = [\"| \"+\" | \".join(x[1])+\" |\" for x in model.top_topic_terms(vectorizer.id_to_term, topics=-1)]"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {},
"outputs": [],
"source": [
"# Creating a dataframe from a list of series so the order is perserved. Dictionaries (including OrderDicts) move columns around.\n",
"series_list_tmp = [ pd.Series(range(len(topic_weight_serie)),name='topic_id'), pd.Series(topic_term_list, name='terms'), topic_weight_serie.rename('weight')]\n",
"topic_term_df = pd.concat(series_list_tmp, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {},
"outputs": [],
"source": [
"# Insert a column in a particular position. NB: 'rank' returns the type of the column being ranked. is in this case converted to integer.\n",
"topic_term_df.insert(0, 'rank', topic_term_df['weight'].rank(ascending=False).astype(int))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Topic Weight Chart"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"ax1 = fig.add_subplot(111)\n",
"bars = ax1.bar(range(len(topic_weight_serie)),topic_weight_serie, color='c', edgecolor='black')\n",
"plt.savefig(outfolder + outroot +\"topic-weight.png\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Find top topics (= top_topic_list)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"SET Number of top topics to focus. The 'Topic Weight Chart' above may help deciding how many to include.
"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[5, 1, 2, 3]\n"
]
}
],
"source": [
"number_top_topics = 4 # max 6\n",
"top_list_tmp = topic_weight_serie.nlargest(n=number_top_topics)\n",
"top_topic_list = list(top_list_tmp.index)\n",
"print(top_topic_list)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Prepare Topic-Term visualization with Termite plot & pyLDAvis\n",
"- See all display options under 'viz.termite': https://www.pydoc.io/pypi/textacy-0.5.0/autoapi/tm/topic_model/index.html \n",
"- More options available with `draw_termite_plot` but not needed so far: https://www.pydoc.io/pypi/textacy-0.5.0/autoapi/viz/termite/index.html#module-viz.termite\n",
"- pyLDAvis based on calculated 'model' and 'doc_topic_matrix' https://github.com/chartbeat-labs/textacy/issues/28"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {},
"outputs": [],
"source": [
"# NB: `termite_plot` saves an image with option: `save='filename.png'\n",
"termite_file = outfolder + outroot +\"termite.png\""
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {},
"outputs": [],
"source": [
"# Prepare pyLDAvis\n",
"import pyLDAvis\n",
"pyLDAvis.enable_notebook()\n",
"top_term_matrix = model.model.components_\n",
"doc_lengths = [len(d) for d in docs_tokens]\n",
"vocab = list(vectorizer.id_to_term.values())\n",
"term_frequency = textacy.vsm.get_term_freqs(doc_term_matrix)\n",
"vis_data = pyLDAvis.prepare(top_term_matrix,doc_topic_matrix,doc_lengths,vocab,term_frequency)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## MODEL EVALUATION\n",
"A number of visualizations are gathered in the following to give a comprehensive overview of the resulting topic model. "
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"05% #05 @00 | isolate | strain | cluster | beijing | pza | transmission | linezolid | patient | genotype | mycobacterium |\n",
"23% #02 @01 | isolate | resistance | drug | mutation | strain | mycobacterium | m. | study | resistant | gene |\n",
"17% #03 @02 | case | control | new | drug | child | disease | multidrug_resistant | infection | treatment | country |\n",
"12% #04 @03 | resistance | assay | detection | result | method | dst | test | rapid | rif | culture |\n",
"04% #06 @04 | patient | response | cell | pulmonary | therapy | level | lung | sputum | culture | blood |\n",
"36% #01 @05 | patient | treatment | drug | case | outcome | study | multidrug_resistant | resistance | result | regimen |\n"
]
}
],
"source": [
"for index, row in topic_term_df.iterrows():\n",
" print('%02d' % (row['weight']*100) +'%','#'+'%02d' % row['rank'],\"@\"+('%02d' % index), row['terms'])"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"grid = model.termite_plot(doc_term_matrix, vectorizer.id_to_term, highlight_topics=top_topic_list,\n",
" topics=-1, n_terms=30, sort_terms_by='seriation', save=termite_file)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"NOTE \"Termite Plot\" above assign random number to topic starting with (@00). \"pyLDAvis\" below ranks topic based on their weight in corpus starting with (#01)
\n",
"NOTE The above visualizations may inspire you to iteratively adjust stopwords, number of topics or number of topics in focus. Once you have a satisfying result you can proceed with the following export of data
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## EXPORT DATA\n",
"\n",
"NB: Termite plot is saved every time it is generated. \n",
"NB: Textacy has functions to save the trained model (`model.save` and `textacy.tm.TopicModel.load`)."
]
},
{
"cell_type": "code",
"execution_count": 103,
"metadata": {},
"outputs": [],
"source": [
"# Export topic_term_df\n",
"topic_term_df.to_csv(outfolder + outroot +'topic-term-df.tsv', encoding='UTF-8', header=True, index=False, sep='\\t')"
]
},
{
"cell_type": "code",
"execution_count": 104,
"metadata": {},
"outputs": [],
"source": [
"# pyLDAvis visualization\n",
"pyldavis_file = outfolder + outroot +\"pyldavis.html\"\n",
"pyLDAvis.save_html(vis_data,pyldavis_file)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Document/Topic all-weights (..doc-topic-weight.tsv)\n",
"Merging the docs id with the generated doc_topic_matrix makes it possible to search the content. These are standard functions in Textacy, but we might as well practice our skills in manipulating pandas. \n",
"Get topics for uid with `doc_topic_df.loc['10.1038_emi.2017.83'].nlargest(n=3)`\n",
"Load again with `loaded_df = pd.read_csv(open(r'...doc-topic-weight.tsv',encoding='UTF-8'),sep='\\t', index_col=0)`"
]
},
{
"cell_type": "code",
"execution_count": 105,
"metadata": {},
"outputs": [],
"source": [
"# Write Document-Topic Matrix\n",
"doc_topic_df = pd.DataFrame(data=doc_topic_matrix, # values\n",
" index=data.index, # 1st column as index\n",
" columns=list(range(doc_topic_matrix.shape[1]))) # 1st row as the column names"
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
0
\n",
"
1
\n",
"
2
\n",
"
3
\n",
"
4
\n",
"
\n",
"
\n",
"
pub-uid
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
10.1038_s41598_017_17705_3
\n",
"
0.072527
\n",
"
0.098516
\n",
"
0.166856
\n",
"
0.355275
\n",
"
0.001497
\n",
"
\n",
"
\n",
"
10.3389_fmicb.2017.02452
\n",
"
0.061662
\n",
"
0.328028
\n",
"
0.600453
\n",
"
0.003277
\n",
"
0.003282
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 1 2 3 4\n",
"pub-uid \n",
"10.1038_s41598_017_17705_3 0.072527 0.098516 0.166856 0.355275 0.001497\n",
"10.3389_fmicb.2017.02452 0.061662 0.328028 0.600453 0.003277 0.003282"
]
},
"execution_count": 106,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"doc_topic_df.to_csv(outfolder + outroot +'doc-topic-weight.tsv', encoding='UTF-8', header=True, index=True, sep='\\t')\n",
"# Check df\n",
"doc_topic_df.iloc[:2,:5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Document/Topic top-weights (..doc-topic-top.json)\n",
"Comments: 'model.top_doc_topics' generates a row number and a tuple containing pairs of topic:weight. Row number is used to get 'uid'. Tuple is made into a list of list and the values are converted from numpy to python objects."
]
},
{
"cell_type": "code",
"execution_count": 107,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[['10.1038_s41598_017_17705_3', [[3, 0.36], [5, 0.31], [2, 0.17]]],\n",
" ['10.3389_fmicb.2017.02452', [[2, 0.6], [1, 0.33], [0, 0.06]]]]"
]
},
"execution_count": 107,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"generator = model.top_doc_topics(doc_topic_matrix, docs=-1, top_n=3, weights=True)\n",
"doc_topic_top3 = [[data.index[doc_idx],[[x.item(),round(y.item(),2)] for x,y in topics]] for doc_idx, topics in generator]\n",
"with open(outfolder + outroot +'doc-topic-top3.json', 'w') as outfile:\n",
" json.dump(doc_topic_top3, outfile)\n",
"doc_topic_top3[:2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Topic-Term Matrix with weights\n"
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [],
"source": [
"topic_term_list = list(model.top_topic_terms(vectorizer.id_to_term, topics=-1, top_n=10, weights=True))\n",
"with open(outfolder + outroot +'topic-term-weight.json', 'w') as outfile:\n",
" json.dump(topic_term_list, outfile)"
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [],
"source": [
"# Topic Aggregated Weight (list with one number per topic)\n",
"with open(outfolder + outroot + 'topic-aggregated-weight.tsv', 'w') as f:\n",
" f.write(\"\\n\".join([str(x) for x in topic_weight_serie]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Word cloud (..wordcloud.txt)\n",
"No satisfactory packages exist for making word clouds in Python from a topic-term frequency list. Below a text file is generated with the data needed for creating word clouds at https://worditout.com/word-cloud/create. I recommend the following settings; font:sans-serif, colours: #ff8000 - #40bfbf, background:#242424, colour blending: rainbow, vary-word-colour: frequency, aspect ration 16/9, differences:big, vary-word-size: frequency"
]
},
{
"cell_type": "code",
"execution_count": 110,
"metadata": {},
"outputs": [],
"source": [
"with open(str(outfolder + outroot + 'wordcloud.txt'), 'w') as f: \n",
" for topic_tmp in topic_term_list:\n",
" f.write(\"==== #\" + str(topic_tmp[0])+\"\\n\")\n",
" for x in topic_tmp[1]:\n",
" (a,b) = x\n",
" f.write(str(a) + \":\" + str(int(b))+\"\\n\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Top articles for each topic (..doc-topic-abstract.html)"
]
},
{
"cell_type": "code",
"execution_count": 111,
"metadata": {},
"outputs": [],
"source": [
"cutoff = 15 # How many top articles should be displayed for each topic\n",
"top_overview = [] # list of topics containing each a list of top articles.\n",
"for topic in range(no_topics):\n",
" top_overview.append([topic,[[x,'%.2f' % y] for (x,y) in doc_topic_df[topic].nlargest(n=cutoff).iteritems()]])"
]
},
{
"cell_type": "code",
"execution_count": 112,
"metadata": {},
"outputs": [],
"source": [
"with open(str(outfolder + outroot + 'doc-top.html'), 'w') as f: \n",
" f.write('\\nTop Documents')\n",
" for topic in top_overview:\n",
" # print top topic titles\n",
" f.write('
Topic number %s
' % (topic[0]))\n",
" for item in topic[1]:\n",
" #look-up title\n",
" uid = item[0]\n",
" url = uid.replace('_','/')\n",
" weight = item[1]\n",
" # Find row and transpose the first row to a Serie with column names as index. \n",
" row = data.loc[uid]\n",
" f.write('
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Save dataframe for exploring sub-themes\n",
"When a main theme has been explored, a dataframe may be exported containing the combined data and the doc_topic_df, so it is possible to drill into the individual topics and explore sub topics."
]
},
{
"cell_type": "code",
"execution_count": 113,
"metadata": {},
"outputs": [],
"source": [
"# Execute only for main\n",
"sub_topics = top_topic_list\n",
"data_topic = pd.concat([data,doc_topic_df], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 114,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
title
\n",
"
abstract
\n",
"
keywords
\n",
"
0
\n",
"
1
\n",
"
2
\n",
"
3
\n",
"
4
\n",
"
5
\n",
"
\n",
"
\n",
"
pub-uid
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
10.1038_s41598_017_17705_3
\n",
"
Culture and Next-generation sequencing-based d...
\n",
"
Djibouti is a small country in the Horn of Afr...
\n",
"
NaN
\n",
"
0.072527
\n",
"
0.098516
\n",
"
0.166856
\n",
"
0.355275
\n",
"
0.001497
\n",
"
0.305329
\n",
"
\n",
"
\n",
"
10.3389_fmicb.2017.02452
\n",
"
Repurposing and Revival of the Drugs: A New Ap...
\n",
"
Emergence of drug resistant tuberculosis like ...
\n",
"
drug resistance tuberculosis; repurposing; rev...
\n",
"
0.061662
\n",
"
0.328028
\n",
"
0.600453
\n",
"
0.003277
\n",
"
0.003282
\n",
"
0.003298
\n",
"
\n",
"
\n",
"
10.1007_s15010_017_1054_8
\n",
"
Outcomes of multidrug-resistant tuberculosis i...
\n",
"
The purpose of this study was to establish a b...
\n",
"
Zambia; Tuberculosis; MDR-TB; Drug resistance;...
\n",
"
0.001741
\n",
"
0.001742
\n",
"
0.001745
\n",
"
0.001759
\n",
"
0.001741
\n",
"
0.991272
\n",
"
\n",
"
\n",
"
10.1016_j.jgar.2017.07.002
\n",
"
Extensively drug-resistant tuberculosis (XDR-T...
\n",
"
Objectives: Extensively drug-resistant tubercu...
\n",
"
Mycobacterium tuberculosis; MDR-TB; XDR-TB; Ge...
\n",
"
0.001449
\n",
"
0.619068
\n",
"
0.188984
\n",
"
0.187598
\n",
"
0.001444
\n",
"
0.001456
\n",
"
\n",
"
\n",
"
10.1016_j.ijid.2017.09.019
\n",
"
Trends and characteristics of drug-resistant t...
\n",
"
Objectives: The aim of this study was to descr...
\n",
"
Multidrug-resistant tuberculosis; Primary tran...
\n",
"
0.001476
\n",
"
0.001476
\n",
"
0.293617
\n",
"
0.001471
\n",
"
0.001468
\n",
"
0.700492
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" title \\\n",
"pub-uid \n",
"10.1038_s41598_017_17705_3 Culture and Next-generation sequencing-based d... \n",
"10.3389_fmicb.2017.02452 Repurposing and Revival of the Drugs: A New Ap... \n",
"10.1007_s15010_017_1054_8 Outcomes of multidrug-resistant tuberculosis i... \n",
"10.1016_j.jgar.2017.07.002 Extensively drug-resistant tuberculosis (XDR-T... \n",
"10.1016_j.ijid.2017.09.019 Trends and characteristics of drug-resistant t... \n",
"\n",
" abstract \\\n",
"pub-uid \n",
"10.1038_s41598_017_17705_3 Djibouti is a small country in the Horn of Afr... \n",
"10.3389_fmicb.2017.02452 Emergence of drug resistant tuberculosis like ... \n",
"10.1007_s15010_017_1054_8 The purpose of this study was to establish a b... \n",
"10.1016_j.jgar.2017.07.002 Objectives: Extensively drug-resistant tubercu... \n",
"10.1016_j.ijid.2017.09.019 Objectives: The aim of this study was to descr... \n",
"\n",
" keywords \\\n",
"pub-uid \n",
"10.1038_s41598_017_17705_3 NaN \n",
"10.3389_fmicb.2017.02452 drug resistance tuberculosis; repurposing; rev... \n",
"10.1007_s15010_017_1054_8 Zambia; Tuberculosis; MDR-TB; Drug resistance;... \n",
"10.1016_j.jgar.2017.07.002 Mycobacterium tuberculosis; MDR-TB; XDR-TB; Ge... \n",
"10.1016_j.ijid.2017.09.019 Multidrug-resistant tuberculosis; Primary tran... \n",
"\n",
" 0 1 2 3 4 \\\n",
"pub-uid \n",
"10.1038_s41598_017_17705_3 0.072527 0.098516 0.166856 0.355275 0.001497 \n",
"10.3389_fmicb.2017.02452 0.061662 0.328028 0.600453 0.003277 0.003282 \n",
"10.1007_s15010_017_1054_8 0.001741 0.001742 0.001745 0.001759 0.001741 \n",
"10.1016_j.jgar.2017.07.002 0.001449 0.619068 0.188984 0.187598 0.001444 \n",
"10.1016_j.ijid.2017.09.019 0.001476 0.001476 0.293617 0.001471 0.001468 \n",
"\n",
" 5 \n",
"pub-uid \n",
"10.1038_s41598_017_17705_3 0.305329 \n",
"10.3389_fmicb.2017.02452 0.003298 \n",
"10.1007_s15010_017_1054_8 0.991272 \n",
"10.1016_j.jgar.2017.07.002 0.001456 \n",
"10.1016_j.ijid.2017.09.019 0.700492 "
]
},
"execution_count": 114,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_topic.head()"
]
},
{
"cell_type": "code",
"execution_count": 115,
"metadata": {},
"outputs": [],
"source": [
"data_topic.to_csv(outfolder + outroot +'data-topic-df.tsv', encoding='UTF-8', header=True, index=True, sep='\\t')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"