【问题标题】:Finding word matches between named nested list and data frame column在命名嵌套列表和数据框列之间查找单词匹配
【发布时间】:2019-12-15 08:02:47
【问题描述】:

我有一个为某些工作类别命名的列表列表,每个嵌套列表都是该工作类别的关键字列表,我正在尝试检查数据框中的一个列,其中包含一个职位列表,以查看是否关键字在职位名称中。最终目标是尽可能对每项工作进行分类。我提供了一个数据样本,因为有超过 15,000 个职位和 25 个不同的职位类别需要检查。

这是在 Rstudio 中。我尝试将 lapply 与 str_detect 一起使用。以下是我使用的代码。

library(stringr) 

cat.keys <- list(Internship='Intern', 
    Information.Technology=c('IT', 'Information Technology', 'Software', 'Developer'), 
    Healthcare=c('RN', 'LPN', 'Doctor', 'Nurse'), 
    Maintenance=c('Custodian', 'Janitor'))

jobs.df <- data.frame(Company=c('Big Brothers Big Sisters', 'Big Brothers Big Sisters', 
    'Big Brothers Big Sisters', 'American Red Cross', 'American Red Cross', 
    'American Red Cross', 'DeMolay International', 'Legal Aid Association', 
    'St.Mary’s Church'), 
    Job.Title = c('Intern', 'Marketing Intern', 'Special Events Internship Program', 
    'RN', 'Nurse', 'Registered Nurse', 'Director of IT - DeMolay International', 
    'SWITCHBOARD/INTAKE SPECIALIST', 'CHURCH CUSTODIAN - part-time'))
lapply(jobs.df$Job.Title, 
    function(x) sapply(cat.keys, function(y) str_detect(x, fixed(y))))

我希望它返回一个与我的原始 cat.keys 列表长度相同但具有 TRUE/FALSE 值的列表列表,这就是它返回的值。这完成了我想要的大部分工作,但是我遇到的问题是,当在一个较长的单词中找到一个较短的单词时(例如,“intern”也出现在“international”中,它会将“国际大使”之类的东西归类为实习或 SWITCHBOARD 将返回它)。 IT 示例的问题还在于我正在寻找完全匹配的案例,但是如果职位名称的大小写不同,例如“实习生”而不是“实习生”,则不会匹配,但是如果我这样做了它忽略了大写,RN的问题出现在小写的rn出现在'Intern'中。

【问题讨论】:

    标签: r regex string dictionary regex-lookarounds


    【解决方案1】:

    您可以利用正则表达式模式中的单词边界(并使用regex(),而不是fixed())来帮助您进行搜索。这应该让您开始 - 如果您遇到更多问题,请告诉我:

    # Adding word boundaries to each string
    cat.keys2 <- lapply(cat.keys, function(x) paste0("\\b", x, "\\b"))
    
    # Using new cat.key with regex() and ignoring case
    lapply(jobs.df$Job.Title, 
           function(x) sapply(cat.keys2, function(y) str_detect(x, regex(y, ignore_case = T))))
    

    另外,既然您正在使用正则表达式,您可以将 "\\bIntern\\b" 更改为 "\\bIntern\\b|\\bInternship\\b"(也可以将您的模式合并为一个),当然,您也可以像以前一样添加它。任何适合您的需求。

    【讨论】:

    • 这似乎奏效了。谢谢。如果在路上发生其他导致错误的事情,我会告诉你。
    • 我只是将单词的不同形式添加到列表中。我认为这更容易。谢谢你的想法。
    猜你喜欢
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2016-02-03
    • 2019-08-10
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多