Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >算法集锦(13)|自然语言处理| Python代码的语义搜索引擎创建

算法集锦(13)|自然语言处理| Python代码的语义搜索引擎创建

作者头像
用户7623498
发布于 2020-08-04 08:11:29
发布于 2020-08-04 08:11:29
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

现代搜索引擎的力量非常强大,可以让你瞬间从互联网中获取想要的知识。但是,现有技术也存在着无法忽视的局限性,比如搜索非文字内容或者内容难以用“关键词”描述时,都难以达到预期的搜索效果。更进一步,现有搜索技术难以让用户实现“语义”搜索,即通过文字内容的意义来检索相关内容。

今天,我们分享一个简单易行的算法,可以实现对任意对象的语义搜索。具体来说,该算法创建了一个系统,可以对python代码进行语义搜索,但该方法也可以推广到其他内如(例如图片或视频等)。

搜索内容为“Ping REST api and return results”,引擎返回了合理的检索内容,尽管检索到的代码或注释中并没有包含Ping,REST或api等关键词。

该例子展示了语义搜索的强大:我们可以结合关键词以及关键词代表的意义来最大限度的找到想要的内容。语义搜索的深刻意义在于:即使我们不熟悉代码或者难以找到合适的关键词,依然可以确保用户检索到需要的内容。

创建一个共享向量空间

在深入技术细节之前,从直观上了解语义搜索是如何实现的,是非常有意义的。其中心思想是:将想要搜索的内容(如代码)变换到共享向量空间(shared vector space)中。

算法的目标是将代码映射到自然语言的向量空间中,然后利用余弦相似性(Cosine Similarity)将代表相似意义的代码聚类的一起,而不相关的内容则会分布在较远的坐标上。我们提供的方法可以利用预训练模型提取代码特征,然后再调试(fine-tuning)该模型从而实现将潜在的代码映射到自然语言向量空间。

本文将分为5个具体步骤介绍算法。下面将演示这些步骤,当您在本教程中继续学习时,这些步骤将是一个有用的参考。在完成本教程之后,有必要重新检查这个图,以确认所有步骤是如何结合在一起的。

步骤1 获得和清洗数据

BigQuery是谷歌收集和存储的开源数据集(在GitHub上),可以用于各种有趣的数据科学项目。本项目就是采用的该数据集,当您注册一个谷歌云帐户时,他们会给您300美元,这足以查询此练习的数据。获取这些数据非常方便,因为您可以使用SQL查询来选择要查找的文件类型,以及关于repos的其他元数据。

收集这些数据之后,我们需要将这些文件解析为code-docstring(代码、文档字符串)对。对于本教程,一个代码单元将是顶级函数或方法。我们将匹配后的code-docstring对作为模型的训练数据,以便对代码进行处理(稍后将详细介绍)。我们还去掉了所有注释,只保留代码。这项工作任务量很大,但在Python的标准库中有一个名为ast的程序库,它可以用来提取函数、方法和文档字符串。利用ast库,我们可以先将代码转换成抽象语法树(Abstract syntax tree,AST),然后再使用Astor库将AST反转换成代码,从而达到从代码中删除注释的目的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def tokenize_docstring(text):
    """Apply tokenization using spacy to docstrings."""
    tokens = EN.tokenizer(text)
    return [token.text.lower() for token in tokens if not token.is_space]
def tokenize_code(text):
    """A very basic procedure for tokenizing code strings."""
    return RegexpTokenizer(r'\w+').tokenize(text)
def get_function_docstring_pairs(blob):
    """Extract (function/method, docstring) pairs from a given code blob."""
    pairs = []
    try:
        module = ast.parse(blob)
        classes = [node for node in module.body if isinstance(node, ast.ClassDef)]
        functions = [node for node in module.body if isinstance(node, ast.FunctionDef)]
        for _class in classes:
            functions.extend([node for node in _class.body if isinstance(node, ast.FunctionDef)])
        for f in functions:
            source = astor.to_source(f)
            docstring = ast.get_docstring(f) if ast.get_docstring(f) else ''
            function = source.replace(ast.get_docstring(f, clean=False), '') if docstring else source
            pairs.append((f.name,
                          f.lineno,
                          source,
                          ' '.join(tokenize_code(function)),
                          ' '.join(tokenize_docstring(docstring.split('\n\n')[0]))
                         ))
    except (AssertionError, MemoryError, SyntaxError, UnicodeEncodeError):
        pass
    return pairs

