У меня есть таблица данных, очень похожая на «данные» (но длиннее!) Ниже, содержащая сырые ингредиенты, я хочу сопоставить их с другой имеющейся у меня датной таблицей, содержащей список ингредиентов. Этот второй будет сопоставим со списком сравнения
data <- data.table(raw_ingredients = c("vegetable soup", "brown lentils", "carrot", "celery"))
> data
raw_ingredients
1 vegetable soup
2 brown lentils
3 carrot
4 celery
comparison_list <- data.table(V1 = c("soy", "brown lentils", "carrot", "celery", "beans", "mayonnaise"))
V1
1: soy
2: lentils
3: carrot
4: celery
5: beans
6: mayonnaise
Я хочу выполнить сопоставление с помощью машинного обучения, используя fasttext
Это пакеты, которые я использовал:
library("fastrtext") # install.packages("fastrtext")
library(data.table)
library(foreach)
library(lsa)
А вот мой код, предварительно обученную модель, которую я использовал, вы можете найти здесь https://dl.fbaipublicfiles.com/fasttext/vectors-wiki/wiki.en.zip.
# Read in the trained model
model_path <- "C:/Users/Mariana/Documents/DBs/DB 1st draft/3003_wd/wiki.en.bin"
model <- load_model(model_path)
# Get vectors representation for each clean ingredient
word.vectors.clean <- foreach(i = 1:nrow(comparison_list), .combine="rbind") %do% {
get_word_vectors(model, comparison_list$V1[i])
}
# For each raw ingredient, get the closest clean one
tmp.ingredient.raw <- foreach(i = 1:nrow(data), .combine="rbind") %do% {
tmp.ingredient.raw <- data$raw_ingredients[i]
}
# Get vectors representation for each raw ingredient
word.vector.raw <- foreach(i = 1:nrow(data), .combine="rbind") %do% {
# Get the word vector of the respective raw ingredient
get_word_vectors(model, tmp.ingredient.raw)
}
# Compute similarity between the raw ingredient and each clean ingredient
sim <- apply(word.vectors.clean, 1, cosine, word.vector.raw[1, ])
# Keep the one with maximum similarity (if there are more, keep the first).
sim <- sim[sim==max(sim)][1]
# Loop over all raw ingredients
res <- foreach(i = 1:nrow(data), .combine="rbind") %do% {
# The name of the ingredient is in the "names" attribute of the sim object
res <- data.table(clean_ingredients=attr(sim, "names"), similarity = sim)
# Print progres every 100 iterations
if(i %% 100 == 0)
print(i)
# Return res (foreach returns what is on the last line)
res
}
# Append clean ingredients to data
data <- cbind(data, res)
Вот что я вернул
Просмотр (данные)
> data
raw_ingredients clean_ingredients
1: vegetable soup <NA>
2: brown lentils <NA>
3: carrot <NA>
4: celery <NA>
similarity
1: NA
2: NA
3: NA
4: NA
Я заметил, что когда я открываю word.vector.raw Я вижу, что названия ингредиентов немного искажены, как ".X..lentils", я не знаю, имеет ли это какое-то отношение к этому. Я прикрепил изображения в виде картинок.
Кто-нибудь знает, как заставить код работать? Очень признателен!