Vectorzation -The number game for text

Vectorzation -The number game for text

February 13, 2019 DATAcated Challenge 0

Introduction

Machine Learning has become the hottest topic in Data Industry with an increasing demand for professionals who can work in this domain.

There is a large amount of textual data present on internet and giant servers around the world.

Just for some facts

    • 1,209,600 new data producing social media users each day.
    • 656 million tweets per day!
    • More than 4 million hours of content uploaded to Youtube every day, with users watching 5.97 billion hours of Youtube videos each day.
    • 67,305,600 Instagram posts uploaded each day
    • There are over 2 billion monthly active Facebook users, compared to 1.44 billion at the start of 2015 and 1.65 at the start of 2016.
    • Facebook has 1.32 billion daily active users on average as of June 2017
    • 4.3 BILLION Facebook messages posted daily!
    • 5.75 BILLION Facebook likes every day.
    • 22 billion texts sent every day.
  • 5.2 BILLION daily Google Searches in 2017.

Need for Vectorization

The amount of textual data is massive, and the problem with textual data is that it needs to be represented in a format that can be mathematically used in solving some problem.

In simple words, we need to get an integer representation of a word. There are simple to complex ways to solve this problem.

One of the easiest ways to solve the problem is creating a simple word to integer mapping.

#list of sentences to be vectorized

line=”Hello this is a tutorial on how to convert the word in an integer format”

#dictionary to hold the words word_list={} #initialize the counter for assigning to different word counter=0

#iterate over the words

for word in line:

      #check if the word is in dict if word not in word_list: word_list[word]=counter #update the counter        counter+=1

This will return us the dictionary of words with the corresponding integer representations.

Another way to get these numbers is by using TD-IDF

TF-IDF stands for term frequency-inverse document frequency which assigns some weight to the word based on the number of occurrences in the document also taking into consideration the frequency of the word in all the documents. This approach is better than the previous approach as it lowers the weight of the words that occur too often in all the sentences like ‘a’, ‘the’, ‘as’ etc and increases the weight of the words that can be important in a sentence.

This is useful in the scenarios where we want to get important words from all the documents.

This approach is also used in topic modeling.

The third approach and the one on which this article will be focussing is Word2VEC

Word2vec is a group of related models that are used to produce so-called word embeddings. These models are shallow, two-layer neural networks, that are trained to reconstruct linguistic contexts of words.

After training, word2vec models can be used to map each word to a vector of typically several hundred elements, which represent that word’s relation to other words. This vector is the neural network’s hidden layer.

Word2vec relies on either skip-grams or continuous bag of words (CBOW) to create neural word embeddings. It was created by a team of researchers led by Tomas Mikolov at Google. The algorithm has been subsequently analyzed and explained by other researchers.

Luckily if you want to use this model in your work you don’t have to write these algorithms.

Gensim is one of the library in Python that has some of the awesome features required for text processing and Natural Language Processing. In the rest of the article, we will learn to use this awesome library for word vectorization.

Installing Gensim

pip install –upgrade gensim

It has three major dependencies

  • Python
  • NumPy
  • SciPy

Make sure you install the dependencies before installing gensim.

Lets’ get our hands dirty on the code.

Text Preprocessing:

In this step, we will pre-process the text like removing the stop words, lemmatize the words etc.

You can perform different steps based on your requirements.

I will use nltk stopword corpus for stop word removal and nltk word lemmatization for finding lemmas.

I order to use nltk corpus you will need to download it using the following commands.

Downloading the corpus

import nltk nltk.download() #this will open a GUI from which you can download the corpus

Input initialization

#list of sentences to be vectorized

lines=[“Hello this is a tutorial on how to convert the word in an integer format”, “this is a beautiful day”,”Jack is going to office”]

Removing the Stop Words

from nltk.corpus

import stopwords stop_words=set(stopwords.words(‘english’))

lines_without_stopwords=[]

#stop words contain the set of stop words

for line in lines: temp_line=[]

     for word in lines:

         if word not in stop_words:

            temp_line.append (word)

     string=’ ‘ lines_without_stopwords.append(string.join(temp_line))

lines=lines_without_stopwords

Lemmatization

#import WordNet Lemmatizer from nltk

from nltk.stem import WordNetLemmatizer