我们将数据分为训练集、验证集和测试集,以便开展模型训练。为了追踪每个(代码、文档)对,算法中特意设置了lineage文件。

步骤2: 利用Seq2Seq模型创建代码摘要

可以采用GitHub issue summarizer 来创建sequence-to-sequence模型来总结代码。不同的是这里用python代码替代issues数据,用文档字符串代替issue标题。

但是,与GitHub的issue文本不同,代码不是自然语言。为了完全的显现代码中蕴含的信息,我们的采用了领域指定优化(domain-specific optimizations)方法,比如tree-based LSTM和语法标记策略(syntax-aware tokenization)。采用上述方法,我们可以很便捷的将代码像自然语言一样处理,并获得合理的结果。

我们训练issue summarizer模型的目的不是对代码进行汇总,而是从中提取代码的特征。从技术上讲,该步骤是可选的,我们可以直接跳过该步骤,直接进行模型权重初始化或以下流程。

在后面的步骤中,我们将从这个模型中提取编码器并对它进行微调以完成另一个任务。下面是这个模型的一些输出示例:

可以看到,虽然结果并不完美,但却有力的证明了模型已经学会从代码中提取一些语义意义,这是我们完进行这项任务的主要目标。我们可以使用BLEU度量对这些模型进行定量评估。

需要指出的是,训练Seq2Seq模型以建立代码摘要,并不是构建代码特征提取器的惟一技术。例如,您还可以训练一个GAN,并使用鉴别器作为特征提取器。

步骤3: 训练语言模型来编码自然语言语句

我们已经构建了一种将代码表示为向量的机制,那么就需要一种类似的方法来编码自然语言语句(Nature Language Phrase)。

有许多通用的的模型可以产生高质量的语句嵌入(也称为句子嵌入)。例如,谷歌的通用语句编码器(可以在Tensorflow Hub上获取),实现证明该编码器在许多现实的应用中都工作得很好。

这些预训练的模型不仅很方便,而且可以通过微调获取指定区域的词汇表和文档字符串的语义信息。可以用来实现语句嵌入的方法很多,简单的方法如平均词向量(averaging word vector),而那些用于构建通用语句编码器的方法则相对复杂些。

本算法使用了AWD LSTM生成语句嵌入的神经网络模型。该过程通过fast.ai库实现,该程序库提供了非常便捷和快速的方式来创建我们需要的模型。

构建语言模型时,需要仔细考虑用于训练的语料库。通常,使用与待解决问题相关的语料库是最理想的选择,以便能够充分捕获相关的语义和词汇表。对于本算法,stack overflow数据集是一个很适用的语料库,因为它包含了大量的代码讨论的内容。然而,为了保持本算法的简单性,我们采用文档字符串(docstrings)用作我们的语料库。这是次优的,因为关于堆栈溢出的讨论通常包含比一行docstring中更丰富的语义信息。如果读者感兴趣,可以将本算法使用其他语料库进行训练,并检验对最终结果的影响。

在训练语言模型之后,下一个任务是使用这个模型为每个句子生成一个嵌入(embedding)。一种常见的策略是总结语言模型的隐藏状态,例如采用concat pooling方法。然而,为了简单起见,我们将对所有隐藏状态进行平均处理。

下面的代码,可以实现从fast.ai语言模型中提取隐含状态的平均值。

评估语句嵌入的一个好方法是测量这些嵌入对诸如情感分析、文本相似性等下游任务的有效性。通常,可以使用通用基准来度量嵌入的质量。但是,该策略可能不适合本算法,因为我们的数据是来源于特定领域的。现阶段,我们还没有为代码语义查询设计出可以开源的下游任务。在现有情况下,我们只能通过预先的判定来检查语句之间的相似性,来判断这些嵌入是否包含语义信息。

下图展示了一些示例,我们在向量化的docstring中搜索用户提供的短语的相似性。

