{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Natural Language Processing\n", "\n", "We will be using the venturebeat data that we have scrapped and stored. We will begin with loading the data, inspecting it and then convert text into numeric features. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1961, 4)\n" ] }, { "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", "
urlcategorytitletext
0https://venturebeat.com/2020/03/20/despite-set...AIDespite setbacks, coronavirus could hasten the...This week, nearly every major company developi...
1https://venturebeat.com/2020/03/19/sensor-towe...GamesSensor Tower: U.S. iPhone users spent about $5...U.S. iPhone users spent an average of about $5...
2https://venturebeat.com/2020/03/19/microsoft-u...GamesMicrosoft unveils DirectX 12 Ultimate with imp...Microsoft is moving on to the next generation ...
3https://venturebeat.com/2020/03/19/sea-of-star...GamesSea of Stars is a gorgeous retro-RPG from The ...Sabotage Studios announced Sea of Stars today,...
4https://venturebeat.com/2020/03/19/htc-holds-v...AR/VRHTC holds virtual media event, sends coronavir...HTC’s just-concluded Virtual Vive Ecosystem Co...
\n", "
" ], "text/plain": [ " url category \\\n", "0 https://venturebeat.com/2020/03/20/despite-set... AI \n", "1 https://venturebeat.com/2020/03/19/sensor-towe... Games \n", "2 https://venturebeat.com/2020/03/19/microsoft-u... Games \n", "3 https://venturebeat.com/2020/03/19/sea-of-star... Games \n", "4 https://venturebeat.com/2020/03/19/htc-holds-v... AR/VR \n", "\n", " title \\\n", "0 Despite setbacks, coronavirus could hasten the... \n", "1 Sensor Tower: U.S. iPhone users spent about $5... \n", "2 Microsoft unveils DirectX 12 Ultimate with imp... \n", "3 Sea of Stars is a gorgeous retro-RPG from The ... \n", "4 HTC holds virtual media event, sends coronavir... \n", "\n", " text \n", "0 This week, nearly every major company developi... \n", "1 U.S. iPhone users spent an average of about $5... \n", "2 Microsoft is moving on to the next generation ... \n", "3 Sabotage Studios announced Sea of Stars today,... \n", "4 HTC’s just-concluded Virtual Vive Ecosystem Co... " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('venturebeat2020.csv')\n", "print(df.shape)\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 1961 entries, 0 to 1960\n", "Data columns (total 4 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 url 1961 non-null object\n", " 1 category 1961 non-null object\n", " 2 title 1961 non-null object\n", " 3 text 1961 non-null object\n", "dtypes: object(4)\n", "memory usage: 61.4+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our task/problem here is to build a natural language processing model that can take the information of the article and determine the topic it belongs to. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "data = df.copy()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Data Preprocessing\n", "\n", "We can extract date, month and day from the url using regular expression and datatime functionalities. We can also add a length and nwords column that represent the number of characters and the number of words in the article text, respectively. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import re" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def extract_date(string):\n", " match = re.search(r'\\d{4}/\\d{1,2}/\\d{1,2}', str(string))\n", " return match.group() " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "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", "
urlcategorytitletextdatemonthdaylengthnwords
0https://venturebeat.com/2020/03/20/despite-set...AIDespite setbacks, coronavirus could hasten the...This week, nearly every major company developi...2020-03-2032064661011
1https://venturebeat.com/2020/03/19/sensor-towe...GamesSensor Tower: U.S. iPhone users spent about $5...U.S. iPhone users spent an average of about $5...2020-03-193191136200
2https://venturebeat.com/2020/03/19/microsoft-u...GamesMicrosoft unveils DirectX 12 Ultimate with imp...Microsoft is moving on to the next generation ...2020-03-193194731783
3https://venturebeat.com/2020/03/19/sea-of-star...GamesSea of Stars is a gorgeous retro-RPG from The ...Sabotage Studios announced Sea of Stars today,...2020-03-19319898156
4https://venturebeat.com/2020/03/19/htc-holds-v...AR/VRHTC holds virtual media event, sends coronavir...HTC’s just-concluded Virtual Vive Ecosystem Co...2020-03-193194030649
\n", "
" ], "text/plain": [ " url category \\\n", "0 https://venturebeat.com/2020/03/20/despite-set... AI \n", "1 https://venturebeat.com/2020/03/19/sensor-towe... Games \n", "2 https://venturebeat.com/2020/03/19/microsoft-u... Games \n", "3 https://venturebeat.com/2020/03/19/sea-of-star... Games \n", "4 https://venturebeat.com/2020/03/19/htc-holds-v... AR/VR \n", "\n", " title \\\n", "0 Despite setbacks, coronavirus could hasten the... \n", "1 Sensor Tower: U.S. iPhone users spent about $5... \n", "2 Microsoft unveils DirectX 12 Ultimate with imp... \n", "3 Sea of Stars is a gorgeous retro-RPG from The ... \n", "4 HTC holds virtual media event, sends coronavir... \n", "\n", " text date month day \\\n", "0 This week, nearly every major company developi... 2020-03-20 3 20 \n", "1 U.S. iPhone users spent an average of about $5... 2020-03-19 3 19 \n", "2 Microsoft is moving on to the next generation ... 2020-03-19 3 19 \n", "3 Sabotage Studios announced Sea of Stars today,... 2020-03-19 3 19 \n", "4 HTC’s just-concluded Virtual Vive Ecosystem Co... 2020-03-19 3 19 \n", "\n", " length nwords \n", "0 6466 1011 \n", "1 1136 200 \n", "2 4731 783 \n", "3 898 156 \n", "4 4030 649 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['date'] = pd.to_datetime(data['url'].apply(extract_date))\n", "data['month'] = data['date'].dt.month\n", "data['day'] = data['date'].dt.day\n", "\n", "data['length'] = data['text'].str.len()\n", "data['nwords'] = data['text'].str.split().str.len()\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Lexical diversity__ is one aspect of 'lexical richness' and refers to the ratio of different unique words to the total number of words. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", "
urlcategorytitletextdatemonthdaylengthnwordslex_div
0https://venturebeat.com/2020/03/20/despite-set...AIDespite setbacks, coronavirus could hasten the...This week, nearly every major company developi...2020-03-20320646610110.070227
1https://venturebeat.com/2020/03/19/sensor-towe...GamesSensor Tower: U.S. iPhone users spent about $5...U.S. iPhone users spent an average of about $5...2020-03-1931911362000.290000
2https://venturebeat.com/2020/03/19/microsoft-u...GamesMicrosoft unveils DirectX 12 Ultimate with imp...Microsoft is moving on to the next generation ...2020-03-1931947317830.067688
3https://venturebeat.com/2020/03/19/sea-of-star...GamesSea of Stars is a gorgeous retro-RPG from The ...Sabotage Studios announced Sea of Stars today,...2020-03-193198981560.352564
4https://venturebeat.com/2020/03/19/htc-holds-v...AR/VRHTC holds virtual media event, sends coronavir...HTC’s just-concluded Virtual Vive Ecosystem Co...2020-03-1931940306490.090909
\n", "
" ], "text/plain": [ " url category \\\n", "0 https://venturebeat.com/2020/03/20/despite-set... AI \n", "1 https://venturebeat.com/2020/03/19/sensor-towe... Games \n", "2 https://venturebeat.com/2020/03/19/microsoft-u... Games \n", "3 https://venturebeat.com/2020/03/19/sea-of-star... Games \n", "4 https://venturebeat.com/2020/03/19/htc-holds-v... AR/VR \n", "\n", " title \\\n", "0 Despite setbacks, coronavirus could hasten the... \n", "1 Sensor Tower: U.S. iPhone users spent about $5... \n", "2 Microsoft unveils DirectX 12 Ultimate with imp... \n", "3 Sea of Stars is a gorgeous retro-RPG from The ... \n", "4 HTC holds virtual media event, sends coronavir... \n", "\n", " text date month day \\\n", "0 This week, nearly every major company developi... 2020-03-20 3 20 \n", "1 U.S. iPhone users spent an average of about $5... 2020-03-19 3 19 \n", "2 Microsoft is moving on to the next generation ... 2020-03-19 3 19 \n", "3 Sabotage Studios announced Sea of Stars today,... 2020-03-19 3 19 \n", "4 HTC’s just-concluded Virtual Vive Ecosystem Co... 2020-03-19 3 19 \n", "\n", " length nwords lex_div \n", "0 6466 1011 0.070227 \n", "1 1136 200 0.290000 \n", "2 4731 783 0.067688 \n", "3 898 156 0.352564 \n", "4 4030 649 0.090909 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def lexical_diversity(text):\n", " return len( set(text) ) / len( text.split() )\n", "\n", "data['text'] = data['text'].astype(str)\n", "data['lex_div'] = data['text'].apply(lexical_diversity)\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1961\n" ] } ], "source": [ "corpus = data['text'].values.tolist()\n", "print(len(corpus))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1a. Tokenization\n", "\n", "Tokenization is the process of splitting text into meaningul elements called tokens." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "import nltk\n", "nltk.download('popular', quiet=True)\n", "from nltk import word_tokenize, wordpunct_tokenize" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['I', 'have', \"n't\", 'watched', 'the', 'show', 'at', 'the', 'theatre', '.']\n" ] } ], "source": [ "example = \"I haven't watched the show at the theatre.\"\n", "tokenized = nltk.word_tokenize(example)\n", "print(tokenized)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "['I', \"haven't\", 'watched', 'the', 'show', 'at', 'the', 'theatre.']" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "example.split()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['I', 'haven', \"'\", 't', 'watched', 'the', 'show', 'at', 'the', 'theatre', '.']\n" ] } ], "source": [ "print( wordpunct_tokenize(example) )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The simplest vector encoding model is to simply fill in the vector with the frequency of each word as it appears in the document. \n", "\n", "### 1b. Stopwords" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "from nltk.corpus import stopwords" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['I', 'have', \"n't\", 'watched', 'the', 'show', 'at', 'the', 'theatre', '.']\n", "[True, True, False, False, True, False, True, True, False, False]\n" ] } ], "source": [ "def is_stopword(token):\n", " stops = set(stopwords.words('english'))\n", " return token.lower() in stops\n", "\n", "print(tokenized)\n", "print( [ is_stopword(i) for i in tokenized])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['I', \"haven't\", 'watched', 'the', 'show', 'at', 'the', 'theatre.']\n", "[True, True, False, True, False, True, True, False]\n" ] } ], "source": [ "print(example.split() )\n", "print( [ is_stopword(i) for i in example.split()])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1c. Punctuations" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['I', 'have', \"n't\", 'watched', 'the', 'show', 'at', 'the', 'theatre', '.']\n", "[False, False, False, False, False, False, False, False, False, True]\n" ] } ], "source": [ "import unicodedata\n", "def is_punct(token):\n", " return all(unicodedata.category(char).startswith('P') for char in token)\n", "\n", "print(tokenized)\n", "print( [ is_punct(i) for i in tokenized])" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['I', 'haven', \"'\", 't', 'watched', 'the', 'show', 'at', 'the', 'theatre', '.']\n", "[False, False, True, False, False, False, False, False, False, False, True]\n" ] } ], "source": [ "print( wordpunct_tokenize(example) ) \n", "print( [ is_punct(i) for i in wordpunct_tokenize(example)] )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1d. Stemming" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "from nltk.stem import SnowballStemmer" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[\"I haven't watched the show at the theatre.\"]\n", "['I', 'have', \"n't\", 'watched', 'the', 'show', 'at', 'the', 'theatre', '.']\n", "['i', 'have', \"n't\", 'watch', 'the', 'show', 'at', 'the', 'theatr', '.']\n" ] } ], "source": [ "stemmer = SnowballStemmer('english')\n", "stemmed = [ stemmer.stem(token) for token in tokenized ]\n", "print( [example] )\n", "print(tokenized)\n", "print(stemmed)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "def normalizer(text):\n", " stem = nltk.stem.SnowballStemmer('english')\n", " text = text.lower()\n", " \n", " tokenized = []\n", " for token in nltk.word_tokenize(text):\n", " tokenized.append(stem.stem(token))\n", " \n", " tokenized = [token for token in tokenized \n", " if not is_punct(token) # remove tokens that are punctuations\n", " and not is_stopword(token) # remove stopwords\n", " and token.isascii() # remove non-english characters\n", " ]\n", " \n", " return ' '.join(tokenized) # join b/c we are inputting a list" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "I haven't watched the show at the theatre.\n", "---> n't watch show theatr\n" ] } ], "source": [ "print( example )\n", "print( '---> ' + normalizer(example) )" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This week, nearly every major company developing autonomous vehicles in the U.S. halted testing in an effort to stem the spread of COVID-19, which has sickened more than 250,000 people and killed over 10,000 around the world. Still some experts argue pandemics like COVID-19 should hasten the adoption of driverless vehicles for passenger pickup, transportation of goods, and more. Autonomous vehicles still require disinfection — which companies like Alphabet’s Waymo and KiwiBot are conducting manually with sanitation teams — but in some cases, self-driving cars and delivery robots might minimize the risk of spreading disease. In a climate of social distancing, when on-demand services from Instacart to GrubHub have taken steps to minimize human contact, one factor in driverless cars’ favor is that they don’t require a potentially sick person behind the wheel. Tellingly, on Monday, when Waymo grounded its commercial robotaxis with human safety drivers, it initially said it would continue \n" ] }, { "data": { "text/plain": [ "'week near everi major compani develop autonom vehicl u.s. halt test effort stem spread covid-19 sicken 250,000 peopl kill 10,000 around world still expert argu pandem like covid-19 hasten adopt driverless vehicl passeng pickup transport good autonom vehicl still requir disinfect compani like alphabet waymo kiwibot conduct manual sanit team case self-driv car deliveri robot might minim risk spread diseas climat social distanc on-demand servic instacart grubhub taken step minim human contact one factor driverless car favor requir potenti sick person behind wheel tell monday waymo ground commerci robotaxi human safeti driver initi said would continu oper driverless autonom car fleet peopl understand theori autonom vehicl reduc spread infect allow social distanc said amit nisenbaum ceo tactil mobil provid tactil data sens technolog allow autonom vehicl detect road bump curvatur hazard compani build fleet autonom vehicl develop solut guidelin general mainten clean steril keep strict clean '" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "norm_corpus = [ normalizer(i) for i in corpus ]\n", "print(corpus[0][:999])\n", "norm_corpus[0][:999]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1e. Lemmatization" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "from nltk import pos_tag\n", "from nltk.stem.wordnet import WordNetLemmatizer\n", "from nltk.corpus import wordnet as wn" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "def is_punct(token):\n", " return all(unicodedata.category(char).startswith('P') for char in token)\n", "\n", "def lemmatizer(token, postag):\n", " lemm = WordNetLemmatizer()\n", " tag= {\n", " 'N':wn.NOUN,\n", " 'V':wn.VERB,\n", " 'R':wn.ADV,\n", " 'J':wn.ADJ\n", " }.get(postag[0], wn.NOUN)\n", " \n", " return lemm.lemmatize(token, tag)\n", "\n", "def normalizer_lemm(text):\n", " \n", " tagged_tokenized = pos_tag(wordpunct_tokenize(text))\n", " \n", " tokenized = [ lemmatizer(token, tag).lower() \n", " for (token, tag) in tagged_tokenized\n", " if not is_punct(token) \n", " and token.isascii()\n", " ]\n", " \n", " # remove extended stopwords\n", " stop_words = stopwords.words('english')\n", " stop_words.extend(['game', 'compani'])\n", " stops = set(stop_words)\n", " tokenized = [token for token in tokenized if not token in stops]\n", " \n", " return ' '.join(tokenized) # join b/c we are inputting a list" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'week nearly every major company develop autonomous vehicle u halt test effort stem spread covid 19 sicken 250 000 people kill 10 000 around world still expert argue pandemic like covid 19 hasten adoption driverless vehicle passenger pickup transportation good autonomous vehicle still require disinfection company like alphabet waymo kiwibot conduct manually sanitation team case self drive car delivery robot might minimize risk spread disease climate social distancing demand service instacart grubhub take step minimize human contact one factor driverless car favor require potentially sick person behind wheel tellingly monday waymo ground commercial robotaxis human safety driver initially say would continue operate driverless autonomous car fleet people understand theory autonomous vehicle reduce spread infection allow social distancing say amit nisenbaum ceo tactile mobility provider tactile data sense technology allow autonomous vehicle detect road bump curvature hazard companies build'" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "normlemm_corpus = [ normalizer_lemm(i) for i in corpus ]\n", "normlemm_corpus[0][:999]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Feature Extraction: Vectorization\n", "\n", "The simplest vector encoding model is to simply fill in the vector with the frequency of each word as it appears in the document." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "from collections import defaultdict" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "defaultdict(int,\n", " {'I': 1,\n", " 'have': 1,\n", " \"n't\": 1,\n", " 'watched': 1,\n", " 'the': 2,\n", " 'show': 1,\n", " 'at': 1,\n", " 'theatre': 1,\n", " '.': 1})" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "words = defaultdict(int)\n", "for token in word_tokenize(example):\n", " words[token] += 1\n", "words " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " ### 2a. Count Vectorizer \n", " \n", " Scikit-Learn has a CountVectorizer transformer which does this for us easily. " ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "from sklearn.feature_extraction.text import CountVectorizer" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<1961x27030 sparse matrix of type ''\n", "\twith 485489 stored elements in Compressed Sparse Row format>" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vectorizer = CountVectorizer()\n", "vector = vectorizer.fit_transform(norm_corpus)\n", "vector" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0, 5, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", " ...,\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 1, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0]], dtype=int64)" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vector.toarray()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "27030\n" ] } ], "source": [ "features = vectorizer.get_feature_names()\n", "nfeatures = len(features)\n", "print(nfeatures)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'week': 26168,\n", " 'near': 16403,\n", " 'everi': 8893,\n", " 'major': 14831,\n", " 'compani': 5902,\n", " 'develop': 7347,\n", " 'autonom': 3174,\n", " 'vehicl': 25535,\n", " 'halt': 11092,\n", " 'test': 23835,\n", " 'effort': 8285,\n", " 'stem': 22765,\n", " 'spread': 22559,\n", " 'covid': 6368,\n", " '19': 323,\n", " 'sicken': 21748,\n", " '250': 707,\n", " '000': 1,\n", " 'peopl': 18033,\n", " 'kill': 13483,\n", " '10': 72,\n", " 'around': 2866,\n", " 'world': 26507,\n", " 'still': 22810,\n", " 'expert': 9009,\n", " 'argu': 2820,\n", " 'pandem': 17726,\n", " 'like': 14279,\n", " 'hasten': 11235,\n", " 'adopt': 1956,\n", " 'driverless': 7962,\n", " 'passeng': 17854,\n", " 'pickup': 18260,\n", " 'transport': 24421,\n", " 'good': 10645,\n", " 'requir': 20150,\n", " 'disinfect': 7596,\n", " 'alphabet': 2320,\n", " 'waymo': 26106,\n", " 'kiwibot': 13558,\n", " 'conduct': 6006,\n", " 'manual': 14936,\n", " 'sanit': 20913,\n", " 'team': 23629,\n", " 'case': 4900,\n", " 'self': 21319,\n", " 'driv': 7955,\n", " 'car': 4799,\n", " 'deliveri': 7172,\n", " 'robot': 20505,\n", " 'might': 15582,\n", " 'minim': 15673,\n", " 'risk': 20430,\n", " 'diseas': 7574,\n", " 'climat': 5570,\n", " 'social': 22203,\n", " 'distanc': 7654,\n", " 'on': 17174,\n", " 'demand': 7190,\n", " 'servic': 21430,\n", " 'instacart': 12552,\n", " 'grubhub': 10902,\n", " 'taken': 23489,\n", " 'step': 22770,\n", " 'human': 11856,\n", " 'contact': 6117,\n", " 'one': 17187,\n", " 'factor': 9137,\n", " 'favor': 9272,\n", " 'potenti': 18694,\n", " 'sick': 21747,\n", " 'person': 18105,\n", " 'behind': 3654,\n", " 'wheel': 26247,\n", " 'tell': 23731,\n", " 'monday': 15915,\n", " 'ground': 10881,\n", " 'commerci': 5856,\n", " 'robotaxi': 20506,\n", " 'safeti': 20810,\n", " 'driver': 7958,\n", " 'initi': 12469,\n", " 'said': 20824,\n", " 'would': 26534,\n", " 'continu': 6139,\n", " 'oper': 17269,\n", " 'fleet': 9577,\n", " 'understand': 24964,\n", " 'theori': 23918,\n", " 'reduc': 19868,\n", " 'infect': 12399,\n", " 'allow': 2292,\n", " 'amit': 2417,\n", " 'nisenbaum': 16690,\n", " 'ceo': 5078,\n", " 'tactil': 23457,\n", " 'mobil': 15841,\n", " 'provid': 19143,\n", " 'data': 6897,\n", " 'sens': 21361,\n", " 'technolog': 23660,\n", " 'detect': 7326,\n", " 'road': 20471,\n", " 'bump': 4505,\n", " 'curvatur': 6674,\n", " 'hazard': 11264,\n", " 'build': 4479,\n", " 'solut': 22272,\n", " 'guidelin': 10954,\n", " 'general': 10321,\n", " 'mainten': 14822,\n", " 'clean': 5521,\n", " 'steril': 22783,\n", " 'keep': 13363,\n", " 'strict': 22935,\n", " 'schedul': 21084,\n", " 'check': 5237,\n", " 'along': 2310,\n", " 'alreadi': 2328,\n", " 'exist': 8977,\n", " 'in': 12248,\n", " 'cabin': 4620,\n", " 'monitor': 15930,\n", " 'abl': 1738,\n", " 'handl': 11127,\n", " 'it': 12887,\n", " 'dmitri': 7715,\n", " 'polishchuk': 18567,\n", " 'head': 11292,\n", " 'yandex': 26736,\n", " 'believ': 3673,\n", " 'abil': 1737,\n", " 'appeal': 2689,\n", " 'well': 26195,\n", " 'rider': 20374,\n", " 'someth': 22289,\n", " 'point': 18538,\n", " 'declin': 7049,\n", " 'pick': 18254,\n", " 'intel': 12594,\n", " 'campus': 4712,\n", " 'chandler': 5159,\n", " 'arizona': 2838,\n", " 'hear': 11330,\n", " 'report': 20123,\n", " 'employe': 8506,\n", " 'posit': 18665,\n", " 'strong': 22953,\n", " 'motiv': 16034,\n", " 'us': 25327,\n", " 'told': 24198,\n", " 'venturebeat': 25565,\n", " 'via': 25635,\n", " 'email': 8440,\n", " 'take': 23486,\n", " 'precautionari': 18769,\n", " 'measur': 15232,\n", " 'make': 14838,\n", " 'ride': 20373,\n", " 'safe': 20803,\n", " 'possibl': 18672,\n", " 'cleanli': 5523,\n", " 'use': 25342,\n", " 'best': 3752,\n", " 'practic': 18733,\n", " 'appli': 2704,\n", " 'taxi': 23601,\n", " 'shar': 21542,\n", " 'services': 21435,\n", " 'cours': 6343,\n", " 'deploy': 7260,\n", " 'unlik': 25107,\n", " 'move': 16059,\n", " 'forward': 9791,\n", " 'short': 21670,\n", " 'term': 23807,\n", " 'paus': 17905,\n", " 'govern': 10695,\n", " 'focus': 9669,\n", " 'realloc': 19714,\n", " 'resourc': 20193,\n", " 'freez': 9901,\n", " 'budget': 4456,\n", " 'cope': 6204,\n", " 'fallout': 9179,\n", " 'time': 24095,\n", " 'ramp': 19571,\n", " 'necessari': 16413,\n", " 'legisl': 14079,\n", " 'get': 10398,\n", " 'even': 8879,\n", " 'vast': 25501,\n", " 'lack': 13814,\n", " 'access': 1799,\n", " 'instanc': 12557,\n", " 'public': 19207,\n", " 'live': 14389,\n", " 'onli': 17206,\n", " 'phoenix': 18214,\n", " 'limit': 14297,\n", " 'number': 16923,\n", " 'custom': 6684,\n", " 'moment': 15907,\n", " 'nuro': 16932,\n", " 'r2': 19471,\n", " 'exclus': 8956,\n", " 'carri': 4866,\n", " 'groceri': 10869,\n", " 'essenti': 8795,\n", " 'rather': 19631,\n", " 'occup': 17032,\n", " 'regul': 19949,\n", " 'shown': 21700,\n", " 'willing': 26364,\n", " 'cut': 6690,\n", " 'red': 19839,\n", " 'tape': 23559,\n", " 'rover': 20637,\n", " 'februari': 9303,\n", " 'receiv': 19776,\n", " 'first': 9508,\n", " 'exempt': 8964,\n", " 'depart': 7252,\n", " 'add': 1899,\n", " 'conveni': 6166,\n", " 'perceiv': 18041,\n", " 'without': 26424,\n", " 'trust': 24594,\n", " 'life': 14228,\n", " 'therein': 23932,\n", " 'lie': 14220,\n", " 'differ': 7456,\n", " 'accept': 1797,\n", " 'societi': 22207,\n", " 'much': 16104,\n", " 'faster': 9250,\n", " 'starship': 22694,\n", " 'sever': 21465,\n", " 'deliv': 7169,\n", " 'item': 12894,\n", " 'local': 14439,\n", " 'busi': 4553,\n", " 'observ': 17005,\n", " 'increas': 12312,\n", " 'order': 17332,\n", " 'volum': 25851,\n", " 'recent': 19780,\n", " 'earli': 8154,\n", " 'conclud': 5985,\n", " 'whether': 26262,\n", " 'relat': 19997,\n", " 'restaur': 20209,\n", " 'side': 21751,\n", " 'say': 21008,\n", " 'uptick': 25302,\n", " 'interest': 12624,\n", " 'citi': 5460,\n", " 'san': 20893,\n", " 'francisco': 9854,\n", " 'new': 16536,\n", " 'york': 26811,\n", " 'enact': 8523,\n", " 'mandatori': 14904,\n", " 'closur': 5612,\n", " 'shelter': 21591,\n", " 'plac': 18376,\n", " 'abov': 1751,\n", " 'fulli': 10018,\n", " 'jaguar': 12953,\n", " 'pac': 17652,\n", " 'electr': 8361,\n", " 'suv': 23300,\n", " 'nichola': 16617,\n", " 'farhi': 9226,\n", " 'partner': 17840,\n", " 'oc': 17020,\n", " 'strategi': 22899,\n", " 'consult': 6106,\n", " 'work': 26482,\n", " 'client': 5562,\n", " 'automot': 3169,\n", " 'think': 23964,\n", " 'chief': 5299,\n", " 'challeng': 5141,\n", " 'scale': 21027,\n", " 'meet': 15295,\n", " 'easier': 8176,\n", " 'hire': 11559,\n", " '100': 73,\n", " 'amazon': 2378,\n", " 'announc': 2562,\n", " 'notic': 16838,\n", " 'neolix': 16456,\n", " 'claim': 5481,\n", " 'mid': 15556,\n", " 'march': 14959,\n", " 'began': 3636,\n", " 'sanitari': 20914,\n", " 'suppli': 23228,\n", " 'mask': 15051,\n", " 'antibacteri': 2606,\n", " 'gel': 10305,\n", " 'hygien': 11926,\n", " 'product': 19002,\n", " 'communiti': 5893,\n", " 'berkeley': 3726,\n", " 'denver': 7245,\n", " 'alibaba': 2256,\n", " 'jd': 13016,\n", " 'com': 5818,\n", " 'ecommerc': 8218,\n", " 'book': 4129,\n", " '200': 422,\n", " 'last': 13923,\n", " 'two': 24734,\n", " 'month': 15958,\n", " '125': 174,\n", " 'may': 15136,\n", " '2019': 454,\n", " 'purchas': 19255,\n", " 'spur': 22579,\n", " 'chines': 5318,\n", " 'offer': 17071,\n", " 'subsid': 23056,\n", " '60': 1262,\n", " 'cost': 6293,\n", " 'anticip': 2609,\n", " 'bring': 4356,\n", " 'sale': 20846,\n", " 'van': 25463,\n", " 'end': 8546,\n", " 'year': 26760,\n", " 'china': 5315,\n", " 'medic': 15262,\n", " 'supplement': 23226,\n", " 'labor': 13801,\n", " 'shortag': 21671,\n", " 'area': 2812,\n", " 'hit': 11572,\n", " 'hardest': 11186,\n", " 'partnership': 17843,\n", " 'apollo': 2678,\n", " 'baidu': 3349,\n", " 'platform': 18415,\n", " 'also': 2330,\n", " 'food': 9703,\n", " 'health': 11317,\n", " 'worker': 26487,\n", " 'beij': 3660,\n", " 'care': 4820,\n", " 'fallen': 9175,\n", " 'ill': 12117,\n", " 'despit': 7311,\n", " 'obvious': 17019,\n", " 'advantag': 1978,\n", " 'dure': 8087,\n", " 'crisi': 6479,\n", " 'face': 9117,\n", " 'percept': 18045,\n", " 'battl': 3546,\n", " 'studi': 22975,\n", " 'publish': 19211,\n", " 'brook': 4397,\n", " 'institut': 12566,\n", " 'anoth': 2578,\n", " 'advoc': 1998,\n", " 'highway': 11529,\n", " 'auto': 3141,\n", " 'aha': 2114,\n", " 'found': 9801,\n", " 'convinc': 6176,\n", " 'respond': 20200,\n", " 'poll': 18572,\n", " 'inclin': 12288,\n", " 'almost': 2306,\n", " '70': 1373,\n", " 'survey': 23273,\n", " 'express': 9035,\n", " 'concern': 5978,\n", " 'share': 21546,\n", " 'reason': 19738,\n", " 'predict': 18797,\n", " 'happen': 11163,\n", " 'slowli': 22068,\n", " 'extrem': 9065,\n", " 'caution': 4976,\n", " 'thing': 23959,\n", " 'eventu': 8885,\n", " 'return': 20266,\n", " 'normal': 16798,\n", " 'mani': 14917,\n", " 'consum': 6108,\n", " 'wari': 26027,\n", " 'long': 14492,\n", " 'befor': 3631,\n", " 'beyond': 3776,\n", " 'recuper': 19833,\n", " 'frontier': 9969,\n", " 'tech': 23645,\n", " 'benefit': 3699,\n", " 'soon': 22314,\n", " 'hope': 11719,\n", " 'iphon': 12774,\n", " 'user': 25348,\n", " 'spent': 22471,\n", " 'averag': 3206,\n", " '53': 1170,\n", " '80': 1479,\n", " 'game': 10149,\n", " 'accord': 1814,\n", " 'sensor': 21373,\n", " 'tower': 24309,\n", " '22': 653,\n", " '2018': 453,\n", " 'app': 2682,\n", " 'spend': 22469,\n", " 'reach': 19682,\n", " 'largest': 13905,\n", " 'segment': 21301,\n", " 'repres': 20127,\n", " '54': 1180,\n", " 'growth': 10899,\n", " '2017': 452,\n", " 'saw': 21001,\n", " 'steadi': 22730,\n", " 'awhil': 3245,\n", " '2015': 450,\n", " 'sit': 21896,\n", " '23': 671,\n", " 'free': 9885,\n", " 'to': 24168,\n", " 'play': 18427,\n", " 'earn': 8160,\n", " '99': 1664,\n", " 'candi': 4727,\n", " 'crush': 6544,\n", " 'saga': 20815,\n", " 'top': 24243,\n", " 'among': 2428,\n", " 'minecraft': 15660,\n", " 'premium': 18839,\n", " 'titl': 24147,\n", " 'healthi': 11322,\n", " 'photo': 18223,\n", " 'video': 25662,\n", " 'categori': 4953,\n", " 'includ': 12289,\n", " 'youtub': 26836,\n", " 'editor': 8249,\n", " 'picsart': 18263,\n", " 'actual': 1879,\n", " 'eclips': 8210,\n", " 'less': 14133,\n", " '30': 812,\n", " 'massiv': 15064,\n", " '75': 1417,\n", " 'doe': 7754,\n", " 'money': 15921,\n", " 'rideshar': 20377,\n", " 'uber': 24771,\n", " 'commerc': 5855,\n", " 'store': 22857,\n", " 'microsoft': 15549,\n", " 'next': 16574,\n", " 'generat': 10325,\n", " 'directx': 7517,\n", " 'api': 2670,\n", " 'window': 26376,\n", " 'xbox': 26632,\n", " '12': 158,\n", " 'ultim': 24819,\n", " 'enabl': 8521,\n", " 'unlock': 25112,\n", " 'hardwar': 11189,\n", " 'featur': 9300,\n", " 'pc': 17947,\n", " 'seri': 21413,\n", " 'method': 15457,\n", " 'improv': 12241,\n", " 'visual': 25763,\n", " 'perform': 18063,\n", " 'name': 16274,\n", " 'built': 4485,\n", " 'attempt': 3064,\n", " 'togeth': 24185,\n", " 'cutting': 6697,\n", " 'edg': 8238,\n", " 'multipl': 16143,\n", " 'becaus': 3604,\n", " 'maintain': 14820,\n", " 'compat': 5912,\n", " 'older': 17126,\n", " 'gpus': 10711,\n", " 'consol': 6086,\n", " 'support': 23231,\n", " 'optim': 17302,\n", " 'proper': 19079,\n", " 'made': 14757,\n", " 'lead': 14008,\n", " 'virtuous': 25739,\n", " 'cycl': 6749,\n", " 'longer': 14495,\n", " 'hold': 11630,\n", " 'back': 3295,\n", " 'want': 26006,\n", " 'break': 4289,\n", " 'unifi': 25057,\n", " 'graphic': 10759,\n", " 'releas': 20007,\n", " 'million': 15633,\n", " 'dx12': 8116,\n", " 'card': 4808,\n", " 'set': 21442,\n", " 'catalyz': 4945,\n", " 'rapid': 19606,\n", " 'read': 19690,\n", " 'blog': 4019,\n", " 'post': 18674,\n", " 'wave': 26090,\n", " 'gamer': 10165,\n", " 'likewis': 14284,\n", " 'surg': 23255,\n", " 'capabl': 4764,\n", " 'hardware': 11190,\n", " 'let': 14139,\n", " 'dive': 7677,\n", " 'bake': 3364,\n", " 'ray': 19654,\n", " 'trace': 24328,\n", " 'gpu': 10710,\n", " 'simul': 21849,\n", " 'behavior': 3650,\n", " 'light': 14255,\n", " 'way': 26100,\n", " 'look': 14508,\n", " 'realist': 19706,\n", " 'give': 10499,\n", " 'control': 6160,\n", " 'creator': 6441,\n", " 'raytrac': 19658,\n", " 'call': 4675,\n", " 'ping': 18310,\n", " 'cpu': 6395,\n", " 'effici': 8279,\n", " 'engin': 8587,\n", " 'spool': 22542,\n", " 'shader': 21491,\n", " 'player': 18434,\n", " 'environ': 8660,\n", " 'choos': 5352,\n", " 'inlin': 12481,\n", " 'act': 1864,\n", " 'altern': 2336,\n", " 'dynam': 8126,\n", " 'model': 15860,\n", " 'system': 23424,\n", " 'calcul': 4657,\n", " 'depend': 7257,\n", " 'materi': 15085,\n", " 'sourc': 22357,\n", " 'artist': 2905,\n", " 'behav': 3649,\n", " 'note': 16833,\n", " 'confin': 6023,\n", " 'shadow': 21493,\n", " 'scenario': 21071,\n", " 'complex': 5934,\n", " 'run': 20709,\n", " 'better': 3765,\n", " 'dynamic': 8128,\n", " 'bas': 3502,\n", " 'oppos': 17290,\n", " 'shad': 21489,\n", " 'write': 26563,\n", " 'meanwhil': 15230,\n", " 'shade': 21490,\n", " 'and': 2481,\n", " 'or': 17317,\n", " 'veri': 25585,\n", " 'tracing': 24331,\n", " 'onc': 17178,\n", " 'nvidia': 16950,\n", " 'ensur': 8620,\n", " 'full': 10014,\n", " 'rtx': 20676,\n", " 'pile': 18288,\n", " 'lot': 14546,\n", " 'variabl': 25486,\n", " 'rate': 19628,\n", " 'process': 18985,\n", " 'tune': 24658,\n", " 'detail': 7324,\n", " 'certain': 5097,\n", " 'part': 17825,\n", " 'singl': 21871,\n", " 'frame': 9841,\n", " 'render': 20068,\n", " 'idea': 12036,\n", " 'power': 18707,\n", " 'draw': 7921,\n", " 'shadowi': 21497,\n", " 'room': 20585,\n", " 'realli': 19712,\n", " 'see': 21285,\n", " 'anyway': 2651,\n", " 'signific': 21800,\n", " 'mesh': 15423,\n", " 'big': 3821,\n", " 'geometri': 10366,\n", " 'pipelin': 18330,\n", " 'manag': 14887,\n", " 'level': 14149,\n", " 'of': 17063,\n", " 'put': 19284,\n", " 'simpli': 21842,\n", " 'across': 1862,\n", " 'group': 10888,\n", " 'flexibl': 9592,\n", " 'simpler': 21840,\n", " 'previous': 18908,\n", " 'tool': 24228,\n", " 'sampler': 20884,\n", " 'feedback': 9314,\n", " 'load': 14427,\n", " 'stutter': 22993,\n", " 'asset': 2977,\n", " 'determin': 7333,\n", " 'textur': 23864,\n", " 'need': 16422,\n", " 'ani': 2530,\n", " 'given': 10502,\n", " 'situat': 21904,\n", " 'sampl': 20882,\n", " 'inform': 12439,\n", " 'fed': 9306,\n", " 'stream': 22915,\n", " 'intellig': 12597,\n", " 'precis': 18774,\n", " 'decis': 7042,\n", " 'conjunct': 6046,\n", " 'd3d12': 6778,\n", " 'tile': 24088,\n", " 'larger': 13904,\n", " 'memory': 15364,\n", " 'final': 9449,\n", " 'texture': 23865,\n", " 'spac': 22378,\n", " 'complic': 5939,\n", " 'quicker': 19428,\n", " 'correct': 6265,\n", " 'due': 8037,\n", " 'expect': 8993,\n", " 'begin': 3639,\n", " 'roll': 20554,\n", " 'holiday': 11638,\n", " 'sabotag': 20785,\n", " 'studio': 22977,\n", " 'sea': 21228,\n", " 'star': 22682,\n", " 'today': 24180,\n", " 'role': 20551,\n", " 'inspir': 12547,\n", " '16': 256,\n", " 'bit': 3921,\n", " 'era': 8720,\n", " 'excel': 8944,\n", " 'action': 1865,\n", " 'sidescrol': 21759,\n", " 'messeng': 15431,\n", " 'favorit': 9273,\n", " 'fact': 9134,\n", " 'place': 18378,\n", " 'univers': 25094,\n", " 'stori': 22861,\n", " 'serv': 21425,\n", " 'prequel': 18857,\n", " 'turn': 24679,\n", " 'kickstart': 13469,\n", " 'crowdfund': 6528,\n", " 'goal': 10583,\n", " '90': 1597,\n", " '760': 1430,\n", " 'aim': 2135,\n", " '2022': 593,\n", " 'trailer': 24364,\n", " 'biggest': 3827,\n", " 'japanes': 12991,\n", " 'rpgs': 20654,\n", " '90s': 1606,\n", " 'chrono': 5388,\n", " 'trigger': 24507,\n", " 'super': 23170,\n", " 'mario': 14979,\n", " 'rpg': 20653,\n", " 'influenc': 12426,\n", " 'coupl': 6340,\n", " 'beauti': 3602,\n", " 'pixel': 18366,\n", " 'art': 2885,\n", " '2d': 789,\n", " 'often': 17097,\n", " 'retro': 20258,\n", " 'indi': 12338,\n", " 'rare': 19618,\n", " 'tackl': 23453,\n", " 'market': 14988,\n", " 'although': 2339,\n", " 'undertal': 24972,\n", " 'indivis': 12361,\n", " 'htc': 11810,\n", " 'just': 13210,\n", " 'virtual': 25736,\n", " 'vive': 25776,\n", " 'ecosystem': 8225,\n", " 'confer': 6011,\n", " 'event': 8880,\n", " 'industri': 12369,\n", " 'vr': 25893,\n", " 'replac': 20111,\n", " 'held': 11395,\n", " 'physic': 18239,\n", " 'instead': 12562,\n", " 'escap': 8761,\n", " 'global': 10541,\n", " 'coronavirus': 6253,\n", " 'attende': 3066,\n", " 'themselv': 23911,\n", " 'closer': 5609,\n", " 'thank': 23888,\n", " 'bizarr': 3936,\n", " 'four': 9811,\n", " 'hour': 11775,\n", " 'prior': 18941,\n", " 'shenzhen': 21598,\n", " 'venu': 25571,\n", " 'insid': 12531,\n", " 'engag': 8584,\n", " 'collabor': 5774,\n", " 'applic': 2707,\n", " 'oculus': 17048,\n", " 'valv': 25458,\n", " 'mix': 15793,\n", " 'realiti': 19708,\n", " 'headset': 11307,\n", " 'present': 18879,\n", " 'somewhat': 22292,\n", " 'spars': 22403,\n", " 'audienc': 3095,\n", " 'individu': 12358,\n", " '3d': 962,\n", " 'avatar': 3202,\n", " 'appear': 2690,\n", " 'outdoor': 17452,\n", " 'amphitheat': 2437,\n", " 'concret': 5992,\n", " 'bench': 3686,\n", " 'seat': 21249,\n", " 'follow': 9693,\n", " '15': 232,\n", " 'minut': 15696,\n", " 'sober': 22196,\n", " 'calm': 4684,\n", " 'speech': 22448,\n", " 'chairperson': 5133,\n", " 'cher': 5267,\n", " 'wang': 26004,\n", " 'yves': 26870,\n", " 'maitr': 14827,\n", " 'presid': 18884,\n", " 'alvin': 2357,\n", " 'graylin': 10786,\n", " 'took': 24227,\n", " 'stage': 22641,\n", " 'chide': 5298,\n", " 'rival': 20447,\n", " 'magic': 14779,\n", " 'leap': 14029,\n", " 'fail': 9151,\n", " 'fli': 9597,\n", " 'whale': 26237,\n", " 'tout': 24305,\n", " 'ar': 2755,\n", " 'promot': 19060,\n", " 'quit': 19449,\n", " 'either': 8329,\n", " 'opt': 17297,\n", " 'demonstr': 7215,\n", " 'high': 11520,\n", " 'unusu': 25234,\n", " 'discuss': 7572,\n", " 'impact': 12187,\n", " 'staff': 22638,\n", " 'particl': 17834,\n", " 'ask': 2955,\n", " 'pose': 18664,\n", " 'quick': 19424,\n", " 'selfi': 21320,\n", " 'float': 9613,\n", " 'pictur': 18266,\n", " 'guy': 11000,\n", " 'probabl': 18972,\n", " 'seen': 21293,\n", " 'imag': 12137,\n", " 'virus': 25742,\n", " 'larg': 13901,\n", " 'screen': 21181,\n", " 'never': 16531,\n", " 'could': 6311,\n", " 'balloon': 3395,\n", " 'lik': 14277,\n", " 'crowd': 6526,\n", " 'worri': 26518,\n", " 'go': 10580,\n", " 'hurt': 11891,\n", " 'prepar': 18849,\n", " 'issu': 12878,\n", " 'special': 22425,\n", " 'protect': 19114,\n", " 'gear': 10281,\n", " 'spoke': 22526,\n", " 'member': 15354,\n", " 'cover': 6360,\n", " 'outfit': 17458,\n", " 'came': 4698,\n", " 'hover': 11787,\n", " 'direct': 7510,\n", " 'front': 9963,\n", " 'show': 21694,\n", " 'wide': 26320,\n", " 'angl': 2522,\n", " 'shot': 21683,\n", " 'imagin': 12142,\n", " 'experi': 9001,\n", " 'viewer': 25678,\n", " 'perspect': 18110,\n", " 'type': 24749,\n", " 'futur': 10068,\n", " 'done': 7790,\n", " 'prospect': 19101,\n", " 'shock': 21643,\n", " 'random': 19585,\n", " 'unsettl': 25188,\n", " 'enough': 8608,\n", " 'went': 26204,\n", " 'memori': 15363,\n", " 'whi': 26263,\n", " 'littl': 14379,\n", " 'fun': 10022,\n", " 'right': 20393,\n", " 'now': 16872,\n", " 'standard': 22670,\n", " 'past': 17864,\n", " 'keynot': 13434,\n", " 'common': 5867,\n", " 'odd': 17050,\n", " 'glib': 10532,\n", " 'treatment': 24452,\n", " 'outbreak': 17442,\n", " 'particular': 17836,\n", " 'tone': 24220,\n", " 'deaf': 6987,\n", " 'mend': 15372,\n", " 'thousand': 23996,\n", " 'death': 7004,\n", " 'elsewher': 8428,\n", " 'job': 13092,\n", " 'loss': 14542,\n", " 'socioeconom': 22210,\n", " 'disrupt': 7637,\n", " 'histor': 11568,\n", " 'question': 19417,\n", " 'greater': 10794,\n", " 'import': 12223,\n", " 'wake': 25959,\n", " 'modest': 15868,\n", " 'grow': 10895,\n", " 'becom': 3609,\n", " 'comfort': 5839,\n", " 'softwar': 22233,\n", " 'moreov': 15993,\n", " 'suppos': 23232,\n", " 'particip': 17831,\n", " 'mass': 15057,\n", " 'gather': 10239,\n", " 'locat': 14443,\n", " 'captur': 4797,\n", " 'attent': 3068,\n", " 'conscious': 6070,\n", " 'digit': 7470,\n", " 'perfect': 18059,\n", " 'content': 6130,\n", " 'feel': 9316,\n", " 'uncomfort': 24894,\n", " 'abandon': 1714,\n", " 'real': 19701,\n", " 'research': 20160,\n", " 'describ': 7294,\n", " 'techniqu': 23658,\n", " 'knowledg': 13614,\n", " 'graph': 10756,\n", " 'entiti': 8637,\n", " 'align': 2260,\n", " 'entail': 8622,\n", " 'element': 8384,\n", " 'refer': 19891,\n", " 'anyth': 2647,\n", " 'song': 22301,\n", " 'comput': 5957,\n", " 'speed': 22451,\n", " 'rel': 19995,\n", " 'task': 23583,\n", " 'search': 21241,\n", " 'answer': 2586,\n", " 'alexa': 2236,\n", " '2020': 484,\n", " 'web': 26137,\n", " 'underpin': 24950,\n", " 'network': 16496,\n", " 'facebook': 9118,\n", " 'twitter': 24733,\n", " 'enterpris': 8625,\n", " 'organ': 17343,\n", " 'various': 25494,\n", " 'catalog': 4940,\n", " 'scientist': 21132,\n", " 'hao': 11159,\n", " 'wei': 26179,\n", " 'explain': 9013,\n", " 'mathemat': 15089,\n", " 'object': 16990,\n", " 'consist': 6084,\n", " 'node': 16733,\n", " 'relationship': 20001,\n", " 'easili': 8178,\n", " 'convent': 6167,\n", " 'databas': 6899,\n", " 'exampl': 8938,\n", " 'movi': 16062,\n", " 'actor': 1874,\n", " 'director': 7514,\n", " 'film': 9438,\n", " 'genr': 10343,\n", " 'expand': 8990,\n", " 'involv': 12741,\n", " 'integr': 12591,\n", " 'error': 8750,\n", " 'propos': 19088,\n", " 'neural': 16501,\n", " 'convert': 6171,\n", " 'fixed': 9542,\n", " 'length': 14115,\n", " 'vector': 25523,\n", " 'represent': 20128,\n", " 'attribut': 3080,\n", " 'consid': 6080,\n", " 'central': 5072,\n", " 'nearbi': 16404,\n", " 'produc': 18999,\n", " 'embed': 8450,\n", " 'concaten': 5965,\n", " 'sum': 23124,\n", " 'immedi': 12161,\n", " 'neighbor': 16440,\n", " 'addit': 1905,\n", " 'summat': 23134,\n", " 'secondari': 21261,\n", " 'upon': 25280,\n", " 'baselin': 3509,\n", " 'metric': 15463,\n", " 'precision': 18775,\n", " 'recal': 19764,\n", " 'curv': 6673,\n", " 'prauc': 18753,\n", " 'evalu': 8868,\n", " 'trade': 24346,\n", " 'off': 17067,\n", " 'true': 24579,\n", " 'neg': 16431,\n", " 'furthermor': 10058,\n", " 'compar': 5907,\n", " 'deepmatch': 7091,\n", " 'specif': 22428,\n", " 'design': 7300,\n", " 'scalabl': 21024,\n", " 'mind': 15654,\n", " 'train': 24366,\n", " '95': 1638,\n", " 'mainfram': 14813,\n", " 'rais': 19550,\n", " 'cloud': 5615,\n", " 'nat': 16331,\n", " 'financ': 9451,\n", " 'led': 14051,\n", " 'andreessen': 2495,\n", " 'horowitz': 11737,\n", " 'invest': 12721,\n", " 'riot': 20417,\n", " 'finnish': 9478,\n", " 'iceland': 12015,\n", " 'former': 9772,\n", " ...}" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vocab = vectorizer.vocabulary_\n", "vocab" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "from yellowbrick.text.freqdist import FreqDistVisualizer" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "image/png": "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/PLL2rt3r6RLIedGA1VsbKykSw+V+frrr3X//ffLz89Px48f15kzZ+RwOJz1/3ns6wXFZs2aacWKFbLZbMrNzdWyZcuc91PeiMDAQHl4eOiTTz5xXvemTZvUuHHjGz7GjR7rwIEDOnDggKRLD7W55557rhm9TUlJ0eDBg3X27FlJ0vr163X77berVKlSatGihf773/8qJydH58+f14YNG9SyZctr6ri8D82aNdNHH33kPN5///tflSxZ0jmaV7duXXXp0kW+vr6aPXu2JKlp06ZatmyZ88/S6NGj9cYbb/zttS9fvlwRERFq2rSphg4dqqZNmyo+Pv4f/4YAUFgwYggAJuPl5aU5c+Zo0qRJmj9/vnJycvTSSy8pODhYktS1a1d17txZVqtVlStXdu4XHh6uIUOG6NFHH5W/v7/uu+8+57pp06ZpwoQJatu2rbKzs/X444/riSeecE7/u55OnTrp2LFjCg0NlcPh0L333qvw8HBJl+4VLFGihHP65l/p1q2b3NzcnKNYl7+u4k9+fn7q27evunfvriJFijjv/5OkkJAQTZ48+YZ+t6ysLLVr1042m02jRo1yPgylU6dOevrpp1W2bFk9+OCDztBZvXp1Wa1WtW/fXjNmzHAep2/fvoqKitJTTz2lnJwc3XXXXRo9evQN1SBdGsWdM2eOJk6cqFmzZslut6t///5X9CMvjrVz506VKVNGb775po4dOyY/P78r7oX8U4MGDdSnTx917dpV7u7uKleunP7zn/9IuvRk199++01PPvmkbDabnnnmGd17773XHKNevXr6z3/+owEDBmj27Nnq3r27unXrptzcXPn5+emdd965YsTWYrEoMjJSTz31lB544AH169dPUVFRateunex2u2rXrq3hw4f/7bU/9dRT+vbbb9WmTRt5e3urYsWKzj9/AGBGFsfVc1QAAPjDxo0btWzZMkVHR+freX/77TeFh4dr48aNzumpyF9XP3EVAFC4MWIIAHApM2fO1OrVq/Xaa68RCgEAyCeMGAIAAACAyfHwGQAAAAAwOYIhAAAAAJicKe4xzM3NVXp6ujw9Pa95XxMAAAAAFHYOh0M2m03FihW74knPfzJFMExPT1dCQoLRZQAAAACAoWrUqCFfX99rlpsiGHp6ekq69CN4eXkZXA3+tG/fPtWtW9foMnAZeuKa6IvroSeuh564JvrieuiJ68mvnmRnZyshIcGZja5mimD45/RRLy8vWa1Wg6vB5eiH66Enrom+uB564nroiWuiL66Hnrie/OzJX91ax8NnAAAAAMDkTDFiCAAAAMA8cnJylJuba3QZNyw7OzvPjuXm5iYPj38e8xgxBAAAAFBoXLhwIU+D1q0WFBSUp8fLzs7WhQsX/vF+jBgCAAAAKBRycnLk7u6uokWLGl3KDbPZbHn6gEwvLy9lZGQoJyfnH40cMmIIAAAAoFDIzc39V9MoCxt3d/d/PJWWYAgAAAAAhchfPXn07xCnAQAAABRa7q9E5+nx7NPD8/R4roIRQwAAAAAwOUYMAQAAACCPZGZmKiIiQsePH5fNZtOIESO0atUqJSUlyW63q0ePHmrTpo3Cw8NVqlQppaam6oknntDnn3+utLQ0paamqn///nr00UfVvHlzffzxx7JarZo2bZoCAwP14IMP6uWXX5bD4ZDNZtNrr72mmjVr3nTdBEMAAAAAyCMrV65U5cqVNWPGDCUkJGjz5s0qVaqUpk6dqrS0NIWGhuq+++6TJLVt21aNGzfWpk2blJGRoUWLFuns2bPq0KGDWrRocd3j79mzR76+vpo+fboOHTqktLS0PKmbYAgAAFAAXbhwQfHx8crKyjK6lL90+PBhpaen35JjV6pUSdWrV78lxwZuxuHDhxUSEiJJqlGjhlasWKHGjRtLknx8fBQUFKSkpCRJUkBAgHO/hg0bys3NTWXKlFHx4sV19uzZK47rcDgkSSEhITpy5Ij69esnDw8P9e3bN0/qJhgCAAAUMKdPn9b333+vBx54QFar1ehy/lJwcLCKFSuW58d1OBw6fPiwtm/frmbNmuX58YGbERQUpL1796ply5ZKSkrShg0b5OXlpYcfflhpaWlKSEiQv7+/pCufHrp//35Jl/5+p6WlqXTp0vLy8lJycrL8/f114MABBQUFaefOnSpXrpwWLlyo3bt364033lB09M0/YIdgCAAAUMB8//33euSRR4wuwzAWi0VBQUHOgBgYGGh0SYBTp06dNGLECHXp0kV2u13z58/XsmXLFBYWpqysLA0YMEClS5e+Zr/Tp0+rW7duunDhgsaOHSt3d3c9//zz6tWrlypXrqzixYtLkmrVqqVBgwZpyZIlcnNzU//+/fOkboIhAABAAVOkSBGjS3AJgYGB2rFjB8EQfyu/Xy9htVo1ffr0K5bddddd12z35yjfn9OtGzZsqCFDhlyxTfv27dW+fftr9l28eHEeVfv/eF0FAABAAfNvXl59I3bu3KlJkyb9z+0cDodGjBihZ599Vl26dFFSUpK2bNmi8PBwhYeHq3Xr1ho4cOAV+8THx6tjx4565pln9Nlnn0m69BCNjh07qkOHDvryyy//cru/4ubm5rzvCsDNYcQQAAAA/8iOHTtUpEgRLVu2TF999ZXeffddjR8/Xi1atJDD4VC3bt2uGfmYMWOGpk+frtKlS6t79+564IEHNGPGDL311lsqUaKEevTooaZNm153Ozc3xjJQuIWGhhpdAiOGAAAABdkLL7ygY8eOSZLGjBmjPXv2aNmyZWrfvr06dOigzZs3S5I+/PBDPf3003rqqae0detWpaamql+/furevbs6dOjgfEri3r171bVrV3Xp0kW//vqr0tPT9eqrr15xzgYNGmjw4MGSpJycHHl6ejrXffLJJ7rzzjt12223XbHPmTNnVKVKFRUtWlTly5fXsWPHNH/+fFWoUEFnzpxxPkTnetsB+Gf+zUg6wRAAAKAAa9u2rTZu3Ci73e582uG6deu0cuVKLVmyRG+++absdrveffddLV++XIsXL9bBgweVlJSkrl27avHixXrsscf0+eefS7p0f9SSJUs0ePBgzZ49W8WKFdOUKVOuOGeRIkXk4+OjlJQUvfHGG+revbtz3QcffKBu3bpdU+fl/6Lq7e2tjIwMubu764svvlDHjh2dTxe93nbAjXJzc1NOTo7RZRjObrf/45F2ppICAAAUYC1btlTv3r1Vu3ZtNW7cWElJSapZs6Y8PDzk4eGh8uXLKzk5WWXLlpXVapXValXv3r119OhRLVmyRLGxsTp9+rQzmN19992yWCyqW7eucxTxeo4dO6aBAwdq1KhRqlKliiTp7NmzcjgcKleu3DXbX35fZEZGhnx8fCRJDzzwgL744gs999xzatGixV9uB9wIDw8PXbx40fkfHm7V/bh5yWazKTs7O0+O5XA4ZLfbZbfb5eHxz6IeI4YAAAAF2J9TLt977z09/vjjqly5shISEmS325WRkaETJ06odOnSSk5OVnZ2tjIyMvTSSy9pyZIlatGihaKiolStWjXn8X7++WdJlx4Mc/nLty+Xlpamfv36ady4cWrQoIFz+a5du3TnnXdedx8/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UlNT1b9/f+e6hIQETZ48Wbm5uTp//rxGjRql8+fP66efftKwYcP04IMP6uTJk+rdu7cWLFigN998U3FxcZKkxx9/XN26ddPw4cP1+++/6/fff1fPnj21cuVKeXp66uTJk+rUqZO++eYbHThwQF27dlXnzp1v7pcAAAAAAJO66aeSZmRkaNGiRTp79qw6dOggu90uSTp06JCGDRummjVrav369YqJidHEiRNVu3ZtjRs3TkFBQYqJidHChQv11Vdf6ejRo1q9erVycnLUuXNn3XfffZKk++67T927d9fOnTt18uRJffDBB9q/f79eeukl57TUAQMGEAwBAAAA4F+66WDYsGFDubm5qUyZMipevLgSExMlSeXKldOcOXNUpEgRpaeny8fH5y+PkZiYqAYNGshiscjT01N333238zgBAQHO7W6//XZ5enrK19dXVatWlZeXl0qUKPG39zQCAAAAAP7eTd9juH//fknS6dOnlZaWptKlS0uSJk2apBdffFFRUVGqUaOGHA6HJMlisTg//ykoKMg5jdRms2n37t267bbbnNv/6fLPAAAAAIC8cdMjhqdPn1a3bt104cIFjR07VuPGjZMkPfHEE+rXr59Kly6tChUqKDU1VZJ0zz336NVXX9XChQudx3jooYf07bff6plnnpHNZlOrVq1Up06dmy0NAAAAAHADLI6rh+/+gZiYGB0+fFhDhgzJy5ryXFZWlvbt26cn1x7UiXSb0eUAhrNPD7/u8ri4OAUHB+dzNfhf6IvroSeuh564JvrieuiJ68mvnvyZierWrSur1XrNel5wDwAAAAAmd1NTSUNDQ/OqDgAAAACAQW76HsOCJHFku+sOm8IYTGUAAAAAXANTSQEAAADA5AiGAAAAAGByBEMAAAAAMDlT3WMYNCmW11W4muXxRldgSn/1ugoAAACYEyOGAAAAAGByBEMAAAAAMLkCFQy3bdumVatWGV0GAAAAABQqBeoew5CQEKNLAAAAAIBCJ1+C4S+//KKIiAh5eHjI3d1dU6ZM0dKlS7Vr1y45HA51795drVu3Vnh4uEqVKqXz58+rWLFi6tatm+69917t2bNHc+fO1cMPP6zDhw9ryJAhmjNnjjZv3iy73a6wsDB16tQpPy4FAAAAAAqdfAmGX331lerUqaPhw4fru+++0yeffKKjR49q5cqVysrKUseOHdWk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0tPTnd9zc3MJhQZwc/v/gen09HQVL178mt6kp6fL19f3iuV/boubd+LECfXv31+dO3dW27ZtNXXqVOc6emKsqKgoDRkyRB07dlRWVpZzOX3Jf//9739lsVj09ddf66efftKwYcN09uxZ53p6YoyAgADddtttslgsCggIUMmSJbV//37nevqS/0qWLKnAwEB5eXkpMDBQVqtVJ0+edK6nJ8Y4f/68Dh8+rPvuu08S//5ltMWLF6tp06Z65ZVXdOLECXXr1k02m8253hV7UqinktavX1/btm2TJP3www+qUaOGwRWZ0x133KGdO3dKkrZt26YGDRrorrvuUlxcnLKysnThwgUlJiaqRo0aql+/vr744gvntsHBwUaWXiicPn1azz33nIYOHar27dtLoieu4IMPPtA777wjSfL29pbFYlHdunXpi4GWLVumpUuXKjo6WrVr11ZUVJRCQkLoicHef/99TZ48WZJ06tQppaWlqUmTJvTFQMHBwdq+fbscDodOnTqlixcv6v7776cnBtu1a5caN27s/M7/1xurePHizhG/EiVKKCcnx+V7YnE4HI5bfhaD/PlU0oSEBDkcDkVGRiooKMjoskzh6NGjGjx4sFavXq1ffvlFo0ePls1mU2BgoCZOnCh3d3etXr1aq1atksPhUO/evfXoo4/q4sWLGjZsmFJSUuTp6anp06erbNmyRl9OgTZx4kR9/PHHCgwMdC4bOXKkJk6cSE8MlJGRoYiICJ0+fVo5OTl64YUXFBQUxN8VFxEeHq5x48bJzc2NnhgsOztbEREROn78uCwWi4YMGaJSpUrRF4NNmTJFO3fulMPh0KBBg+Tv709PDDZ//nx5eHioe/fuksS/fxksPT1dI0aMUEpKimw2m7p27aq6deu6dE8KdTAEAAAAAPxvhXoqKQAAAADgfyMYAgAAAIDJEQwBAAAAwOQIhgAAAABgcgRDAAAAADA5giEAAAAAmBzBEAAAAABMjmAIAAAAACb3f8t9tH9QD88jAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fig, ax = plt.subplots(1, 1, figsize=(15,10))\n", "visualizer = FreqDistVisualizer(features=features, n=30, ax=ax )\n", "visualizer.fit(vector)\n", "visualizer.show()" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 1, figsize=(15,5))\n", "lists_asc = sorted(vocab.items())\n", "x = [i for (i,j) in lists_asc]\n", "y = [j for (i,j) in lists_asc]\n", "\n", "n=30\n", "plt.bar(x[:n], y[:n])\n", "plt.xticks(rotation=45)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"n't watch show theatr\"" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def normalizer(text):\n", " stem = nltk.stem.SnowballStemmer('english')\n", " text = text.lower()\n", " \n", " tokenized = []\n", " for token in nltk.word_tokenize(text):\n", " tokenized.append(stem.stem(token))\n", " \n", " tokenized = [token for token in tokenized \n", " if not is_punct(token) # remove tokens that are punctuations\n", " and token.isascii() # remove non-english characters\n", " ]\n", " \n", " # remove extended stopwords\n", " stop_words = stopwords.words('english')\n", " stop_words.extend(['data','compani'])\n", " stops = set(stop_words)\n", " tokenized = [token for token in tokenized if not token in stops]\n", " \n", " return ' '.join(tokenized) # join b/c we are inputting a list\n", "\n", "normalizer(example)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "norm_corpus = [ normalizer(i) for i in corpus ]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2b. TFIDF Vectorizer\n", "\n", "Again, Scikit-learn has provided an easy to work with functin for this. There is also a \"ngram_range\" parameter, which will help to create vocabulary with one or phrases of two words or both. " ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "from sklearn.feature_extraction.text import TfidfVectorizer" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<1961x27030 sparse matrix of type ''\n", "\twith 485489 stored elements in Compressed Sparse Row format>" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tfidf = TfidfVectorizer(analyzer='word')\n", "tfidf_vector = tfidf.fit_transform(norm_corpus)\n", "tfidf_vector" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([[0. , 0.07271827, 0. , ..., 0. , 0. ,\n", " 0. ],\n", " [0. , 0. , 0. , ..., 0. , 0. ,\n", " 0. ],\n", " [0. , 0. , 0. , ..., 0. , 0. ,\n", " 0. ],\n", " ...,\n", " [0. , 0. , 0. , ..., 0. , 0. ,\n", " 0. ],\n", " [0. , 0.02555779, 0. , ..., 0. , 0. ,\n", " 0. ],\n", " [0. , 0. , 0. , ..., 0. , 0. ,\n", " 0. ]])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tfidf_vector.toarray()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4YAAAHfCAYAAAAMbcYbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABpBklEQVR4nO3de3zO9cPH8fe10+WwsRnmMLLNMUsyohxDRaWykGGO5VwhchiZw2TO4UdJMy1zqi10UKFSlFjKKY1JORsWO7Tt2rXr/sPd9UtTPzL7brtez8fjfjy27+l6fy+f26+3z/dgstlsNgEAAAAAHJaT0QEAAAAAAMaiGAIAAACAg6MYAgAAAICDoxgCAAAAgIOjGAIAAACAg6MYAgAAAICDczE6AAAgf9SpU0e1a9eWk9N//80vMDBQERERBqa6ff58vjabTS4uLnrqqafUs2dPSdLq1auVmpqqgQMH/u0x1q9fr+zsbPs+f/bn/du2batXX31Vd9111w3nO3HihGbNmqVFixbp3LlzeuGFF7RmzZqbP9GbNHnyZH355Zfq1KmTRo4cKUk6evSoXnzxRUnS5cuXlZqaKl9fX0lS586d1bdv31v6zLffflurV6+WyWRStWrVNH36dHl7e8tqtWrmzJn68ssvZbVa1b9/f4WEhOTZf9++fXrnnXc0derUf/yccePGqVatWhowYMAt5QUA5EUxBIBiZOXKlSpXrpzRMQrMn8/30qVLGjx4sLKysv62gPxVQkKCatWqdd11N7L/Pzl9+rR+/vlnSZKPj0+BlEJJWrt2rT7//HNVqlTJvqxmzZrasGGDJCkuLk4ff/yxXn/99Xz5vAMHDigqKkobNmyQh4eHIiMj9eqrr2rq1Klas2aNjh8/rvfff1/p6el6+umnVb9+fTVo0OCaYxw9elTnzp3LlzwAgH+HYggADiAwMFDt2rXT4cOHNWfOHJUqVUoRERH67bffZLVaFRoaqi5dukiSXn31VW3atEleXl5q3LixDhw4oJiYmDyzNX/+/dy5c5o6darOnDkji8WiRx99VIMHD9bJkyfVt29ftW7dWj/88IOuXLmiMWPG6MEHH1ROTo5mz56tzz//XM7Ozrrnnns0efJkderUSS+//LKaN28uSQoLC1Pt2rXVp0+ffzzHcuXKady4cXr++efVr18/LV68WCkpKXr55ZcVGxurNWvWyNXVVWazWVOnTtXPP/+sbdu2aceOHSpRooQuXbqk77//XufPn1edOnV0xx132PeXpNjYWB0+fFjZ2dnq16+funTpol27dmnatGl6//33Jcn++4YNGzRx4kSdO3dOAwYM0JQpU9SpUyft3btXFotFM2fO1Ndffy1nZ2c1aNBA48ePl7u7u9q2bavOnTvr66+/1pkzZ/TEE09oxIgRec71yJEjmjp1qn777TeZTCb1799fTz75pHr06CGbzaZnn31WkydPVuPGjf/n2Pi7Y+3atUtz5sxRlSpVdOzYMZUoUUIzZ85UQEBAnrH18ccfy9XVVVlZWTp37px9NnLLli3q1q2bXFxcVLZsWT366KPauHHjNcXwzJkzWrhwoVJTUzV+/Hi98sorWrt2rWJiYuTk5KTy5ctr0qRJ8vPzu+ZzZ8yYoZ9++klLliyRq6ur5syZo927d8tqterOO+/UxIkT//E7TU9P1/jx4/XLL7/IyclJ9evX19SpU6+ZcQcAR8LffgBQjPTp00dPPPGE/f8uXrwoSbJYLHrggQf08ccfq169enr++ef14osvKi4uTm+//baioqL0/fff65NPPtEnn3yi9957T7GxsTp69OgNfe6YMWP01FNPKS4uTu+884527typDz/8UNLVSypbtGihd955Ry+++KJmzJgh6WrROnjwoDZs2GCfUfrwww8VEhKidevWSZLS0tK0bds2de7c+YZy1K1bV8nJyUpJSbEvs1qtmjFjhpYvX653331X3bp1U0JCgh588EG1bdtWffv2tV9KeurUKcXHx2vOnDl5jm02mxUfH6+oqCjNmzdPR44c+dsczs7Omj59uqpXr64333zzmnVLly7V+fPntWHDBm3YsEG5ubmaNWuWfX1GRoa9yEZFRenEiRPX7J+Tk6MhQ4YoNDRUmzZt0htvvKF58+Zp7969io2NlXR1JvVGSuE/HUu6Ohv4x7rg4GCNGTPmusdxdXXVli1b1KpVK+3evVvBwcGSrpa+ypUr27erVKmSzp49e82+lStX1vPPP6/GjRvrlVde0ddff63ly5frrbfe0saNG/XYY49p2LBhstlskiSbzaapU6fq9OnTeuONN1S6dGktW7ZMzs7OiouL08aNG1WxYsVr/gyv951++umnSk9P14YNG/TOO+9IUp7vGgAcCTOGAFCM/NOlpH8UhePH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DlazZs0kSY0aNdLUqVO1atUqvf7663rwwQcL+hQAAAAAoFgp8GLYpEkTOTk5qXz58ipZsqR++eUXjRgxQpKUmZmp5s2b6/Lly7r//vslSe7u7goICNCJEyck6ZqCuG3btoKODwAAAADFToEXw4MHD0qSLly4oKysLFWvXl1LliyRh4eHtm7dqlKlSikpKUl79uzRgw8+qLS0NCUmJsrX11eSdODAAVWqVEnfffedatasWdDxAQAAAKDYKfBieOHCBfXp00epqamaPHmynJycNHDgQNlsNpUuXVqzZs1SUFCQJk2apJCQEGVlZWn48OHy9vaWJMXHxys6OlolS5bUrFmzlJiYWNCnAAAAAADFiiGXko4ePfqaZS1atMizXWRk5HX3HzVqlAICAuy/N23aVE2bNs3fkAAAAADgQAq8GBopKayzzGaz0TFQxCUkJCgoKMjoGAAAAEC+KdBiGBwcfEv7x8TE5FMSAAAAAMAfeME9AAAAADg4h7qUNCAiXmfSLUbHQHEQe8joBP+TdW6o0REAAABQRDBjCAAAAAAOrlAVwzlz5iguLu6m9jl9+jQvugcAAACAW1CoiuG/8c033+i7774zOgYAAAAAFFn5do9hXFyctm7dqrS0NKWkpGjYsGFatGiRatSoITc3N4WHh2vMmDFKS0uT1WrVCy+8oPvuu08ff/yxli5dqnLlysliscjf31+7du3SmjVrNH/+fElS8+bNtWPHDh0/flwTJ06UxWJRiRIlNHfuXC1btkyZmZm655571K5du/w6HQAAAABwGPn68JmMjAytWLFCly5dUteuXWW1WjV06FDdeeedioyM1P33368+ffro3LlzCgkJ0ZYtWzR79mytX79enp6eGjhw4D8ePzIyUgMHDlSrVq304Ycf6vDhwxo4cKCOHTtGKQQAAACAfylfLyVt0qSJnJycVL58eZUpU0aXLl2Sn5+fJCkpKUlNmjSRJPn4+Mjd3V2XLl2Su7u7vLy8ZDKZdM8991z3uDabTZL0888/27d55JFH1KJFi/yMDwAAAAAOKV+L4cGDByVJFy5cUFpamry9veXkdPUjAgICtGfPHknSuXPndOXKFXl6eio1NVWXLl2SJO3fv1+SZDablZycLEk6deqULl++bD/GH9ts3LhRMTExcnJyUm5ubn6eBgAAAAA4lHy9lPTChQvq06ePUlNT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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fig, ax = plt.subplots(1, 1, figsize=(15,8))\n", "visualizer = FreqDistVisualizer(features=tfidf.get_feature_names(), n=30, ax=ax )\n", "visualizer.fit(tfidf_vector)\n", "visualizer.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. MODELLING" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "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", " \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", " \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", " \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", "
00000000000004000lbs000mah000mbps000mg000th000x...zuozuorazurichzvizvonimirzvoxzweigzxzychzynga
00500000000...0000000000
10000000000...0000000000
20000000000...0000000000
30000000000...0000000000
40000000000...0000000000
..................................................................
19560000000000...0000000000
19570300000000...0000000000
19580000000000...0000000000
19590100000000...0000000000
19600000000000...0000000000
\n", "

