R中的字符串相似性搜索
我有一个很大的产品描述列表,比如R中的字符串相似性搜索,r,text-mining,text-analysis,R,Text Mining,Text Analysis,我有一个很大的产品描述列表,比如 Water bottles 1L Water Can 1L Aerated Drinks 1L Chips Potato Doritos Chips Bread Yogurt 300ML Milk 当然,这个名单是以百万计的 我正在尝试创建一个搜索相似性。我想要一个搜索功能,它将选择相似性描述。如果我搜索乳制品,它应该会带来牛奶、黄油、酸奶之类的东西 为此,我使用了levenshteinSim并在循环中运行所有描述,并与我的搜索字符串进行比较。当它运行一百万条
Water bottles 1L
Water Can 1L
Aerated Drinks 1L
Chips Potato
Doritos Chips
Bread
Yogurt 300ML
Milk
当然,这个名单是以百万计的
我正在尝试创建一个搜索相似性。我想要一个搜索功能,它将选择相似性描述。如果我搜索乳制品,它应该会带来牛奶、黄油、酸奶之类的东西
为此,我使用了
levenshteinSim
并在循环中运行所有描述,并与我的搜索字符串进行比较。当它运行一百万条记录时,它需要很长时间。是否有任何算法将数据帧和字符串作为输入参数和最小分数来获取值?对于grep
grep("milk", searchDF[["description"]], ignore.case = TRUE)
编辑:
抱歉,您没有意识到您正在搜索一个数据帧列表,而不是在一个长字符串中搜索一个包含所有描述的数据帧
vapply(searchList, function(x) any(grepl("milk", x, ignore.case = TRUE)),
logical(1))
vapply
将以矢量化方式查看列表中的所有元素,并加快速度grepl
类似于grep
,但它返回的是逻辑而不是索引any
然后检查由grepl
返回的所有逻辑,以查看搜索字符串“milk”
是否存在。最后的logical(1)
表示函数将为搜索列表的每个索引返回一个逻辑值。您还可以使用sapply
并避免将逻辑(1)
放在末尾,但是vapply
通常更安全,因为sapply
有时会返回意外的数据类型
编辑2:
我不熟悉levenshteinSim
,但是utils
中的函数adist
也会计算levenshtein距离。如果您想要最小距离,而不仅仅是字符串列表中的存在或不存在,您可以使用类似的策略,但使用adist
vapply(searchList, function(x) min(adist(x, "milk 1L",
ignore.case = TRUE)),
numeric(1))
对于grep
grep("milk", searchDF[["description"]], ignore.case = TRUE)
编辑:
抱歉,您没有意识到您正在搜索一个数据帧列表,而不是在一个长字符串中搜索一个包含所有描述的数据帧
vapply(searchList, function(x) any(grepl("milk", x, ignore.case = TRUE)),
logical(1))
vapply
将以矢量化方式查看列表中的所有元素,并加快速度grepl
类似于grep
,但它返回的是逻辑而不是索引any
然后检查由grepl
返回的所有逻辑,以查看搜索字符串“milk”
是否存在。最后的logical(1)
表示函数将为搜索列表的每个索引返回一个逻辑值。您还可以使用sapply
并避免将逻辑(1)
放在末尾,但是vapply
通常更安全,因为sapply
有时会返回意外的数据类型
编辑2:
我不熟悉levenshteinSim
,但是utils
中的函数adist
也会计算levenshtein距离。如果您想要最小距离,而不仅仅是字符串列表中的存在或不存在,您可以使用类似的策略,但使用adist
vapply(searchList, function(x) min(adist(x, "milk 1L",
ignore.case = TRUE)),
numeric(1))
如果你想特别使用levenshteinSim
只需在我下面文章的第二次编辑中将adist
替换为levenshteinSim
。如果你觉得提议的解决方案没有回答问题,请添加一条评论,说明你希望它做什么,而不是重复地重新编辑你的问题。如果你想特别使用levenshteinSim
,只需在我下面文章的第二次编辑中将adist
替换为levenshteinSim
。如果您觉得建议的解决方案没有回答问题,请添加一条评论,说明您具体希望它做什么,而不是重复地重新编辑您的问题。这非常有帮助。。我还有一个问题,如果我给levenshteinSim('A','b'),有没有办法,这会给出与levenshteinSim('b','A')相同的值。如果比较仅仅是片面的,那有可能吗。像levenshteinSim(“果汁混合器”、“果汁泛声混合器”)之类的东西应该提供100%匹配。。单向匹配,不应给出100%的比较levenshteinSim(‘Pansonic Mixer for Juice’,‘Juice Mixer’),您需要更具体的评分标准,因为您不再计算Levenshtein距离。例如,newdistance函数(“电影院”、“冰人”)
是否应该返回100%,因为“电影院”中的所有字母都在“冰人”中?如果只针对整词,您希望它如何处理部分匹配?newdistance函数(“挤奶机”、“挤奶机”)应该是100%还是更小的值?newdistance功能(“挤奶机”、“挤奶机”)怎么样?
?这很有帮助。。我还有一个问题,如果我给levenshteinSim('A','b'),有没有办法,这会给出与levenshteinSim('b','A')相同的值。如果比较仅仅是片面的,那有可能吗。像levenshteinSim(“果汁混合器”、“果汁泛声混合器”)之类的东西应该提供100%匹配。。单向匹配,不应给出100%的比较levenshteinSim(‘Pansonic Mixer for Juice’,‘Juice Mixer’),您需要更具体的评分标准,因为您不再计算Levenshtein距离。例如,newdistance函数(“电影院”、“冰人”)
是否应该返回100%,因为“电影院”中的所有字母都在“冰人”中?如果只针对整词,您希望它如何处理部分匹配?newdistance函数(“挤奶机”、“挤奶机”)应该是100%还是更小的值?新距离功能(“挤奶机”、“挤奶机”)怎么样?