R: Машинное обучение для сопоставления имен не работает - PullRequest
0 голосов
/ 02 мая 2020

У меня есть таблица данных, очень похожая на «данные» (но длиннее!) Ниже, содержащая сырые ингредиенты, я хочу сопоставить их с другой имеющейся у меня датной таблицей, содержащей список ингредиентов. Этот второй будет сопоставим со списком сравнения

 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", я не знаю, имеет ли это какое-то отношение к этому. Я прикрепил изображения в виде картинок. word.vector.raw word.vectors.clean

Кто-нибудь знает, как заставить код работать? Очень признателен!

...