1961 rows × 27030 columns

\n", "
" ], "text/plain": [ " 00 000 0000 00004 000lbs 000mah 000mbps 000mg 000th 000x ... \\\n", "0 0 5 0 0 0 0 0 0 0 0 ... \n", "1 0 0 0 0 0 0 0 0 0 0 ... \n", "2 0 0 0 0 0 0 0 0 0 0 ... \n", "3 0 0 0 0 0 0 0 0 0 0 ... \n", "4 0 0 0 0 0 0 0 0 0 0 ... \n", "... .. ... ... ... ... ... ... ... ... ... ... \n", "1956 0 0 0 0 0 0 0 0 0 0 ... \n", "1957 0 3 0 0 0 0 0 0 0 0 ... \n", "1958 0 0 0 0 0 0 0 0 0 0 ... \n", "1959 0 1 0 0 0 0 0 0 0 0 ... \n", "1960 0 0 0 0 0 0 0 0 0 0 ... \n", "\n", " zuo zuora zurich zvi zvonimir zvox zweig zx zych zynga \n", "0 0 0 0 0 0 0 0 0 0 0 \n", "1 0 0 0 0 0 0 0 0 0 0 \n", "2 0 0 0 0 0 0 0 0 0 0 \n", "3 0 0 0 0 0 0 0 0 0 0 \n", "4 0 0 0 0 0 0 0 0 0 0 \n", "... ... ... ... ... ... ... ... .. ... ... \n", "1956 0 0 0 0 0 0 0 0 0 0 \n", "1957 0 0 0 0 0 0 0 0 0 0 \n", "1958 0 0 0 0 0 0 0 0 0 0 \n", "1959 0 0 0 0 0 0 0 0 0 0 \n", "1960 0 0 0 0 0 0 0 0 0 0 \n", "\n", "[1961 rows x 27030 columns]" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = pd.DataFrame(vector.toarray(), columns=features)\n", "X" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1961, 27035)\n" ] }, { "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", " \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", "
monthdaylengthnwordslex_div00000000000004000lbs...zuozuorazurichzvizvonimirzvoxzweigzxzychzynga
0320646610110.07022705000...0000000000
131911362000.29000000000...0000000000
231947317830.06768800000...0000000000
33198981560.35256400000...0000000000
431940306490.09090900000...0000000000
\n", "

5 rows × 27035 columns

\n", "
" ], "text/plain": [ " month day length nwords lex_div 00 000 0000 00004 000lbs ... \\\n", "0 3 20 6466 1011 0.070227 0 5 0 0 0 ... \n", "1 3 19 1136 200 0.290000 0 0 0 0 0 ... \n", "2 3 19 4731 783 0.067688 0 0 0 0 0 ... \n", "3 3 19 898 156 0.352564 0 0 0 0 0 ... \n", "4 3 19 4030 649 0.090909 0 0 0 0 0 ... \n", "\n", " zuo zuora zurich zvi zvonimir zvox zweig zx zych zynga \n", "0 0 0 0 0 0 0 0 0 0 0 \n", "1 0 0 0 0 0 0 0 0 0 0 \n", "2 0 0 0 0 0 0 0 0 0 0 \n", "3 0 0 0 0 0 0 0 0 0 0 \n", "4 0 0 0 0 0 0 0 0 0 0 \n", "\n", "[5 rows x 27035 columns]" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cols = ['month','day','length','nwords','lex_div']\n", "X = pd.concat([data[cols], X], axis=1)\n", "print(X.shape)\n", "X.head()" ] }, { "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.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }