Как сопоставить две строки по семантике?

#r #fuzzyjoin

#r #fuzzyjoin

Вопрос:

 library(dplyr)
library(fuzzyjoin)

df1 <- data.frame(x = c("Socks", "Mouse"))
df2 <- data.frame(y = c("Sock", "House"))

stringdist_left_join(df1, df2, 
                 by = c(x = "y"),
                 max_dist = 1,
                 ignore_case = TRUE,
                 distance_col = "distance")
  

вывод:

       x     y distance
1 Socks  Sock        1
2 Mouse House        1
  

Для обоих сравнений (Socks vs. Носок и мышь против Дом) Я получаю одинаковое расстояние. Пока все хорошо. Но теперь я хочу сопоставить слова на семантическом уровне. В первом сравнении (Socks vs. Sock) разница заключается только во множественном числе по сравнению с единственным. И я бы посчитал это совпадением. Однако во втором сравнении (мышь против House) значение двух слов различается. Я не хочу считать это совпадением. Есть предложения, как я мог бы добавить еще один столбец (например, «match»), где у меня было бы значение TRUE в первой строке (для Socks против Sock) и FALSE во второй строке (для мыши против Дом)?

Есть ли способ указать, что я хочу игнорировать суффиксы? Думаю о чем-то похожем на «ignore_case = TRUE» (см. Код)

У меня длинный набор данных с немецкими словами. Я бы предпочел решение, которое не требует использования словарей (т. Е. решение, применимое к большему количеству вариантов использования). Однако, если нет никакого способа обойти это, я был бы признателен за подробную информацию о том, как использовать немецкий словарь для моей проблемы.

Комментарии:

1. То, что вы описываете в своем примере с носками, называется stemming . Идея состояла бы в том, чтобы сначала выделить слова, а затем соединить их, используя нечеткое соединение. Примером пакета является corpus (я никогда им не пользовался, но, похоже, он делает то, что вы хотите).

2. @Bas, спасибо тебе! Ваше предложение действительно решило эту конкретную проблему.

Ответ №1:

метод stringdist_fuzzy_join = «soundex» может помочь. Разные методы имеют разные расстояния, и тогда вы можете установить максимальное расстояние (но будет сложно получить идеальные соответствия для всех случаев).

Это тоже может оказаться полезным для вас: https://cran.r-project.org/web/packages/fuzzyjoin/vignettes/stringdist_join.html