{"id":15360280,"url":"https://github.com/jinglescode/textual-similarity-universal-sentence-encoder","last_synced_at":"2025-04-15T08:37:37.125Z","repository":{"id":119456248,"uuid":"261467950","full_name":"jinglescode/textual-similarity-universal-sentence-encoder","owner":"jinglescode","description":"Extract embeddings and group sentences with universal sentence encoder package from TensorFlow.js.","archived":false,"fork":false,"pushed_at":"2020-09-12T02:05:17.000Z","size":19,"stargazers_count":43,"open_issues_count":3,"forks_count":10,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-14T07:05:14.389Z","etag":null,"topics":["javascript","machine-learning","natural-language-processing","tensorflowjs"],"latest_commit_sha":null,"homepage":"https://jinglescode.github.io/textual-similarity-universal-sentence-encoder","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jinglescode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-05-05T12:54:02.000Z","updated_at":"2025-01-16T14:46:30.000Z","dependencies_parsed_at":null,"dependency_job_id":"31e6745f-2ad8-4157-b6eb-309242d35c7a","html_url":"https://github.com/jinglescode/textual-similarity-universal-sentence-encoder","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jinglescode%2Ftextual-similarity-universal-sentence-encoder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jinglescode%2Ftextual-similarity-universal-sentence-encoder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jinglescode%2Ftextual-similarity-universal-sentence-encoder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jinglescode%2Ftextual-similarity-universal-sentence-encoder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jinglescode","download_url":"https://codeload.github.com/jinglescode/textual-similarity-universal-sentence-encoder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249038462,"owners_count":21202708,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javascript","machine-learning","natural-language-processing","tensorflowjs"],"created_at":"2024-10-01T12:49:03.329Z","updated_at":"2025-04-15T08:37:37.103Z","avatar_url":"https://github.com/jinglescode.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Build a Textual Similarity Web App with TensorFlow.js\n\n\u003e Extract embeddings and group sentences with universal sentence encoder package from TensorFlow.js.\n\nHave you wondered how search engines understand your queries and retrieve relevant results? How chatbots extract your intent from your questions and provide the most appropriate response?\n\nIn this story, I will detail each part needed to build a textual similarity analysis web-app:\n\n-   word embeddings\n-   sentence embeddings\n-   cosine similarity\n-   build a textual similarity analysis web-app\n-   analysis of results\n\nTry the [textual similarity analysis web-app](https://jinglescode.github.io/textual-similarity-universal-sentence-encoder), and let me know how it works for you.\n\n----------\n\n# Word embeddings\n\nWord embeddings enable **knowledge representation where a vector represents a word**. This improves the ability for neural networks to learn from a textual dataset.\n\nBefore word embeddings were de facto standard for natural language processing, a common approach to deal with words was to use a one-hot vectorisation. Each word represents a column in the vector space, and each sentence is a vector of ones and zeros. Ones denote the presence of the word in the sentence.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-02.jpg)\n\nOne-hot vectorisation [taken from [Text Encoding: A Review](https://towardsdatascience.com/text-encoding-a-review-7c929514cccf)]\n\nAs a result, this leads to a huge and sparse representation, because there are much more zeros than ones. When there are many words in the vocabulary, this creates a large word vector. This might become a problem for machine learning algorithms.\n\nOne-hot vectorisation also fails to capture the meaning of words. For example, “_drink_” and “_beverage_”, even though these are two different words, they have a similar definition.\n\nWith word embeddings, semantically similar words have similar vectors representation. As a result, “_I would like to order a drink_” or “_a beverage_”, an ordering system can interpret that request the same way.\n\n## In the past\n\nBack in 2003, [Yoshua Bengio et al.](http://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf) introduced a language model concept. The focus of the paper is to learn representations for words, which allow the model to predict the next word.\n\nThis paper is crucial and led to the development to discover word embeddings. Yoshua received the Turing Award alongside with Geoffrey Hinton, and Yann LeCun.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-03.jpg#skinny_image)\n\nInput sequence of feature vectors for words, to a conditional probability distribution over words, to predict next word [image taken from [paper](http://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf)]\n\nIn 2008, [Ronan and Jason](https://thetalkingmachines.com/sites/default/files/2018-12/unified_nlp.pdf) worked on a neural network that could learn to identify similar words. Their discovery has opened up many possibilities for natural language processing. The table below shows a list of words and the respective ten most similar words.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-04.jpg#float_left)\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-05.jpg#float_left)\n\nLeft figure: Neural network architecture for given input sentence, outputs class probabilities. Right table: 5 chosen words and 10 most similar words. [sources taken from [paper](https://thetalkingmachines.com/sites/default/files/2018-12/unified_nlp.pdf)]\n\nIn 2013, [Tomas Mikolov et al.](https://arxiv.org/pdf/1301.3781.pdf) introduced learning high-quality word vectors from datasets with billions of words. They named it _Word2Vec,_ and it contains millions of words in the vocabulary.\n\nWord2Vec has become popular since then. Nowadays, the word embeddings layer is in all popular deep learning framework.\n\n## Examples\n\nOn Google’s pretrained Word2Vec model, they trained on roughly 100 billion words from Google News dataset. The word “_cat_” shares the closest meanings to “_cats_”, “_dog_”, “_mouse_”, “_pet_”.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-06.jpg)\n\nThe word “_cat_” is geometrically closer to to “_cats_”, “_dog_”, “_mouse_”, “_pet_”. [taken from [Embedding Projector](http://projector.tensorflow.org/)]\n\nWord embedding also manages to recognise relationships between words. A classic example is the gender-role relationships between words. For example, “_man_” is to “_woman_” is like “_king_” is to “_queen_”.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-07.jpg)\n\nInteresting relationships between words learnt from GloVe unsupervised learning algorithm [[image source](https://nlp.stanford.edu/projects/glove/)]\n\n## Dig deeper\n\n[Galina Olejnik](https://medium.com/u/6da21bd709d) did an excellent job describing the motivation of word embeddings. From one-hot encoding and TF-IDF to GloVe and Poincaré.\n\n[Word embeddings: exploration, explanation, and exploitation (with code in Python)](https://towardsdatascience.com/word-embeddings-exploration-explanation-and-exploitation-with-code-in-python-5dac99d5d795)\n\nHere’s a 29-minute comprehensive article about various language models by [Dipanjan (DJ) Sarkar](https://medium.com/u/6278d12b0682). He covers Word2Vec, GloVe and FastText; do check this out, if you are planning to work on word embeddings.\n\n[A hands-on intuitive approach to Deep Learning Methods for Text Data — Word2Vec, GloVe and FastText](https://towardsdatascience.com/understanding-feature-engineering-part-4-deep-learning-methods-for-text-data-96c44370bbfa)\n\n## Do it yourself\n\nTensorFlow has provided a [tutorial](https://www.tensorflow.org/tutorials/text/word_embeddings) on word embeddings and codes in this [Colab notebook](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/text/word_embeddings.ipynb). You can get your hands dirty with the codes and use it to train your word embeddings on your dataset. This can definitely help you get started.\n\nFor who enjoys animation, there is a cool embeddings visualisation on [Embedding Projector](http://projector.tensorflow.org/). Every dot represents a word, and you can visualise semantically similar words in a 3D space.\n\n----------\n\nWe have word vectors to represent meanings for words; how about sentences?\n\n# Universal Sentence Encoder\n\nLike word embeddings, [universal sentence encoder](https://arxiv.org/pdf/1803.11175.pdf) is a versatile sentence embedding model that converts text into semantically-meaningful fixed-length vector representations.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-09.jpg)\n\nUniversal Sentence Encoder encodes text into high dimensional vectors [taken from [TensorFlow Hub](https://tfhub.dev/google/universal-sentence-encoder/1)]\n\nThese vectors produced by the universal sentence encoder capture rich semantic information. We can use it for various natural language processing tasks, to train classifiers such as [classification](https://en.wikipedia.org/wiki/Sentiment_analysis) and [textual similarity analysis](https://en.wikipedia.org/wiki/Semantic_similarity).\n\nThere are two universal sentence encoder models by Google. One of them is based on a **Transformer** architecture and the other one is based on **Deep Averaging Network**.\n\n**Transformer**, the sentence embedding creates context-aware representations for every word to produce sentence embeddings. It is designed for higher accuracy, but the encoding requires more memory and computational time. This is useful for sentiment classification where words like ‘not’ can change the meaning and able to handle double negation like “not bad”.\n\n**Deep Averaging Network**, the embedding of words are first averaged together and then passed through a feedforward deep neural network to produce sentence embeddings. Unfortunately, by averaging the vectors, we lose the context of the sentence and sequence of words in the sentence in the process. It is designed for speed and efficiency, and some accuracy is sacrificed (especially on sarcasm and double negation). A great model for topic classification, classifying long articles into categories.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-10.jpg#skinny_image)\n\nSentences are semantically similar if they can be answered by the same responses. [taken from [paper](https://arxiv.org/pdf/1804.07754.pdf)]\n\n[Yinfei Yang et al.](https://arxiv.org/pdf/1804.07754.pdf) introduce a way to learn sentence representations using conversational data.\n\nFor example, “_How old are you?_” and “_What is your age?_”, both questions are semantically similar, a chatbot can reply the same answer “_I am 20 years old_”.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-11.jpg#skinny_image)\n\n“How are you?” and “How old are you?” have 33% similarity even though having identical words [[demo](https://jinglescode.github.io/textual-similarity-universal-sentence-encoder)]\n\nIn contrast, while “_How are you?_” and “_How old are you?_” contain identical words, both sentences have different meanings. A chatbot has to understand the question and provide the appropriate response.\n\nThis is a heatmap showing the similarity between three sentences “_How old are you?_”, “_What is your age?_” and “_How are you?_”.\n\n“_How are you?_” and “_How old are you?_” have low similarity score even though having identical words.\n\n[Logeswaran et al.](https://arxiv.org/abs/1803.02893) introduced a framework to learn sentence representations from unlabelled data. In this paper, the decoder (_orange box_) used in prior methods is replaced with a classifier that chooses the target sentence from a set of candidate sentences (_green boxes_); it improves the performance of question and answer system.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-12.jpg)\n\nReplaces the decoder from prior methods with a classifier which chooses the target sentence from a set of candidate sentences [taken from [paper](https://arxiv.org/pdf/1803.02893.pdf)]\n\n## Dig deeper\n\n[Dipanjan (DJ) Sarkar](https://medium.com/u/6278d12b0682) explained the development of each embedding models. If you are keen to build a text classifier, his article detailed each step to perform sentiment analysis on movie reviews dataset.\n\n[Deep Transfer Learning for Natural Language Processing — Text Classification with Universal](https://towardsdatascience.com/deep-transfer-learning-for-natural-language-processing-text-classification-with-universal-1a2c69e5baa9)\n\nIf you are curious to explore other language models, [Pratik Bhavsar](https://medium.com/u/c0101388583) compared the performance of various language models such as BERT, ELMo, USE, Siamese and InferSent. Learning to choose the correct one will improve the outcome of your results.\n\n[Variety Of Encoders In NLP](https://medium.com/modern-nlp/on-variety-of-encoding-text-8b7623969d1e)\n\n## Do it yourself\n\nTensorFlow has provided a [tutorial](https://tfhub.dev/google/universal-sentence-encoder/1), a pretrained model and a [notebook](https://colab.research.google.com/github/tensorflow/hub/blob/50bbebaa248cff13e82ddf0268ed1b149ef478f2/examples/colab/semantic_similarity_with_tf_hub_universal_encoder.ipynb) on universal sentence encoder. Definitely check this out if you are thinking about building your own text classifier.\n\n----------\n\nWith semantically-meaningful vectors for each sentence, how can we measure the similarity between sentences?\n\n# Cosine similarity\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-13.jpg)\n\nPhoto by [浮萍 闪电](https://unsplash.com/@vsmilelx) on [Unsplash](https://unsplash.com)\n\n[Cosine similarity](https://en.wikipedia.org/wiki/Cosine_similarity) is a measure of similarity by calculating **the cosine angle between two vectors**. If two vectors are similar, the angle between them is small, and the cosine similarity value is closer to 1.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-14.jpg#skinny_image)\n\nGiven two vectors _A_ and _B_, the cosine similarity, cos(θ), is represented using a [dot product](https://en.wikipedia.org/wiki/Dot_product \"Dot product\") and [magnitude](https://en.wikipedia.org/wiki/Magnitude_%28mathematics%29#Euclidean_vector_space \"Magnitude (mathematics)\") [from [Wikipedia](https://en.wikipedia.org/wiki/Cosine_similarity)]\n\nHere we input sentences into the universal sentence encoder, and it returns us sentence embeddings vectors.\n\nWith the vectors, we can take the cosine similarities between vectors. For every sentence pair, _A_ and _B_, we can calculate the cosine similarity of _A_ and _B_ vectors.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-15.jpg)\n\nSemantic similarity is a measure of the degree to which two pieces of text carry the same meaning. [taken from [TensorFlow Hub](https://tfhub.dev/google/universal-sentence-encoder/1)]\n\nWe can determine a minimum threshold to group sentence together. As similarity score falls between 0 to 1, perhaps we can choose 0.5, at the halfway mark. That means any sentence that is greater than 0.5 similarities will be cluster together.\n\n## Dig deeper\n\n[Euge Inzaugarat](https://medium.com/u/5515433d5913) introduced six methods to measure the similarity between vectors. Each method is suitable for a particular context, so knowing them it’s like knowing your data science toolbox well.\n\n[How to measure distances in machine learning](https://towardsdatascience.com/how-to-measure-distances-in-machine-learning-13a396aa34ce)\n\n----------\n\n# Building blocks of a textual similarity analysis web-app\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-16.jpg)\n\nPhoto by [Ryan Quintal](https://unsplash.com/@ryanquintal) on [Unsplash](https://unsplash.com)\n\nIn this project, I will be using these libraries:\n\n-   TensorFlow.js\n-   Universal sentence encoder\n-   Angular\n\n## TensorFlow.js\n\n[TensorFlow.js](https://www.tensorflow.org/js) is a framework built by Google which enables machine learning in JavaScript. We can **develop machine learning models and deploy them in the web browser and Node.js**.\n\n_As I enjoy developing web applications, I was so happy when TensorFlow.js released in 2018._\n\nIt is easy to get started, and we can install TensorFlow.js with [npm](https://www.npmjs.com/).\n```\n$ npm install @tensorflow/tfjs\n```\n\nAn example of a simple linear regression model would look like this.\n\n```\nimport * as tf from '@tensorflow/tfjs';\n\nconst model = tf.sequential();  \nmodel.add(tf.layers.dense({units: 1, inputShape: [1]}));\n\nmodel.compile({loss: 'meanSquaredError', optimizer: 'sgd'});\n\nconst xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);  \nconst ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);\n\nmodel.fit(xs, ys, {epochs: 10}).then(() =\u003e {  \n  model.predict(tf.tensor2d([5], [1, 1])).print();  \n});\n```\n\n## Universal sentence encoder\n\nI will be using is the [universal sentence encoder package](https://github.com/tensorflow/tfjs-models/tree/master/universal-sentence-encoder) from [TensorFlow.js](https://www.tensorflow.org/js). We can install universal sentence encoder using [npm](https://www.npmjs.com/).\n\n```\n$ npm install @tensorflow-models/universal-sentence-encoder\n```\n\nThis is an example to show how we can extract embeddings from each sentence using universal sentence encoder.\n\n```\nimport * as use from '@tensorflow-models/universal-sentence-encoder';\n\nuse.load().then(model =\u003e {  \n  const sentences = [  \n    'Hello.',  \n    'How are you?'  \n  ];  \n  model.embed(sentences).then(embeddings =\u003e {  \n    embeddings.print(true /* verbose */);  \n  });  \n});\n```\n\n## Angular\n\n[Angular](https://angular.io/) is a web application framework built by Google for creating dynamic single-page apps.\n\nFor this project, I am using Angular 8.0. I enjoy building on Angular for its [model–view–controller design pattern](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller). I have used Angular since its first version and for most of my web development. But since they roll out major releases every half a year, feeling that my work will become obsolete (maybe? I don’t know). [React](https://en.wikipedia.org/wiki/React_%28web_framework%29) is a popular UI framework, so perhaps I might switch to React one day. _Who knows?_\n\n## Cosine similarity\n\nCreate a function to calculate the similarity of two vectors using the [cosine similarity formula](https://en.wikipedia.org/wiki/Cosine_similarity).\n```\nsimilarity(a, b) {  \n  var magnitudeA = Math.sqrt(this.dot(a, a));  \n  var magnitudeB = Math.sqrt(this.dot(b, b));  \n  if (magnitudeA \u0026\u0026 magnitudeB)  \n    return this.dot(a, b) / (magnitudeA * magnitudeB);  \n  else return false  \n}\n```\n\nAnother function to calculate the similarity scores for every sentence pair as follows.\n\n```\ncosine_similarity_matrix(matrix){  \n  let cosine_similarity_matrix = [];  \n  for(let i=0;i\u003cmatrix.length;i++){  \n    let row = [];  \n    for(let j=0;j\u003ci;j++){  \n      row.push(cosine_similarity_matrix[j][i]);  \n    }  \n    row.push(1);  \n    for(let j=(i+1);j\u003cmatrix.length;j++){  \n      row.push(this.similarity(matrix[i],matrix[j]));  \n    }  \n    cosine_similarity_matrix.push(row);  \n  }  \n  return cosine_similarity_matrix;  \n}\n```\n\n----------\n\n## Combine everything together\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-17.jpg)\n\nPhoto by [Amélie Mourichon](https://unsplash.com/@amayli) on [Unsplash](https://unsplash.com)\n\nI have introduced all the major components needed for this project. Now we just have to stack them up like Legos, package it and deploy to Github.\n\nVoilà! We get a [web application](https://jinglescode.github.io/textual-similarity-universal-sentence-encoder) for a live demo.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-18.jpg)\n\nInput a list of sentences for semantic similarity [[demo](https://jinglescode.github.io/textual-similarity-universal-sentence-encoder)]\n\nWe have a list of sentences, and these will be input into the universal sentence encoder. It will output will the embeddings of each sentence. Then we calculate the similarity between each sentence.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-19.jpg)\n\n## Results\n\nThese are the sentences we will be testing our universal sentence encoder. The objective is to group sentences with similar meaning together. I have picked a few difficult cases, so let us see how it performs.\n\n\u003e Will it snow tomorrow?  \n\u003e Recently a lot of hurricanes have hit the US  \n\u003e Global warming is real\n\n\u003e An apple a day, keeps the doctors away  \n\u003e Eating strawberries is healthy\n\n\u003e what is your age?  \n\u003e How old are you?  \n\u003e How are you?\n\n\u003e The dog bit Johnny  \n\u003e Johnny bit the dog\n\n\u003e The cat ate the mouse  \n\u003e The mouse ate the cat\n\nThis heatmap shows how similar each sentence are to other sentences. The brighter the green represents similarity closer to 1, which means the sentences are more identical to each other.\n\n![](https://jinglescode.github.io/assets/img/posts/build-textual-similarity-analysis-web-app-20.jpg)\n\nSemantic similarity of 12 sentences pairs [[demo](https://jinglescode.github.io/textual-similarity-universal-sentence-encoder)]\n\nWe can adjust the value to determine a minimum similarity threshold to group sentences together. These are the sentences grouped together with greater than 0.5 similarity value.\n\n\u003e **Group 1**  \n\u003e Recently a lot of hurricanes have hit the US  \n\u003e Global warming is real\n\n\u003e **Group 2**  \n\u003e An apple a day, keeps the doctors away  \n\u003e Eating strawberries is healthy\n\n\u003e **Group 3**  \n\u003e what is your age?  \n\u003e How old are you?\n\n\u003e **Group 4**  \n\u003e The dog bit Johnny  \n\u003e Johnny bit the dog\n\n\u003e **Group 5**  \n\u003e The cat ate the mouse  \n\u003e The mouse ate the cat\n\nOur web application did an excellent job recognising “_Group 1_” being _weather-related issues_. Even though both sentences do not have any overlapping words.\n\nIt managed to identify that “_hurricanes_” and “_global warming_” are weather-related, but somehow didn’t manage to group the “_snow_” into this category.\n\nUnfortunately, “_Johnny bit the dog” and “The dog bit Johnny” has an_ 87% similarity. _Poor Johnny, I don’t know which is better._\n\nLikewise for “_The cat ate the mouse_” and “_The mouse ate the cat_”, I would be expecting that the two vectors to have an opposing similarity.\n\n----------\n\nThanks for reading thus far!\n\nOnce again, do try the [textual similarity analysis web-app](https://jinglescode.github.io/textual-similarity-universal-sentence-encoder), and let me know how it works for you in the comments below!\n\nCheck out the [codes](https://github.com/jinglescode/textual-similarity-universal-sentence-encoder) for the web application if you would like to build something similar.\n\n----------\n\n# Other machine learning web applications I’ve built\n\nA time-series prediction with TensorFlow.js.\n\n[Time Series Forecasting with TensorFlow.js](https://jinglescode.github.io/datascience/2019/05/17/time-series-forecasting-with-tensorflow-js/)\n\nA reinforcement agent learning to play tic-tac-toe.\n\n[Reinforcement Learning Value Function](https://jinglescode.github.io/datascience/2019/06/30/reinforcement-learning-value-function/)\n\n----------\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjinglescode%2Ftextual-similarity-universal-sentence-encoder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjinglescode%2Ftextual-similarity-universal-sentence-encoder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjinglescode%2Ftextual-similarity-universal-sentence-encoder/lists"}