- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要找到最接近的句子。我有一个句子数组和一个用户句子,我需要在数组中找到最接近用户句子的元素。
我使用 word2vec 以向量的形式呈现每个句子:
def get_avg_vector(word_list, model_w2v, size=500):
sum_vec = np.zeros(shape = (1, size))
count = 0
for w in word_list:
if w in model_w2v and w != '':
sum_vec += model_w2v[w]
count +=1
if count == 0:
return sum_vec
else:
return sum_vec / count + 1
因此,数组元素如下所示:
array([[ 0.93162371, 0.95618944, 0.98519795, 0.98580566, 0.96563747,
0.97070891, 0.99079191, 1.01572807, 1.00631016, 1.07349398,
1.02079309, 1.0064849 , 0.99179418, 1.02865136, 1.02610303,
1.02909719, 0.99350413, 0.97481178, 0.97980362, 0.98068508,
1.05657591, 0.97224562, 0.99778703, 0.97888296, 1.01650529,
1.0421448 , 0.98731804, 0.98349052, 0.93752996, 0.98205837,
1.05691232, 0.99914532, 1.02040555, 0.99427229, 1.01193818,
0.94922226, 0.9818139 , 1.03955 , 1.01252615, 1.01402485,
...
0.98990598, 0.99576604, 1.0903802 , 1.02493086, 0.97395976,
0.95563786, 1.00538653, 1.0036294 , 0.97220088, 1.04822631,
1.02806122, 0.95402776, 1.0048053 , 0.97677222, 0.97830801]])
我也将用户的句子表示为一个向量,我计算最接近它的元素是这样的:
%%cython
from scipy.spatial.distance import euclidean
def compute_dist(v, list_sentences):
dist_dict = {}
for key, val in list_sentences.items():
dist_dict[key] = euclidean(v, val)
return sorted(dist_dict.items(), key=lambda x: x[1])[0][0]
上述方法中的
list_sentences
是一个字典,其中键是句子的文本表示,值是向量。
这需要很长时间,因为我有超过 6000 万个句子。我怎样才能加快、优化这个过程?
如有任何建议,我将不胜感激。
最佳答案
6000 万个句子向量的初始计算本质上是固定成本,您只需支付一次。我假设您主要关心每次后续查找的时间,即单个用户提供的查询语句。
使用 numpy native 数组操作可以加快距离计算,而不是在 Python 循环中进行您自己的单独计算。 (它能够使用其优化代码批量执行操作。)
但首先您需要将 list_sentences
替换为真正的 numpy 数组,只能通过数组索引访问。 (如果您有其他键/文本需要与每个插槽相关联,您可以在其他地方使用一些字典或列表进行关联。)
假设您已经完成了该操作,无论采用何种方式对您的数据来说都是自然的,现在有了 array_sentences
,这是一个 6000 万 x 500 维的 numpy 数组,每行一个句子平均向量.
然后,获得一个充满距离的数组的 1-liner 方法是 6000 万个候选者中的每一个与 1 个查询(给出 6000 万个条目)之间的差异的向量长度(“范数”)回答每个差异):
dists = np.linalg.norm(array_sentences - v)
另一种 1-liner 方法是使用 numpy 效用函数 cdist()
计算每对两个输入集合之间的距离。在这里,您的第一个集合只是一个查询向量 v
(但如果您要同时处理多个批处理,一次提供多个查询可能会提供额外的轻微加速):
dists = np.linalg.cdists(array[v], array_sentences)
(请注意,此类向量比较通常使用余弦距离/余弦相似度而不是欧氏距离。如果您切换到那个,您可能正在做其他规范/点积而不是上面的第一个选项,或者使用metric='cosine'
cdist()
的选项。)
一旦您拥有 numpy 数组中的所有距离,使用 numpy 原生排序选项可能比使用 Python sorted()
更快。例如,numpy 的间接排序 argsort()
,它只返回排序后的索引(因此避免移动所有向量坐标),因为您只想知道哪个项是最佳匹配项。例如:
sorted_indexes = argsort(dists)
best_index = sorted_indexes[0]
如果您需要将该 int 索引转回您的其他键/文本,您将使用自己的字典/列表来记住槽到键的关系。
通过与所有候选人进行比较,所有这些仍然会给出完全正确的结果,这(即使做得最好)仍然很耗时。
有一些方法可以更快地获得结果,这些方法基于对所有候选对象的预先构建索引——但是这样的索引在高维空间(比如 500 维空间)中变得非常棘手。他们通常会牺牲完全准确的结果来换取更快的结果。 (也就是说,它们为“最接近的 1”或“最接近的 N”返回的内容会有一些错误,但通常不会有太大偏差。)有关此类库的示例,请参见 Spotify's ANNOY。或 Facebook's FAISS .
关于python - 在庞大的数组中寻找最近的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49798313/
我需要获取过去 24 小时的记录,但不能像这样按小时分组: SELECT HOUR(CompDate) AS hour, COUNT(1) AS action FROM mytable WHERE (
我们有一个自动完成列表,当您向某人发送电子邮件时会填充该列表,这一切都很好,直到列表变得非常大,您需要输入越来越多的地址才能找到您想要的地址, 这违背了自动完成的目的 我在想应该添加一些逻辑,以便自动
我在 android 的锁屏上工作我们如何禁用导航软按钮,已经尝试了所有方法,systemoverlay但它不起作用,在按下主页按钮时它会终止服务和 Activity 。 最佳答案 后退按钮可以通过覆
我有一个报告创建时间为 2016-05-30,现在我需要从报告时间开始的最后 7 天。我怎样才能使用时刻? report_create_time = moment('2016-05-30').form
我想找出向量中最接近的三个数字。 就像是 v = c(10,23,25,26,38,50) c = findClosest(v,3) c 23 25 26 我试过 sort(colSums(as.ma
考虑以下表结构: id speed 1 100 2 200 3 300 4 400 5 500 考虑以下查询:"SELECT * FROM records WHERE
我正在开发一个依赖 YouTube 直播和实时聊天(也来自 YouTube)的网络应用。事情进展顺利,突然嵌入的聊天功能无法在移动设备上运行。 我试图在我这边找到一个错误或一些无效的配置,但我找不到。
我正在制作一个 React Native 应用程序,它有一个安全部分,用户必须在其中输入密码才能解锁 protected 内容。问题是,当用户在锁定该部分之前切换到另一个应用程序时,将生成屏幕截图以及
我有一条 SQL 语句 (SQL Server Management Studio),我通过仪表板软件将数据传递到 where 语句中。用户可以选择年份(2013 年或现在的 2014 年)和月份(作
我有一个脚本可以添加一组行,使您能够在 SharePoint 列表表单中捕获其他访问者的信息。我有两个 anchor 标记,一个用于添加,另一个用于删除。当我添加一个新的访问者时它有效,当我删除访问者
我正在学习斯坦福 iOS 类(class),我有一个问题,我认为与最近的更新有关。这是代码部分: func evaluate(ops: [Op]) -> (result: Double?,remain
我注意到我的应用有一个奇怪的行为。每当我按下主页按钮时,我的应用程序就会被杀死。我没有在应用程序堆栈中看到该应用程序。我可以看到之前启动的其他应用程序。最初我怀疑 android:launchMode
我需要获取过去 7 天内的所有付费和临时条目,但我总是收到所有退回的内容。我不确定我做错了什么,我已经阅读了这里的很多帖子,但无法理解它是什么。 MySQL 5.6(如果它与我一直在做的事情有什么不同
我的表有一列以 mysql time() 格式格式化。 当它是一个值分配给名为 $preRemainOt 的 php 变量时我想重新安排到最近的 15 分钟 function roundTime($w
我想获取过去 7 天内每天每个产品的最后时间戳。数据库中有数千条记录。我怎样才能通过查询来做到这一点。大约有 25 种不同的产品,每种产品每天大约有 50 个时间戳。 表:构建数据 'Timesta
我现在的代码正在从 SQL 中获取移动应用程序中的数据,首先添加显示,我需要将其设置为在我的 Android 应用程序中显示最后添加的第一个。我有如下所示的 api 代码,最新的是根据我的要求显示的,
我有一张 table ,说 table 的描述为: | ID | SNO | c1 | c2 | c3 | ___________________________________ |
我有两个大小相等的向量,例如 A=[2.29 2.56 2.77 2.90 2.05] and B=[2.34 2.62 2.67 2.44 2.52]. 我有兴趣在两个相同大小的向量 A 和 B 中
之前,我在这里发布了一个问题,询问有关如何从驱动器读取和写入数据的建议,而不是通过像“aaa.txt”这样的文件标签,而只是扇区..我被建议尝试阅读和写作....但新问题出现了……毛茸茸的参数 int
我想删除在给定时间段内未登录的用户,但我稍后会根据结果选择时间段。 所以我需要报告,其中我将收到过去 1 个月、2 个月...... n 个月内未登录的用户数量。 我不太清楚如何在单个 mysql 查
我是一名优秀的程序员,十分优秀!