需要注意的是,这只是一个合理性检查—更严格的方法是度量这些嵌入对各种下游任务的影响,并使用它对嵌入质量形成更客观的意见。

步骤4: 将代码向量和自然语言映射到相同的向量空间

步骤4的流程图如下所示。

本步骤中,我们在步骤2中的seq2seq模型中加入Dense Layers层,通过微调使模型可以进行docstring嵌入预测。

在训练这个模型的冻结版本之后,我们解冻所有的层并且训练这个模型几个周期,这有助于微调模型对这个任务的表现。

最后,我们希望对代码进行矢量化,以便构建搜索索引。出于评估目的,我们还将对不包含docstring的代码进行矢量化,以便查看此过程如何很好地推广到我们尚未看到的数据。

步骤5: 创建语义搜索工具

本步骤中,我们结合前面提到的方法来创建一个搜索索引。

在步骤4中,我们向量化了所有不包含任何docstring的代码。下一步是将这些向量放到一个搜索索引中,以便快速检索最近的匹配。实现该功能的一个可行方法是采用python库中的nmslib函数。

构建代码向量搜索索引后,需要一种方法将字符串(查询)转换为向量。为此,可以使用步骤3中的语言模型。为了简化这个过程,我们在lang_model_utils.py 中提供了一个helper类(Query2Emb)。

最后,一旦我们能够将字符串转换为查询向量,我们就可以为这个向量获取最近的匹配对,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
idxs, dists = self.search_index.knnQuery(query_vector, k=k)

搜索索引将返回两个条目:

(1)一个索引列表,这些索引是数据集中最近匹配的整数位置

(2)这些邻匹配与查询向量的距离(这里定义索引使用余弦距离)。有了这些信息之后,就可以直接构建语义搜索了。详见代码中的Build Search Index.ipynb。

