word2vec / app.py
alonsosilva's picture
Add plot_text
5c6d40e
Raw
History Blame Contribute Delete
3.37 kB
import solara
import pandas as pd
import gensim.downloader as api
from umap import UMAP
from cluestar import plot_text
model = api.load('word2vec-google-news-300')
most_frequent = model.index_to_key[:2000]
embeddings = [model[most_frequent[i]] for i in range(2000)]
reducer = UMAP()
X = reducer.fit_transform(embeddings)
data = pd.DataFrame()
data["words"] = list((model.key_to_index.keys()))
word = solara.reactive("France")
positive_word1 = solara.reactive("France")
positive_word2 = solara.reactive("Madrid")
negative_word = solara.reactive("Paris")
@solara.component
def Page():
def my_check(text):
if text != "" and text not in list(data["words"].values):
solara.Info(f"{text} is not in the list of available words.")
with solara.Column(margin=10):
solara.Markdown("#Word2Vec")
solara.Markdown("#Nearest neighbors of a word")
solara.InputText("Search for a word:", value=word, continuous_update=True)
my_check(word.value)
if word.value != "" and word.value in list(data["words"].values):
solara.Markdown(f"##Nearest neighbors of the word '{word.value}':")
output = model.most_similar(f"{word.value}", restrict_vocab=25000)
df_output = pd.DataFrame()
df_output["neighbors"] = [output[i][0] for i in range(10)]
df_output["cosine similarity"] = [output[i][1] for i in range(10)]
solara.DataFrame(df_output, items_per_page=10)
if word.value in most_frequent:
id_word = model.key_to_index.get(word.value)
indexes_nn = [model.key_to_index.get(output[i][0]) for i in range(10) if model.key_to_index.get(output[i][0])<2000]
color_array = ["words" for i in range(2000)]
color_array[id_word] = "selected_word"
for index in indexes_nn:
color_array[index] = "neighbors"
solara.AltairChart(plot_text(X, most_frequent, color_array=color_array).configure_range(category=['#0000ff', '#ff0000', '#a0aab4']))
else:
solara.Info("Not a frequent word")
solara.AltairChart(plot_text(X, most_frequent))
solara.Markdown("#Word-analogy")
solara.InputText("Word1:", value=negative_word, continuous_update=True)
my_check(negative_word.value)
solara.InputText("Word2:", value=positive_word1, continuous_update=True)
my_check(positive_word1.value)
solara.InputText("Word3:", value=positive_word2, continuous_update=True)
my_check(positive_word2.value)
solara.Markdown(f"#{negative_word} is to {positive_word1} as {positive_word2} is to:")
if positive_word1.value != "" and positive_word2.value != "" and negative_word.value != "" \
and positive_word1.value in list(data["words"].values) and positive_word2.value in list(data["words"].values) and negative_word.value in list(data["words"].values):
output = model.most_similar(positive=[positive_word1.value, positive_word2.value], negative=[f'{negative_word.value}'], restrict_vocab=25000)
df_output = pd.DataFrame()
df_output["neighbors"] = [output[i][0] for i in range(10)]
df_output["cosine similarity"] = [output[i][1] for i in range(10)]
solara.DataFrame(df_output, items_per_page=10)