【发布时间】:2018-02-21 18:37:05
【问题描述】:
您好,我正在与python 3 合作,我已经面临这个问题一段时间了,我似乎无法弄清楚这一点。
我有 2 个包含 strings 的 numpy 数组
array_one = np.array(['alice', 'in', 'a', 'wonder', 'land', 'alice in', 'in a', 'a wonder', 'wonder land', 'alice in a', 'in a wonder', 'a wonder land', 'alice in a wonder', 'in a wonder land', 'alice in a wonder land'])
如果您注意到,array_one 实际上是一个数组,其中包含句子 alice in a wonder land 的 1-gram, 2-gram, 3-gram, 4-gram, 5-gram。
我故意将
wonderland当作两个词wonder和land。
现在我有另一个numpy array,其中包含一些位置和名称。
array_two = np.array(['new york', 'las vegas', 'wonderland', 'florida'])
现在我要做的是获取array_one 中存在于array_two 中的所有元素。
如果我使用两个数组的np.intersect1d 取出一个交集,我不会得到任何匹配项,因为wonderland 在array_one 中是两个单独的词,而在array_two 中是一个词。
有没有办法做到这一点?我已经尝试过堆栈 (this) 的解决方案,但它们似乎不适用于 python 3
array_one最多有 60-100 个项目,而array_two最多有大约 100 万个项目,但平均有 250,000 - 500,000 个项目。
编辑
我使用了一种非常幼稚的方法,因为到目前为止我无法找到解决方案,我从 arrays 替换了 white space,然后使用生成的 boolean 数组([True, False, True ]) 以`过滤原始数组。下面是代码:
import numpy.core.defchararray as np_f
import numpy as np
array_two_wr = np_f.replace(array_two, ' ', '')
array_one_wr = np_f.replace(array_one, ' ', '')
intersections = array_two[np.in1d(array_two_wr, array_one_wr)]
但考虑到
array_two中的元素数量,我不确定这是要走的路
【问题讨论】:
-
你可以尝试使用 levenshtein 距离吗? en.wikipedia.org/wiki/Levenshtein_distance
-
@EspoirMurhabazi 我想到了
levenshtein distance和Cosine string matching但问题是如何在不使用两个for循环的情况下实现它们,这是第一个问题,第二个问题是,我需要一些可以处理的东西空白,因为 1 的 levenshtein 距离将与block A和block B匹配,而cosine将在0.90匹配它们。 -
也许你可以使用this SO question中讨论的局部敏感哈希