【问题标题】:fuzzy Logic for a String in RR中字符串的模糊逻辑
【发布时间】:2020-08-05 13:25:25
【问题描述】:

我有 2 个数据框: DF1

ID   Address
AB1  VILL +PO CHAPAR TAPUKADA  ALWAR
AB2  VILL WARD NO 02 THIKARIYA CHAND RAWAT JUNA PADA POST BADANA  0 SIROHI
AB3  RAMKUMAR YADAV VILL  KANSL   0 JAIPUR
AB4  VILL KHERKI MUKKER  POSTPANIYA PUTLI   JAIPUR

还有,df2

    Name
    CHHAPPAR
    CHHAPAR
    KANSAL
    KANSIL
    KANSOL
    KHERK
    KHERKIA
    PAR
    UR
   WAR
   RIYA
   DAV
   LI

我想在 DF1 字符串中应用模糊逻辑。如果 DF1 中给出的名称与 DF2 匹配,请给我 DF2 名称

输出应该是这样的

ID   Address                                                                 Name
AB1  VILL +PO CHAPAR TAPUKADA  ALWAR                                         CHHAPPAR, CHHAPAR
AB2  VILL WARD NO 02 THIKARIYA CHAND RAWAT JUNA PADA POST BADANA  0 SIROHI
AB3  RAMKUMAR YADAV VILL  KANSL   0 JAIPUR                                   KANSAL, KANSIL, KANSOL
AB4  VILL KHERKI MUKKER  POSTPANIYA PUTLI   JAIPUR                           KHERK, KHERKIA

我尝试应用 FuzzywuzzyR,但报错

我也尝试了 agrep,但它给我的结果是真/假。

请帮我解决这个问题。另外,如果我应该尝试其他包模糊

【问题讨论】:

  • 名字总是一个字?
  • 似乎有可用的解决方案here
  • @JBGruber :是的,名字总是1个字。

标签: r fuzzy-logic fuzzywuzzy agrep


【解决方案1】:

我会为此使用包fuzzyjoin,它与tidytext 的逻辑一起使用:

library(tidytext)
library(fuzzyjoin)
library(tidyverse)

df1 %>% 
  unnest_tokens(word, Address, to_lower = FALSE) %>% 
  fuzzyjoin::stringdist_left_join(df2, by = c("word" = "Name"), max_dist = 1) %>% 
  group_by(ID) %>% # collapse unnested tokens back to text if you want
  summarise(text = paste(word, collapse = " "),
            Name = toString(na.omit(Name)))
#> # A tibble: 4 x 3
#>   ID    text                                                 Name               
#>   <chr> <chr>                                                <chr>              
#> 1 AB1   VILL PO CHAPAR TAPUKADA ALWAR                        "CHHAPAR"          
#> 2 AB2   VILL WARD NO 02 THIKARIYA CHAND RAWAT JUNA PADA POS~ ""                 
#> 3 AB3   RAMKUMAR YADAV VILL KANSL KANSL KANSL 0 JAIPUR       "KANSAL, KANSIL, K~
#> 4 AB4   VILL KHERKI KHERKI MUKKER POSTPANIYA PUTLI JAIPUR    "KHERK, KHERKIA"

数据

df1 <- read.csv(text = "ID,Address
AB1,VILL +PO CHAPAR TAPUKADA  ALWAR
AB2,VILL WARD NO 02 THIKARIYA CHAND RAWAT JUNA PADA POST BADANA  0 SIROHI
AB3,RAMKUMAR YADAV VILL  KANSL   0 JAIPUR
AB4,VILL KHERKI MUKKER  POSTPANIYA PUTLI   JAIPUR", stringsAsFactors = FALSE)

df2 <- read.csv(text = "Name
CHHAPPAR
CHHAPAR
KANSAL
KANSIL
KANSOL
KHERK
KHERKIA", stringsAsFactors = FALSE)

【讨论】:

  • 我在 check_input(x) 中遇到错误:输入必须是任意长度的字符向量或字符向量列表,每个字符向量的长度为 1。
  • 列可能是一个因素吗?在这种情况下使用df1$Address &lt;- as.character(df1$Address)
  • 我仍然收到错误消息。我的地址被转换为:ROO RADHYSHYAM SEN SEN SEN SEN SEN SEN ROO DEV DEV DEV DEV DEV DEV KHERA KHERA KHERA KHERA KHERA KHERA KHERA KHERA KHERA KHERA KHERA KHERA KHERA KHERA KHERA KHERA KHERA KHERA PO CHAPREL CHAPREL CHAPREL CHAPREL BHILWARA BHILWARA BHILWARA BHILWARA BHILWARA BHILWARA BHILWARA BHILWARA BHILWARA以及名称 df:OR、OR、OD、SEU、SEH、REN、SENA、BEN、VEN、OR、OR、OD、DEH、DEU、DAV、DER、DEI、DET、KHERI、KHARA、KHORA、KHERLA、 KHERA,KHERKA,KHEDA,GHERA,KHEMRA,JHERA,KHERAT,KHERWA,KHER,AHERA,KHERAN,KHERDA,KHEJRA,KHERAD
  • 抱歉,不知道。如所示,它适用于您的示例数据。也许您需要与dput() 共享一部分实际数据。在问题中更新它并告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 2011-10-16
  • 2011-03-30
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
相关资源
最近更新 更多