wordnet_lemmatizer = WordNetLemmatizer()

lines_with_lemmas=[]

#stop words contain the set of  words

for line in lines:

    temp_line=[]

        for word in lines:

            temp_line.append (wordnet_lemmatizer.lemmatize(word))

           string=’ ‘ lines_with_lemmas.append(string.join(temp_line))

            lines=lines_with_lemmas

Now we have done the basic preprocessing of the text. Any other preprocessing stuff can be achieved similarly.

Preparing Input

We have out input in the form of array of lines. In order for model to process the data we need covert our input to an array of array of words ( : ).

Our Input

lines=[“Hello this is a tutorial on how to convert the word in an integer format”,

“this is a beautiful day”,”Jack is going to office”]

New Input

lines=[[‘Hello’, ‘this’,’tutorial’, ‘on’, ‘how’,’convert’ ,’word’,’ integer’,’format’],

[‘this’ ,’beautiful’, ‘day’],[‘Jack’,’going’ , ‘office’]

new_lines=[] for line in lines: new_lines=line.split(”) #new lines has the new format lines=new_lines

Building the WORD2VEC Model

Building a model with gensim is just a piece of cake .

#import the gensim package

model = gensim.models.Word2Vec(lines, min_count=1,size=2)

Here important is to understand the hyperparameters that can be used to train the model.

Word2vec model constructor is defined as:

gensim.models.word2vec.Word2Vec(sentences=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=0.001, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=<built-in function hash>, iter=5, null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000, compute_loss=False)

sentence= This is the input provided in the form of a list

size= This defines the size of the vector we want to convert the word (‘Hello’=[ ? , ? , ? ] if size=3)

alpha= It is the initial learning rate (will linearly drop to min_alpha as training progresses).

window= It is the maximum distance between the current and predicted word within a sentence.

min_count= ignore all words with total frequency lower than this.

max_vocab_size = limit RAM during vocabulary building; if there are more unique words than this, then prune the infrequent ones. Every 10 million word types need about 1GB of RAM. Set to None for no limit (default).

sample = threshold for configuring which higher-frequency words are randomly downsampled;

default is 1e-3, useful range is (0, 1e-5).

workers = use this many worker threads to train the model (=faster training with multicore machines).

hs = if 1, hierarchical softmax will be used for model training. If set to 0 (default), and negative is non-zero, negative sampling will be used.

negative = if > 0, negative sampling will be used, the int for negative specifies how many “noise words” should be drawn (usually between 5-20). Default is 5. If set to 0, no negative sampling is used.

cbow_mean = if 0, use the sum of the context word vectors. If 1 (default), use the mean. Only applies when cbow is used.

hashfxn = hash function to use to randomly initialize weights, for increased training reproducibility. The default is Python’s rudimentary built-in hash function.

iter = number of iterations (epochs) over the corpus. Default is 5.

trim_rule = vocabulary trimming rule specifies whether certain words should remain in the vocabulary, be trimmed away, or handled using the default (discard if word count < min_count). Can be None (min_count will be used), or a callable that accepts parameters (word, count, min_count) and returns either utils.RULE_DISCARD, utils.RULE_KEEP or utils.RULE_DEFAULT. Note: The rule, if given, is only used to prune vocabulary during build_vocab() and is not stored as part of the model.

sorted_vocab = if 1 (default), sort the vocabulary by descending frequency before assigning word indexes.

batch_words = target size (in words) for batches of examples passed to worker threads (and thus cython routines). Default is 10000. (Larger batches will be passed if individual texts are longer than 10000 words, but the standard cython code truncates to that maximum.)

Using the model

#saving the model persistence

model.save(‘model.bin’)

#loading the model

model = gensim.models.KeyedVectors.load_word2vec_format(‘model.bin’, binary=True)

#getting the most similar words

model.most_similar(positive=[‘beautiful’, ‘world’], negative=[‘convert’], topn=1)

#finding the odd one out

model.doesnt_match(“bullish holding stock”.split())

#getting the vector for any word

model[word]

#finding the similarity between words model.similarity(‘woman’, ‘man’)

For more details, you can read the documentation of the word2vec  gensim here.

By: Japneet Singh Chawla

 

Leave a Reply

Your email address will not be published. Required fields are marked *