1.ViGA:一种介于强弱监督之间的源码视频片段检索范式
2.Python爬虫 | JSON字段的高效自动化提取
ViGA:一种介于强弱监督之间的视频片段检索范式
在SIGIR 上,我们的源码研究"Video Moment Retrieval from Text Queries via Single Frame Annotation"凭借所有评审的通过顺利录用,主要贡献在于提出了一种基于单帧标注的源码视频片段检索新范式,以及为该范式设计了一个初步的源码对比学习框架。以下是源码文章精华要点概述,欢迎感兴趣的源码捕鱼 游戏源码朋友深入阅读: 我们的项目已公开所有源代码、annotations和预训练模型,源码详情如下:论文链接:
代码链接:
视频片段检索,源码即Video Moment Retrieval(VMR),源码目标是源码从视频中根据自然语言描述找到相关片段。相较于早期的源码Video Action Localization(VAL),VMR更具挑战性,源码因为它需要定位无固定类别的源码自然语言描述。早期研究主要采用全监督,源码成本高昂且标注复杂。源码年,预定源码下载弱监督VMR出现,只需标记视频与查询的对应关系,降低了标注难度,但效果相对有限,通常采用对比学习。 我们的新方法——Glance Supervised VMR,创新地引入了"glance"标注,仅需标注者观看视频并记录任意帧的时间戳,既节省了标注时间,又提供了额外信息。在此基础上,我们构建了基于对比学习的框架ViGA,利用自监督学习策略优化模型,并通过改进的sliding window方法和注意力机制,使模型能更精确地定位关键帧。拍卖类源码 实验结果在Charades-STA、ActivityNet Captions和TACoS等常用数据集上显示,ViGA在弱监督方法中表现出色,与部分全监督方法相当,但仍是初步探索。我们期待更多在这个"glance supervision"设置下的创新方法出现。Python爬虫 | JSON字段的高效自动化提取
关键词:爬虫、JSON格式、深度优先搜索、Python变量id、注入攻击、毕导
写在前面
这个寒假一直在做Twitter平台的爬虫,为女朋友的硕士毕业论文准备数据集。尽管Twitter对我国开发者极其不友好,经过了十多天的kali镜像源码艰苦奋战,我不仅达成了除夕夜敲代码守岁的成就,也对Twitter平台了如指掌:编译了多篇核心文档,实现了爬虫、防御、数据库备份与更新、统计分析、文档更新全流程的自动化,保持三种爬虫路线并行推进。考虑到对论文知识产权的保护,这些内容暂时不会开源,但我会挑其中一些有趣的技术分享给大家。
问题背景
今天,给大家分享一下JSON字段的自动提取技术。在引入这个问题定义之前,先带大家熟悉一下问题背景,互助拆分源码即一个「爬虫工程师」分析和解决问题的流程。面对一个给定的网页,和给定的目标字段,我们一般会先检查该页面是否为静态页面,以确定技术路线:
网络流量,即网页在加载过程中浏览器和网站服务器之间通信的数据,包括了浏览器的请求和服务器的响应。响应数据可能有多种类型,其中JSON是一种极为常见的格式,用来表示结构化的信息。举个例子,下面这个接口会返回「毕导」知乎主页上的前几条动态: zhihu.com/api/v3/moment...,我们可以使用开发者工具中自带的格式化功能,也可以使用 在线JSON校验格式化工具(Be JSON)对结果进行格式化,总之数据看起来是这样的:
如图所示,JSON往往采用字典或数组的多层嵌套,在实际分析中可能不太直观,甚至很啰嗦。比如我们想获取毕导第一条动态里点赞的文章的作者的用户名这个信息,则需要像这样:
假如知乎的不同接口之间格式定义不统一,或者版本升级导致接口格式变动,那么上面的流程就需要重新走一遍:先肉眼找到想要的信息,再一层一层的反向解析出这个路径,这往往很费时费力。如果毕导这个例子还觉得不是很麻烦,给大家感受一下Twitter爬虫中真实的路径:
以上路径用来获取推文作者的用户名!
问题定义
这里给出明确的问题定义:由于接口数据结构的多样性,需要一种相对自动化的方式,解析网络响应返回的JSON对象中的指定字段。
解决方案
我们可以在肉眼观察到的字段处设置一个标记,然后剩下的路径解析工作交给程序自动进行。那么如何设置这个标记呢?如果只是敲个包含特殊字符的字符串在这里,怎么保证JSON的原文中就不包含这个特殊字符?我们无法保证这个标记不被当做原文处理。于是我想到,Python中什么是唯一的?是id!
为了便于理解,我把上面毕导的例子简化了一下,假设我们手里的JSON对象有如下格式:
考虑以下程序,我们把作者的用户名位置用一个变量替代:
那么我们会发现obj中的author_name处的id会和上面定义的author_name一致,这是必然的,因为下面是对上面的空列表对象的引用。其实我们不使用列表,使用任何数据格式都可,比如让author_name=1,我们会发现它们的id仍然保持一致。
如果把id理解为指针,则他们都指向了1所在的数据单元的地址,由于这个1是在栈空间中分配的常量,所以所有变量在赋值为1的时候都会去查常量表,并复用这个地址。这样的话,如果我们想同时标记多个字段的位置,就无法区分它们了,所以这里我们使用空列表,它在堆上构造时总会开辟新的空间,拥有新的唯一的id。
那么接下来,我们只需要使用深度优先搜索(DFS)去查找id匹配的对象即可,在查找的过程中将路径记录下来:
到这里已经实现了功能的核心,但是不够优雅,毕竟我们还得在函数外面手动定义标记变量。但不定义变量,在模板中直接引用就会出现变量未定义的报错。一个较为优雅的思路就是将模板写成匿名函数(为了说明多个标记的工作原理,我这里又加了一个字段badge_desc,用来标记知乎认证用户的认证描述)
我们把这个函数作为参数传进去,在内部为它自动生成标记变量:
注意我们使用了Python的eval函数,一定要重视它带来的注入攻击风险,比如你的好朋友得知你看了清川的文章、自己实现了JSON自动解析器,就拿了一段恶意的obj模板让你解析:
但一般的网站不会想这么远,去专门攻击一个使用了解析器的开发者,所以这里只是提个醒。接下来我们增加一些细节,让解析器支持传入JSON对象、原文字符串和文件名:
另外由于JSON和Python中的语法关键字稍有区别,我们需要定义一些常量:
效果演示
最后我们看一下使用时的效果:
源码链接
完整的代码已经放在这里了: github.com/ThomasAtlant...
另外解析JSON的库,还推荐使用JSONPath,虽然不能实现本文的功能,但也会提升效率: blue-avatar:IDEA .1 JSONPath, JSON Lines 功能初体验。此外也可以关注JSON的扁平化,以及尝试开发GUI选择字段的功能,我貌似在网上见到过类似的在线网站,但那个网站只支持一层展开,不能解决复杂的嵌套结构。