php用正则表达抓取网页中文章(魔王想提升代码搜索效果?首先你得知道怎么才算提升)

优采云 发布时间: 2022-04-07 22:01

  php用正则表达抓取网页中文章(魔王想提升代码搜索效果?首先你得知道怎么才算提升)

  机器之心编译

  参与:魔王

  想要提高代码搜索性能?首先,您必须知道什么是改进。GitHub 团队创建 CodeSearchNet 语料库,为代码搜索领域提供基准数据集,提高代码搜索结果的质量。

  

  搜索代码以重用、调用或使用以查看其他人如何处理问题是软件开发人员每天最常见的任务之一。但是,代码搜索引擎通常不能很好地工作,并且与常规的网络搜索引擎不同,它们不能完全理解您的需求。GitHub 团队尝试使用现代机器学习技术来改进代码搜索结果,但很快意识到一个问题:他们无法衡量改进。自然语言处理领域有 GLUE 基准,但代码搜索评估领域没有合适的标准数据集。

  因此,GitHub 昨天与 Weights & Biases 合作,推出了 CodeSearchNet Challenge 评估环境和排行榜。同时,GitHub 还发布了一个大型数据集,帮助数据科学家构建适合该任务的模型,多个基线模型代表了当前的最先进水平。排行榜使用查询注释数据集来评估代码搜索工具的质量。

  代码搜索网络语料库

  创建一个足够大的数据集来训练具有专家注释的大容量模型既昂贵又不切实际,因此 GitHub 创建了一个质量较低的代理数据集。GitHub 遵循 [5, 6, 9, 11] 中的做法,将开源软件中的功能与其相应文档中的自然语言相匹配。但是,这样做需要许多预处理步骤和启发式方法。

  通过对常见错误案例的深入分析,GitHub 团队总结出了一些通用的规则和决策。

  CodeSearchNet 语料库采集过程

  GitHub 团队从开源非分叉 GitHub 存储库中采集语料库,使用 library.io 确认所有项目都被至少一个其他项目使用,并按“受欢迎程度”对它们进行排序(受欢迎程度通过星号和分叉数来衡量)当然)。然后,删除没有许可证或未明确允许重新分发的项目。然后,GitHub 团队使用其通用解析器 TreeSitter 对所有 Go、Java、JavaScript、Python、PHP 和 Ruby 函数(或方法)进行标记,并使用启发式正则表达式对与函数对应的文档文本进行标记。

  筛选

  为了生成 CodeSearchNet 挑战赛的训练数据,GitHub 团队首先考虑了语料库中收录相关文档的函数。这会产生一组 (c_i , d_i) 对,其中 c_i 是函数,d_i 是相应的文档。为了使数据更适合代码搜索任务,GitHub 团队执行了一系列预处理步骤:

  详情见过滤后的语料库和数据提取代码:

  数据集详细信息

  该数据集收录 200 万个函数-文档对和大约 400 万个没有相应文档的函数(见下表 1)。GitHub 团队将数据集以 80-10-10 的比例划分为训练/验证)。set/test set,建议用户按这个比例使用这个数据集。

  

  表 1:数据集详细信息。

  局限性

  这个数据集非常嘈杂。首先,文档和查询之间存在根本区别,因为它们使用不同的语言形式。文档通常与代码作者在编写代码的同时编写,并且倾向于使用相同的词汇表,这与搜索查询不同。其次,尽管 GitHub 团队在创建数据集的过程中进行了数据清理,但他们无法知道每个文档 d_i 描述相应代码段 c_i 的准确程度。最后,一些文档是用非英语文本编写的,而 CodeSearchNet Challenge 评估数据集主要关注英语查询。

  CodeSearchNet 基线模型

  在 GitHub 之前在语义代码搜索方面的努力的基础上,该团队发布了一组基线模型,这些模型利用现代技术来学习序列(包括类似 BERT 的自注意力模型),以帮助数据科学家开始代码搜索。

  与之前的工作一样,GitHub 团队使用代码和查询的联合嵌入来实现神经搜索系统。该架构为每种输入(自然或编程)语言使用编码器,并训练它们以使输入映射到联合向量空间。训练目标是将代码及其对应的语言映射到附近的向量,这样我们就可以嵌入查询来执行搜索,然后返回嵌入空间中“附近”的一组代码段。

  考虑到查询和代码之间更多交互的更复杂的模型当然性能更好,但为每个查询或代码段生成单个向量可以实现更有效的索引和搜索。

  为了学习这些嵌入功能,GitHub 团队在架构中加入了标准的序列编码器模型,如图 3 所示。首先,根据输入序列的语义进行预处理:将代码令牌中的标识符拆分为子令牌(例如变量camelCase变成了两个子标记:camel和case),使用字节对编码(byte-pair encoding),BPE)来分割自然语言标记。

  

  图 3:模型架构概述。

  然后使用以下架构之一处理令牌序列以获得(上下文化的)令牌嵌入。

  之后,这些令牌嵌入使用池化函数组合成序列嵌入,GitHub 团队实现了均值/最大池化和类注意力的加权求和机制。

  下图显示了基线模型的一般架构:

  

  CodeSearchNet 挑战

  为了评估代码搜索模型,GitHub 团队采集了一组代码搜索查询,并要求程序员注释查询与可能结果的相关程度。他们首先从 Bing 中采集了一些常见的搜索查询,并结合 StaQC 中的查询,总共得到了 99 个与代码概念相关的查询(GitHub 团队删除了 API 文档查询问题)。

  

  图 1:注释器说明。

  之后,GitHub 团队使用标准 Elasticsearch 和基线模型从 CodeSearchNet 语料库中为每个查询获取 10 个可能的结果。最后,GitHub 团队要求程序员、数据科学家和机器学习研究人员按照 [0, 3] 标准标记每个结果与查询的相关程度(0 表示“完全不相关”,3 表示“完全匹配” )。

  将来,GitHub 团队希望在此评估数据集中收录更多语言、查询和注释。在接下来的几个月里,他们将继续添加新数据,为下一版 CodeSearchNet 挑战赛生成扩展数据集。

  原文链接:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线