最后,向您展示下利用本算法实现的代码语义搜索效果。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 决策智能与机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【python】教你彻底了解Python中的自然语言处理(NLP)
​​​自然语言处理(Natural Language Processing,简称NLP)是人工智能的一个重要分支,旨在通过计算机理解和生成人类语言。在Python中,有许多强大的库和工具可以用于自然语言处理。本文将深入探讨Python在自然语言处理中的应用,涵盖自然语言处理的基本概念、常用的NLP库、文本预处理、词嵌入与特征提取、文本分类、情感分析、命名实体识别,以及一些实际应用示例。
E绵绵
2025/05/25
1700
KG4Py:Python代码知识图谱和语义搜索的工具包
现在的项目程序中存在着大量重复的代码片段,尤其是在软件开发的时候。在本文中,我们提出了一个工具包(KG4Py),用于在GitHub存储库中生成Python文件的知识图谱,并使用知识图谱进行语义搜索。在KG4Py中,我们删除了31.7万个Python文件中的所有重复文件,并通过使用具体语法树(CST)构建Python函数的代码知识图谱来执行这些文件的静态代码分析。我们将预先训练的模型与无监督模型集成后生成新模型,并将该新模型与代码知识图谱相结合,方便搜索具有自然语言描述的代码片段。实验结果表明,KG4Py在代码知识图谱的构建和代码片段的语义搜索方面都取得了良好的性能。
一点人工一点智能
2022/12/24
2.3K0
KG4Py:Python代码知识图谱和语义搜索的工具包
用自然语言从GitHub搜代码,跳过论坛提问环节,来自Facebook新研究
如果你是个Android入门开发者,去Stack Overflow论坛去寻找上非常热门的Android开发问题,很快会有别人贴出一段代码。
量子位
2019/07/08
7400
用自然语言从GitHub搜代码,跳过论坛提问环节,来自Facebook新研究
关于自然语言处理,数据科学家需要了解的 7 项技术
现代公司要处理大量的数据。这些数据以不同形式出现,包括文档、电子表格、录音、电子邮件、JSON以及更多形式。这类数据最常用的记录方式之一就是通过文本,这类文本通常与我们日常所使用的自然语言十分相似。
CDA数据分析师
2020/05/06
1.2K0
《自然语言处理实战课程》---- 第一课:自然语言处理简介
大家好,今天开始和大家分享,我在自然语言处理(Natural Language Processing,NLP)的一些学习经验和心得体会。
流川疯
2019/04/17
2.4K0
《自然语言处理实战课程》---- 第一课:自然语言处理简介
使用Sentence Transformers和Faiss构建语义搜索引擎
介绍 您是否曾经想过如何使用Sentence Transformers创建嵌入向量,并在诸如语义文本相似这样的下游任务中使用它们在本教程中,您将学习如何使用Sentence Transformers和Faiss构建一个基于向量的搜索引擎。代码地址会在本文的最后提供 为什么要构建基于向量的搜索引擎? 基于关键字的搜索引擎很容易使用,在大多数情况下工作得很好。你要求机器学习论文,他们会返回一堆包含精确匹配或接近变化的查询结果,就像机器学习一样。其中一些甚至可能返回包含查询的同义词或出现在类似上下文中的单词的结
deephub
2020/11/17
2.6K0
使用Sentence Transformers和Faiss构建语义搜索引擎
实例+代码,你还怕不会构建深度学习的代码搜索库吗?
本文展示了一个端到端的实例,说明如何构建一个可以语义化搜索对象的系统。项目作者是 Hamel Husain (https://www.linkedin.com/in/hamelhusain/) 和 Ho-Hsiang Wu 。
AI研习社
2018/08/16
9780
实例+代码,你还怕不会构建深度学习的代码搜索库吗?
《精通Python自然语言处理》高清pdf 分享
一句话评价: 这可能是市面上(包括国外出版的)你能找到最好的讲python自然语言处理的书了
程序喵
2019/06/27
2.4K0
《精通Python自然语言处理》高清pdf 分享
自然语言处理基础:上下文词表征入门解读
摘要:这篇介绍论文的目的是讲述如何让计算机处理语言的故事。这是自然语言处理(NLP)领域的一部分,而 NLP 又是人工智能的一个分支领域。本文的目标是让广泛的受众都能获得对计算机编程的基本理解,但其中避免了详细的数学描述,并且不会给出任何算法。本文的重点也并非 NLP 的任何特定的应用,比如翻译、问答或信息抽取。这里给出的思想经过了许多研究者数十年的发展,所以引用的文献并非详尽无遗,但能为读者指出一些在作者看来影响深远的论文。在读完本文之后,你应当会有对词向量(也被称为词嵌入)的大致理解:它们为何存在、它们解决的是什么问题、它们来自何处、它们如何随时间变化、有关它们还有那些有待解决的问题。建议已经熟悉词向量的读者跳至第 5 节查看有关当前最新进展「上下文词向量」的讨论。
机器之心
2019/03/12
8480
自然语言处理基础:上下文词表征入门解读
自然语言处理(NLP)学习路线总结
NLP是自然语言处理(Natural Language Processing)的缩写,它是计算机科学领域中专注于研究如何使计算机理解、生成和处理人类语言的学科。NLP涉及的技术包括但不限于分词、词性标注、句法分析、语义分析、机器翻译、情感分析、信息抽取、文本生成等。通过NLP,计算机可以处理和分析大量的文本数据,帮助人们更好地理解和应用语言信息。
机器学习AI算法工程
2024/07/04
1.3K0
自然语言处理(NLP)学习路线总结
【一文讲解深度学习】语言自然语言处理(NLP)第一篇
NLP(Nature Language Processing,自然语言处理)是计算机及人工智能领域的一个重要的子项目,它研究计算机如何处理、理解及应用人类语言。是人类在漫长的进化过程中形成的计算机语言复杂的符号等系统(类似C/Java的符号等系统)。以下是关于自然处理的常见定义:
苏州程序大白
2022/04/14
1.7K0
【一文讲解深度学习】语言自然语言处理(NLP)第一篇
Python自然语言处理工具小结
来源:http://www.cnblogs.com/baiboy/p/nltk2.html
小小科
2019/08/21
1.2K0
使用BERT和TensorFlow构建搜索引擎
基于神经概率语言模型的特征提取器,例如与多种下游NLP任务相关的BERT提取特征。因此它们有时被称为自然语言理解(NLU)模块。
代码医生工作室
2019/07/05
2K0
使用BERT和TensorFlow构建搜索引擎
5个Python库可以帮你轻松的进行自然语言预处理
自然语言是指人类相互交流的语言,而自然语言处理是将数据以可理解的形式进行预处理,使计算机能够理解的一种方法。简单地说,自然语言处理(NLP)是帮助计算机用自己的语言与人类交流的过程。
deephub
2021/05/18
9930
了解AIGC——自然语言处理与生成
近年来,AIGC(AI Generated Content)技术迅猛发展,自然语言处理(Natural Language Processing, NLP)与生成技术的结合,使得机器不仅能够理解人类语言,还能进行文本的创作和生成。这一能力广泛应用于文本创作、对话系统、语言翻译、内容推荐等场景。本文将深入探讨自然语言处理与生成的核心技术、关键模型,以及如何通过代码实现一些重要功能。
hope kc
2024/11/21
2330
【精品】NLP自然语言处理学习路线(知识体系)
下面的鱼骨图就是个人整理的NLP相关的一个学习路线,某种意义上可以理解为一个知识体系,本文将尽量结合示例简单的去描述一下这些基本概念。
MinChess
2023/09/07
1.2K0
【精品】NLP自然语言处理学习路线(知识体系)
自然语言处理中的迁移学习(上)
本文转载自公众号「哈工大SCIR」(微信ID:HIt_SCIR),该公众号为哈尔滨工业大学社会计算与信息检索研究中心(刘挺教授为中心主任)的师生的信息分享平台,本文作者为哈工大SCIR 徐啸。
AI科技评论
2019/10/23
1.4K0
自然语言处理中的迁移学习(上)
许泽柯:腾讯云自然语言处理的技术架构与应用
2019年9月7日,云+社区(腾讯云官方开发者社区)主办的技术沙龙——AI技术原理与实践,在上海成功举行。现场的5位腾讯云技术专家,在现场与开发者们面对面交流,并深度讲解了腾讯云云智天枢人工智能服务平台、OCR、NLP、机器学习、智能对话平台等多个技术领域背后架构设计理念与实践方法。 NLP 自然语言处理技术想必大家都不陌生,NLP 可以说是 AI 领域内落地实践最广的技术之一。此次分享,将会从腾讯云NLP技术和能力矩阵出发,浅谈NLP背后的算法、原理及架构。以及在工程实践中,如何应用 NLP 来保障服务的高效及快速迭代。
腾讯云开发者社区技术沙龙
2019/09/12
2.7K0
许泽柯:腾讯云自然语言处理的技术架构与应用
CS224n 笔记1-自然语言处理与深度学习简介1 自然语言处理简介2 词向量(Word Vectors)3 基于奇异值分解(SVD)的方法4 基于迭代的算法-Word2vec
1 自然语言处理简介 我们从讨论“什么是NLP”开始本章的内容 1.1 NLP有什么特别之处 自然(人工)语言为什么如此特别?自然语言是一个专门用来表达语义的系统,并且它不是由任何形式的物质表现产生。正因为如此,人工语言与视觉或者其他任何机器学习任务非常不同。 大多数单词只是一个超语言实体的符号:单词是映射到一个表征(想法或事物)的记号。例如,“火箭”一词是指火箭的概念,并且进一步可以指定火箭的实例。有一些单词例外,当我们使用单词和字母代表信号时,想“Whooompaa”一样。除此之外,语言符号可以用多种方
致Great
2018/04/11
1K0
CS224n 笔记1-自然语言处理与深度学习简介1 自然语言处理简介2 词向量(Word Vectors)3 基于奇异值分解(SVD)的方法4 基于迭代的算法-Word2vec
【Python环境】Python自然语言处理系列(1)
一:python基础,自然语言概念 from nltk.book import* 1,text1.concordance("monstrous") 用语索引 2,text1.similar("best") 3,text2.common_contexts(["monstrous","very"]) 4,text4.dispersion_plot(["citizens","democracy", "freedom", "duties","America"]) 5,text3.generate() 6,
陆勤_数据人网
2018/02/27
9130
【Python环境】Python自然语言处理系列(1)
推荐阅读
相关推荐
【python】教你彻底了解Python中的自然语言处理(NLP)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验