精华内容
下载资源
问答
  • 1.N-Grams语言模型 1.1 基本概念 定义:一个N-gram就是一个由句子中连续单词构成的序列,其中N表示该序列中单词个数 三种常见n-gram: Unigrams:一个单词构成一个序列 Bigrams:两个连续单词构成一个序列 ...

    1.N-Grams语言模型概述

    1.1 基本概念

        定义:一个N-gram就是一个由句子中连续单词构成的序列,其中N表示该序列中单词个数

        三种常见n-gram:

                Unigrams:一个单词构成一个序列

                Bigrams:两个连续单词构成一个序列

                Trigrams:三个连续单词构成一个序列

            例:

                

        功能:

            (1)计算句子概率

            (2)根据上文来估计下一个单词的概率

            

        应用:

            语言识别、拼写纠正、辅助沟通系统...

            

        句子自动补全:

            (1)对文本进行预处理,使其适用于N-gram模型

            (2)处理字典外单词

            (3)平滑处理

            (4)语言模型评估

            

    1.2 N-grams与概率

        序列表示:

            定义:用W_i表示句子中的第i个单词,以此来代指整个句子

               

            表示方法: ,上标 i 表示序列长度;下标 j 表示起始位置

            例:W_1^m即表示从句子中第一个单词开始,取之后连续m个单词

                

        概率计算:

            (1)Unigram概率计算:

                方法:单词出现次数 / 句子长度,即单个单词的出现概率

                   

                例:

                   

            (2)Bigram概率:

                方法:两个单词一起出现的次数除前一个单词出现的次数

                    

                例:

                   

            (3)Trigram概率:

                方法:三个单词一起出现的次数除前两个单词一起出现的次数

                   

                例:

                   

            (4)N-gram probability:

                方法:n个单词一起出现的次数除前n-1个单词一起出现的次数

                   

    1.3 序列概率(Sequence Probabilities)

        序列概率:

            功能:计算整个句子(序列)的概率

               

            方法:根据链式法则,依次计算条件概率

               

            例:

               

            问题:句子较长部分可能不在语料库中,因此其出现次数为0,导致整个句子概率为0

               

        马尔可夫假设:

            定义:对于一个句子概率,只有最后N个单词重要,因此可以只考虑最后N个单词来近似计算整个句子的概率

            功能:近似计算整个句子的概率,从而解决上述问题

            

            例:

               

    1.4 起始符与终止符

        起始符:

            功能:统一计算方法,使得无需对第一个单词进行单独计算

                

            方法:N-gram模型中,前加N-1个起始符

                

        终止符:

            方法:不管N为多少,只在句尾加一个终止符

                

        例子:

            包含起始符与终止符情况下计算句子概率

           


    2.N-Gram语言模型的构建与评估

    2.1 整体流程

        整体流程:

            构建计数矩阵

            构建概率矩阵

            构建语言模型

            引入对数概率

            应用语言模型生成句子

            

    2.2 具体流程

        (1)构建计数矩阵:

            方法:统计各n-gram出现次数

            

        (2)构建概率矩阵:

            方法:将计数矩阵中各元素除以各行总数和得到概率矩阵

            

        (3)概率矩阵与语言模型:

            方法:通过概率矩阵,即可计算句子概率和下一个单词的概率

            

        (4)对数概率:

            原因:计算中很多<1的数连乘,可能造成数值下溢,因此使用对数概率避免该问题

            

        (5)应用语言模型生成句子:

            方法:选择起始符,通过概率矩阵选择下一个概率最高词,直到选择了终止符,句子生成结束

            

    2.3 模型评估

        测试集:

            定义:将语料库划分为训练集与测试集

                

            拆分方法:

                (1)连续划分

                (2)随机划分

                

        困惑度(Perplexity):

            定义:一种评价句子语义清晰度的指标,困惑度越小句子语义越清晰,模型越好

            计算方法:

                    

            例:bigram的困惑度计算

                

            性质:

                

            例子:

                

        对数困惑度(Log perplexity):

            定义:对困惑度取对数

            计数方法:

                

        例子

            可以看出N越大句子的困惑度越小,其语义越清晰

               


    3.特殊情况处理

    3.1 对词汇表外单词的处理

        未知词:

            定义:不存在于字典中的词

            解决:使用<UNK>标识符代替

                

        未知词处理:

            步骤:

                (1)创建词汇表

                (2)对于未知词(即不在词汇表中的词),使用<UNK>标识符代替

                (3)计算<UNK>和其他词的概率

                

            例子:

                

        构建词汇表:

            规定最小词频:即一个单词最少要在语料库中出现多少次才能被加入词汇表

            

    3.2 对不存在序列的处理

        原因:

            不存在的N-grams会导致出现0,又由于进行连乘操作会使最终句子概率变为0

                

        平滑法(Smoothing):

            方法:通过分子分母同加一个数来进行平滑,消除出现0的可能

                

        回退法(Backoff):

            方法:当n-gram找不到时,进行回退,找(n-1)-gram

               

        插值法(Interpolation):

            方法:给不同的n-gram设置不同的权重\lambda,且各\lambda之和为1,n越大权重越大,用加法代替连乘

               


    项目代码:https://github.com/Ogmx/Natural-Language-Processing-Specialization

    可将代码与数据下载至本地,使用jupyter notebook打开

    展开全文
  • 文本补全

    2020-03-04 12:57:12
    fre.append(simple_trie.dic[word][one][word + one])##由于是只补全一个字,所以沿伸出一个字符就好 dd = dict(zip(words, fre)) dd = sorted(dd.items(), key=lambda x: x[1], reverse=True) return dd ...

    总体思路:

    1. 通过一段文本,获取ngram词汇组合,如果是多gram组合,分别做ngram再组合更清晰。

    2. 使用ngram构建一个字典树

    3. 输入一个字,获取下一个字的词频排序。

    如下为核心代码部分

    1. 取ngram代码:

    def get_ngram(line, num):
        temp_ngram=[]
        for pos in range(0, len(line)-num+1):#由于是+num选区且左开右闭,所以避免出界而-num,避免下文patch选取少一个而+1
            line_patch=line[pos:pos+num]## 从pos位置开始,每num个长度节选一个path
            temp_ngram.append(line_patch)
        return temp_ngram

    2. 构建trie树,还是不能够细致地想,得宏观是思考,不然会很绕。[参考了苏神的代码https://spaces.ac.cn/archives/4256]

    class SimpleTrie:
        def __init__(self):
            self.dic={} #初始化一个词典树
        def add_dict(self,word):
            _=self.dic # _表示当前的临时空间,把全局的dic赋值过来
            for c in word: #(假设word="我们")
                if c not in _: # "我" 不在词典中
                    _[c]={} ## 给"我"构建一个词典
                _=_[c] ##并插入词典///同时如果在词典中找到了"我",则直接插入到当下"我"的临时空间下
            ## 此时插入后,词典中必然有一个{"char":{}},此时_代表了这个临时空间,这个时候放入整个单词的词频即可。
            if word in _:# 当一个单词遍历完之后,对整个单词进行判断,存放到上一步的{}中
                _[word]+=1
            else:
                _[word] = 1

    3. 获取下一个字符,这里主要是返回一个字频排序

    def get_nextword(word):
        word_next = []
        words = []
        fre = []
        for one in simple_trie.dic[word]:
            words.append(one)
            fre.append(simple_trie.dic[word][one][word + one])##由于是只补全一个字,所以沿伸出一个字符就好
        dd = dict(zip(words, fre))
        dd = sorted(dd.items(), key=lambda x: x[1], reverse=True)
        return dd

    应该还有别的思路,主要是练习从苏神代码中学习到的字典树。

    完整代码在: https://github.com/mathCrazyy/NLP-tiny-code/tree/master/code

    展开全文
  • emacs补全

    千次阅读 2013-07-24 11:04:33
    前两种补全可应用于任 何文字的输入,第三种补全只针对具有固定语法的编程语言。默认情况下(不安装任何插 件),emacs提供基本的前缀补全和模板补全功能,虽然这两种补全相对于普通的编辑器 已经能够较为

    原文地址: http://blog.csdn.net/astropeak/article/details/6666527


    emacs中的补全大致可为三类:前缀补全、模板补全和语义补全。前两种补全可应用于任 何文字的输入,第三种补全只针对具有固定语法的编程语言。默认情况下(不安装任何插 件),emacs提供基本的前缀补全和模板补全功能,虽然这两种补全相对于普通的编辑器 已经能够较为有效得提高输入效率,但其完成方式仍不够人性化,并且对于某些高级的补 全功能,仍然无法完成。但emacs素来是以可扩展性著称的,存在大量优秀的插件可用来 增强它的能力。对于补全,可用的插件自然也不少。在这些插件的“辅佐”下,emacs的补 全能力可以说非常强悍。

    1. 基本补全功能
      1. 前缀补全

        前缀补全在emacs文档中又被称为动态补全,是指在输入若干个字母后,便可对这 几个字母进行补全,补全候选结果将来源于当前所有缓冲区中的单词,这些单词以 所输入的字母序列打头。补全的操作过程为:

        输入若干个字母(至少一个),然后按下动态补全命令(dabbrev-expand)对应快 捷键,则第一个补全候选结果将被显示出来。此时若该结果是目标单词,则可直接 继续后续的输入;若该结果不是想要的单词,需再按下补全快捷键,则下一个候选 结果被显示,重复這一步骤,直到找到所需的单词。emacs将优先显示离光标最近 的那个单词,因此,若目标单词离当前位置较远或在另一缓冲区中,则可能需要较 多的按键次数才能找到目标单词。

        • 优点

          实现“一次输入,多次补全”的输入方式,这一点(尤其)对于较长单词(如程序 中较长的变量名,函数名等)的输入将带来极大的便利,同时也可避免一个单词 多次输入时拼写错误的问题。

        • 不足

          补全时补全候选列表不可见,难以预知目标单词在其中的位置,在候选结果较多 时,容易出现多按一次快捷键而错过目标结果的情况,此时只能重新进行补全, 因补全的搜索顺序不可逆。

      2. 模板补全

        默认情况下的模板补全通过缩写模式(abbrev-mode)完成,因此要实现模板补全, 需处于该模式下。模板补全的原理为:所有模板被保存在一个文件中,当输入模板 名,按下任意非文字字符后,则该模板名将被替换为模板的内容。

        模板可在输入的过程中创建。例如若想创建一个名为“def”,内容为“#define ”的 模板,则首先在任何位置输入“def”,然后按下快捷键“C-x a i l”,则emacs会提 示输入模板内容,然后输入“#define ”,按回车,则该模板被创建。以上快捷键实 际调用的命令为"inverse-add-mode-abbrev",即将这个模板插入到当前模式的模 板列表中,因此这个模板只能在当前模式下使用。若想定义一个全局可见的模板, 则可使用命令: inverse-add-global-abbrev,对应的快捷键为“C-x a i g”。

        若想输入模板名本身,而非将其替换为模板内容,可在输入模板名后按下“C-q”, 则模板名将不会被替换为模板内容。

        • 优点

          对于需要经常输入的大段内容,作为模板输入,将有效提高输入效率。

        • 不足

          无法控制光标的位置,替换完成后,光标总是位于模板内容之后(因此这里的模 板并不是真正的模板,仅仅是一个缩写)。

    2. yasnippet插件——模板补全

      yasnippet插件是所有模板补全类插件中功能最强的一个,用该插件几乎可以完成任何 能够想象的模板任务。yasnippet预置了很多模板,其中包括十几种编程语言、latex 源文件和基本文本所需的模板。利用这些模板,可以极大的提高输入效率。

      yasnippet提供的模板非常智能,模板可实现光标的定位,并且支持变量。变量用于处 理模板中内容可能发生变化的那些内容。可以为变量提供一个默认值,并且默认值可 动态的产生:即通过检测当前所处环境,自动生成用户期望的值。一个变量可以成为 另一个变量的印像,即该变量追随另一个变量内容的变化。通过光标定位,可方便地 在各个变量位置切换,从而使光标只停留在模板中需要编辑的位置。

      以一个实际例子来说:若在C程序中定义一个结构体,可先输入struct(struct被 yasnippet定义为一个模板),按下TAB键后,则struct将被扩展为以下内容:

      struct Name {

      }

      同时光标停留在“Name”处。“Name”处存在一个变量,“Name”为该变量的默认值(此处仅 仅用于提示用户输入结构体名),此时可直接输入结构体名(“Name”会自动消失, 但 若直接按下TAB键,则“Name”将被保留,光标跳转至下一变量处),然后按下TAB键,则 光标跳转到结构体内的空行,此时便可进行后续的输入工作。这个例子比较简单,但较 好的表现了yasnippet模板的基本特性。利用这些特性,便可以完成非常多的任务。

      关于yasnippet的其它细节功能可以通过查看模板源文件得到了解。可以编写自己的模 板(实际中总需要如此),并且并不困难。对照已有模板及手册,几分钟便可以编写 一个自己的模板。一个比较实用的需要自己编写的模板为(针对C程序):大多数常用 函数的模板(默认仅提供printf和fopen两个函数的模板)。

      对于yasnippet,还没有发现有什么明显的不足,实际上,个人觉得这个插件实在是太 棒了,太实用了,因为它可能将是所用补全功能中最常用的功能。有了这个补全插件,默 认的模板补全可以丢掉了。

    3. gccsense插件和semantic插件——语义补全

      这两个插件均用于语义补全,该要用于编程语言中结构体或类变量的成员的补全。二 者实现的效果非常接近,因此可以任选其一。但gccsense只支持C、C++两种语言,因 此对于其它语言,只能选择semantic。这两个插件的安装、配置均不简单。gccsense 的安装比较复杂,需要安装多个程序,安装过程需要将近半个小时,但配置较简 单;semantic的安装不算简单,但配置困难,很可能发生配置完后却无法完成补全的 情况。另外,gccsense需要使用其提供的包装程序gccrec预编译一次源程序,才能获 得补全信息,semantic则可自动检测到补全信息(但经过实际使用,gccsense的预编 译并不是必须的,不知是否是由于版本提升的原因)。

      这两个插件对于补全功能的贡献并不大,但却要耗费较多的精力去安装、配置它们, 性价比不高。此外,它们均与auto-complete插件配合使用更有威力。

    4. auto-complete插件

      auto-complete(以下简称为AC)是一个“全能”的补全插件,其可完成的补全功能涵盖 了以上所述的所有功能。当然,这些功能并不完全是由它单独完成的,而是通过调用 以上所述的三个插件:yasnippet、gccsense和semantic,作为它们的前端完成相应的 补全功能。此时这三个插件的补全方式将呈现基本相同的方式,这将给实际的补全操 作带来便利,因为所有操作都将是统一的。此外,AC还提供自己独有的补全功能,这 些包括:

      • 字典补全。即通过查字典实现单词的补全,而非仅仅查询当前缓冲区中单词。AC预 置了一些字典,主要为编程语言的关键字、大量elisp函数名。用户也可定义自己的 字典,只需将字典条目保存在 "~/.dict"文件中即可。
      • 文件目录补全。当输入字符“/”或“~/”时,AC将尝试对其进行目录补全。

      AC的运行机制是:将缓冲区、字典中所有单词、yesnippet的所有模板名以及gccsense 或semantic的所有可能补全项均作为补全对象。按上TAB键可在这些候选补全对象间切 换(同时提供两个快捷键 M-p和M-n,用于选择前一个或下一个候选对象),按下 ENTER键确认补全。补全完成后,若该补全对象为yasnippet的模板名,则进一步触发 模板的替换。对于gccsense或semantic的语义补全的处理略有不同,该补全均在输入 “.”或“->”后被触发。因此,AC无法直接在输入以上字符后触发gccsense和semantic的 语义补全。但这可通过编写一个函数实现,即将“.”和“>”绑定到AC的相应触发函数上。 对应的代码如下:

      对于gccsense:

      (defun ac-complete-gccsense-self-insert (arg) (interactive "p") (self-insert-command arg) (ac-complete-gccsense))

      (defun my-c-mode-ac-complete-hook () (local-set-key "." 'ac-complete-gccsense-self-insert) (local-set-key ">" 'ac-complete-gccsense-self-insert))

      (add-hook 'c-mode-common-hook 'my-c-mode-ac-complete-hook)

      对于semantic:

      与gccsense基本相同,只需将第一个函数中的(ac-complete-gccsense)换为 (ac-complete-semantic)即可。

      AC非常强大,它使所有的补全功能的实现方式得到统一,同时额外提供一些实用的补 全功能。

    5. 总结

      在yasnippet、gccsense/semantic和auto-complete三大插件的辅助下,emacs将具有 非常强悍的补全能力。尽情享受吧!


    展开全文
  • 一、文本处理流程 文本清洗:html标签与转义字符、多余空格、根据需要清除邮箱、账号、网址、手机号、作者信息等信息 预处理:去除停用词、加载自定义词库(实体词库、垂直领域词库)、分词 特征提取:...

    一、文本处理流程

    1. 文本清洗:html标签与转义字符、多余空格、根据需要清除邮箱、账号、网址、手机号、作者信息等信息

    2. 预处理:去除停用词、加载自定义词库(实体词库、垂直领域词库)、分词

    3. 特征提取:关键词、实体词

    4. 建模:文本分类、文本聚类、情感分析、标签提取

    5. 优化:停用词库与自定义词库清洗与丰富、文本标签清洗、模型调整

    6. 效果评估:满足线上使用要求,准确率、速度

    7. 上线部署:部署api接口

    二、NLP算法

    • 深度学习在自然语言处理当中,除了在分类问题上能够取得较好效果外(如单选问题:情感分类、文本分类、正确答案分类问题等),在信息抽取上,尤其是在元组抽取上基本上是一塌糊涂,在工业场景下很难达到实用水准
    • 目前各种评测集大多是人为标注的,人为标注的大多为干净环境下的较为规范的文本,而且省略了真实生产环节中的多个环节。在评测环节中达到的诸多state-of-art方法,在真实应用场景下泛化能力很差,大多仅仅是为了刷榜而刷榜。
    • 目前关于知识图谱的构建环节中,数据大多数都还是来自于结构化数据,半结构化信息抽取次之,非结构化数据抽取最少。半结构化信息抽取,即表格信息抽取最为危险,一个单元格错误很有可能导致所有数据都出现错误。非结构化抽取中,实体识别和实体关系识别难度相当大
    • 工业场景下命名实体识别,标配的BILSTM+CRF实际上只是辅助手段,工业界还是以领域实体字典匹配为主,大厂中往往在后者有很大的用户日志,这种日志包括大量的实体信息。因此,生产环节中的实体识别工作中,基础性词性的构建和扩展工作显得尤为重要。
    • 目前关于知识图谱推理问题,严格意义上不属于推理的范畴,最多只能相当于是知识补全问题,如评测中的知识推理任务,是三元组补全问题。
    • 目前舆情分析还是处于初级阶段。目前舆情分析还停留在以表层计量为主,配以浅层句子级情感分析和主题挖掘技术的分析。对于深层次事件演化以及对象级情感分析依旧还处于初级阶段。
    • Bert本质上仅仅是个编码器,是word2vec的升级版而已,不是无所不能,仅仅是编码能力强,向量表示上语义更为丰富,然而大多人都装糊涂。
    • 学界和业界最大的区别在于,学界以探索前沿为目的,提新概念,然后搭个草图就结束,目光并不长远,打完这一战就不知道下一战打什么,下一战该去哪里打,什么时候打,或者打一枪换个阵地再打。而业界,往往面临着生存问题,需要考虑实际问题,还是以解决实际问题为主,因此没必要把学界的那一套理念融入到生产环节中,要根据实际情况制定自己的方法
    • 利用结构化数据,尤其是百科类infobox数据,采集下来,存入到Neo4j图数据库中,就称自己建立了知识图谱的做法是伪知识图谱做法。基于这类知识图谱,再搞个简单的问答系统,就标榜自己是基于知识图谱的智能问答,实际上很肤浅。
    • 知识图谱不是结构化知识的可视化(不是两个点几条边)那么简单,那叫知识的可视化,不是知识图谱。知识图谱的核心在于知识的图谱化,特点在于知识的表示方法和图谱存储结构,前者决定了知识的抽象表示维度,后者决定了知识运行的可行性,图算法(图遍历、联通图、最短路径)。基于图谱存储结构,进行知识的游走,进行知识表征和未知知识的预测。
    • 物以稀为贵,大家都能获取到的知识,往往价值都很低。知识图谱也是这样,只有做专门性的具有数据壁垒的知识图谱,才能带来商业价值。
    • 目前智能问答,大多都是人工智障,通用型的闲聊型问答大多是个智障,多轮对话缺失答非所问等问题层出不穷。垂直性的问答才是出路,但真正用心做的太少,大多都是处于demo级别。
    • 大多数微信自然语言处理软文实际上都不可不看,纯属浪费时间。尤其是在对内容的分析上,大多是抓语料,调包统计词频,提取关键词,调包情感分析,做柱状图,做折线图,做主题词云,分析方法上千篇一律。应该从根本上去做方法上的创新,这样才能有营养,从根本上来说才能有营养可言。文本分析应该从浅层分析走向深层分析,更好地挖掘文本的语义信息。
    • 目前百科类知识图谱的构建工作有很多,重复性的工作不少。基于开放类百科知识图谱的数据获取接口有复旦等开放出来,可以应用到基本的概念下实体查询,实体属性查询等,但目前仅仅只能做到一度。
    • 基于知识图谱的问答目前的难点在于两个方面,1)多度也称为多跳问题,如姚明的老婆是谁,可以走14条回答,但姚明的老婆的女儿是谁则回答不出来,这种本质上是实体与属性以及实体与实体关系的分类问题。2)多轮问答问题。多轮分成两种,一种是指代补全问答, 如前一句问北京的天气,后者省略“的天气”这一词,而只说“北京”,这个需要进行意图判定并准确加载相应的问答槽。另一种是追问式多轮问答,典型的在天气查询或者酒店预订等垂直性问答任务上。大家要抓住这两个方面去做。
    • 关系挖掘是信息抽取的重要里程碑,理解了实体与实体、实体与属性、属性与属性、实体与事件、事件与事件的关系是解决真正语义理解的基础,但目前,这方面,在工业界实际运用中,特定领域中模板的性能要比深度学习多得多,学界大多采用端到端模型进行实验,在这方面还难以超越模版性能。

    1、TF-IDF

    1)原理:词频-逆文档频率;一种用于信息检索与文本挖掘的常用加权技术;一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度,字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

    2)主要思想:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

    3)公式:

              TF=在某一文本中词条w出现的次数/该文本中所有的词条数目

              IDF=log(语料库的文档总数/(包含词条w的文档数+1)),避免分母为0

              TF-IDF=TF*IDF

    4)优缺点:实现简单,容易理解,但未考虑词语语义信息,无法处理一词多义与一义多词

    5)应用:搜索引擎,关键词提取,文本相似性计算,文本摘要

    6)python调参:

    提取关键词

    keywords = jieba.analyse.extract_tags(sentence, topK=10, withWeight=False, allowPOS=())    # 主要调参指定词性的词

    提取特征向量

    tfidf = TfidfVectorizer(ngram_range=(1, 2), min_df=1, max_df=0.9, token_pattern=r"(?u)\b\w+\b", stop_words=stopwords, max_features=1000)
    '''
        ngram_range=(1, 2) : 词组长度为1和2
        min_df : 忽略出现频率小于1的词
        max_df : 忽略在百分之九十以上的文本中出现过的词
        token_pattern=r"(?u)\b\w+\b" : 包含单字
        stop_words : 停用词表
        max_features=1000: 最大特征向量维度
    '''

    2、Textrank

    1)原理:将每个句子看成一个节点,若两个句子之间有相似性,认为对应的两个节点之间有一个无向有权边,权值是相似度。通过pagerank算法(两个假设:数量假设,页面A被其他网页链接越多,页面A越重要;质量假设,质量越高的页面链接指向页面A,页面A越重要)计算得到的重要性最高的若干句子可以当作摘要。PageRank主要用于对在线搜索结果中的网页进行排序

    PageRank的核心公式是PageRank值的计算公式。公式如下:

    其中,PR(Vi)表示结点Vi的rank值,In(Vi)表示结点Vi的前驱结点集合,Out(Vj)表示结点Vj的后继结点集合。
    这个公式来自于《统计学习方法》,等号右边的平滑项(通过某种处理,避免一些突变的畸形值,尽可能接近实际情况)不是(1-d),而是(1-d)/n。

    是被研究的页面,链入页面的数量,链出页面的数量,而N是所有页面的数量。

    在文本自动摘要的案例中,TextRank和PageRank的相似之处在于:

    • 用句子代替网页

    • 任意两个句子的相似性等价于网页转换概率

    • 相似性得分存储在一个方形矩阵中,类似于PageRank的矩阵M

    不过公式有些小的差别,那就是用句子的相似度类比于网页转移概率,用归一化的句子相似度代替了PageRank中相等的转移概率,这意味着在TextRank中,所有节点的转移概率不会完全相等。
    在这里插入图片描述

    TextRank算法是一种抽取式的无监督的文本摘要方法。让我们看一下我们将遵循的TextRank算法的流程:

    3、知识库构建

    • 停用词库
    • 语料库
    • 自定义分词词库
    • 人物库
    • 垂直领域词库

    4、知识图谱

    • 三元组
    • NEO4教程:Neo4j是一个世界领先的开源图形数据库。 它是由Neo技术使用Java语言完全开发的。
    • CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言。

    Neo4j CQL:

    • 它是Neo4j图形数据库的查询语言。

    • 它是一种声明性模式匹配语言

    • 它遵循SQL语法。

    • 它的语法是非常简单且人性化、可读的格式。

    5、预训练模型

    语言模型

    预训练模型(Pre-trained Models,PTMs)

    深度学习时代,为了充分训练深层模型参数防止过拟合,通常需要更多标注数据喂养。在NLP领域,标注数据更是一个昂贵资源。PTMs从大量无标注数据中进行预训练使许多NLP任务获得显著的性能提升。总的来看,预训练模型PTMs的优势包括:

    1. 在庞大的无标注数据上进行预训练可以获取更通用的语言表示,并有利于下游任务;
    2. 为模型提供了一个更好的初始化参数,在目标任务上具备更好的泛化性能、并加速收敛;
    3. 是一种有效的正则化手段,避免在小数据集上过拟合(一个随机初始化的深层模型容易对小数据集过拟合);

    词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称。概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量,这也是分布式表示:向量的每一维度都没有实际意义,而整体代表一个具体概念。

    分布式表示相较于传统的独热编码(one-hot)表示具备更强的表示能力,而独热编码存在维度灾难和语义鸿沟(不能进行相似度计算)等问题。传统的分布式表示方法,如矩阵分解(SVD/LSA)、LDA等均是根据全局语料进行训练,是机器学习时代的产物。PTMs也属于分布式表示的范畴。

    PTMs两大范式:「浅层词嵌入」和「预训练编码器」。

    浅层词嵌入( Non-Contextual Embeddings):即词向量,其主要特点是学习到的是上下文独立的静态词嵌入,其主要代表如下。这一类词嵌入通常采取浅层网络进行训练,而应用于下游任务时,整个模型的其余部分仍需要从头开始学习。因此,对于这一范式的PTMs没有必要采取深层神经网络进行训练,采取浅层网络加速训练也可以产生好的词嵌入。

    • NNLM
    • word2vec(CBOW、Skip-Gram)
    • Glove

    浅层词嵌入的主要缺陷为:

    • 词嵌入与上下文无关,每个单词的嵌入向量始终是相同,因此不能解决一词多义的问题。
    • 通常会出现OOV问题(out of vocabulary,未登录词),为了解决这个问题,相关文献提出了字符级表示或sub-word表示,如CharCNN 、FastText和 Byte-Pair Encoding 。

    预训练编码器(Contextual Embeddings:主要目的是通过一个预训练的编码器能够输出上下文相关的词向量,解决一词多义的问题。这一类预训练编码器输出的向量称之为「上下文相关的词嵌入」。这一类「预训练编码器」范式的PTMs主要代表有ELMOGPT-1BERTXLNet等。

    • CNN(序列模型):TEXTCNN,设定窗口,然后对窗口内的若干词进行卷积操作,得到这个窗口内的词的嵌入表示
    • RNN(序列模型):基于LSTM/GRU的,基于单向(从左向右)或者双向的RNN模型,对整个序列进行建模,得到每个词的语境下的嵌入表示
    • 全连接自注意力模型(self-attention,非序列化模型):使用全连接图,来建立任意两个词之间的关系,并通过大规模无标注数据,让模型自动学习结构化信息。通常,两个词之间的”连接权重“会被自注意力机制动态计算。典型的代表就是Transformer中的multi-head self-attention网络结构了
    • ELMO
    • BERT
    • GPT

    上图中,(a)里面的卷积网络,可以认为窗口为3,例如 h2 由 x1、x2、x3 决定。(b)里面的 h2 由 h1 ,h3  和 x2 决定,具体可以使用LSTM, GRU等网络结构。(c)有点复杂,可以结合Transformer网络结构来理解。

    分析:

    序列模型:局部性偏见,难于捕捉长距离交互;但是容易训练,并在若干NLP任务上取得了不错的结果;

    非序列模型:(代表是Transformer)更强大,使用的参数更多,可以更好的覆盖长距离依赖的问题;但是,需要大规模训练语料(可以是unlabel的!),容易在中小规模数据上过拟合。

    当然,Transformer已经是目前几年的研究热点,不单单在NLP领域,在CV领域和speech领域也越来越引起重视,俨然成为了“中流砥柱”!

    上图给出了NLP各种编码器间的对比。PTMs中预训练编码器通常采用LSTM和Transformer(Transformer-XL),其中Transformer又依据其attention-mask方式分为Transformer-Encoder和Transformer-Decoder两部分。此外,Transformer也可看作是一种图神经网络GNN。

    三、参考文献

    1. 实话实说:中文自然语言处理的N个真实情况

    2. NLP中预训练模型的综述I

    3. PTMs:NLP预训练模型的全面总结

    4. 2020年3月18日,邱锡鹏老师发表了关于NLP预训练模型的综述《Pre-trained Models for Natural Language Processing: A Survey》,这是一篇全面的综述,系统地对PTMs进行了归纳分类

    展开全文
  • 入坑NLP - 自然语言处理领域概述

    万次阅读 2017-11-17 21:08:18
    自然语言处理研究的内容包括但不限于如下分支:文本分类、信息抽取、自动摘要、智能问答、话题推荐、机器翻译、主题词识别、知识库构建、深度文本表示、命名实体识别、文本生成、文本分析(词法、句法、语法)、语音...
  • 论文笔记整理:胡楠,东南大学博士。来源:ISWC 2020动机像Wikidata这样的现代知识图已经捕获了数十亿个RDF三元组,但是它们仍然缺乏对大多数关系的良好覆盖。同时在NLP研究的...
  • 和%等神奇的命令,另外它们的属性、方法、参数、文件路径甚至是dict键都能借助tab健完成自动补全。在使用Google或Stack Overflow搜索之前,我们可以尝试使用像>>> sklearn.linear_model.BayesianRidge??这样的命令...
  • 文章目录前言一、文本数据处理基础1.1、数字特征和分类特征1.2、文本处理步骤1.2.1、分割(Tokenization:文本—>单词/字母)1.2.2、one-hot编码1.2.3、词嵌入(word embedding)1.2.4、使用网络模型学习:二、...
  • 1. 什么是自然语言处理 NLP与计算语言学(computational linguistics)同义 目标:让计算机理解世界 语言层次: 形态分析(Morphological analysis),单词的前后缀等 句法分析(Syntactic analysis...
  • FunNLP 一些NLP和ML任务,例如自动单词补全,tweet聚类,数字识别等。主要是python脚本。
  • 语言模型 语言模型:给句子计算一个概率 为什么会有这样一个奇怪的任务? 机器翻译:P(我喜欢吃水果)>...文本自动补全。。。 概率语言模型(probablistic language modeling) 目标:计算一串单词连成...
  • 《人工智能Mix+》专栏系列文章Natural Language Processing,简称NLP自然语言处理横跨:计算机科学、语言学、人工智能等学科,是计算机科学与语言学的交叉学科,又...
  • 自动补全系统的一个关键组成部分是语言模型。给语言序列分配概率,更容易出现的序列得分越高。例如,“我有一支笔”比“我是一支笔”的概率更高,因为第一个句子在现实世界中更容易出现。 步骤 加载和预处理数据 ...
  • 只能顺序计算,处理完上一个输入后才能计算下一个输入,不支持并行计算 (2)梯度消失与信息丢失问题: 信息丢失:长期依赖关系难以维持,前面信息难以对后面结果产生影响 梯度消失:反向传播时,梯度逐步...
  • NLP:Natural Language Processing,自然语言处理 Anaphora Resolution:the problem of resolving what a pronoun, or a noun phrase refers to Anaphora 回指,亦称指示性指代:所谓回指是当前的指示语与上下文中...
  • 但是,以往的代码补全功能主要基于语言本身的内置函数和上下文信息进行补全,而在候选项重要程度、代码块补全方面却不理想。与其说我们常用的自动补全工具的价值在补全方面,我更倾向于认为它的价值体现在提示。近几...
  • 随着NLP技术的发展,信息流和计算能力也不断增强。我们现在只需在搜索栏中输入几个字符,就可以检索出完成任务所需的...大家可以在任何一个搜索引擎中输入这样一个问题“为什么现在自然语言处理如此重要?”,然后就能
  • 因为D需要对一个完整的序列评分,所以就是用MCTS(蒙特卡洛树搜索)将每一个动作的各种可能性补全,D对这些完整的序列产生reward,回传给G,通过增强学习更新G。这样就是用Reinforcement learning的方式,训练出一个...
  • 自然语言处理 第一节

    2019-09-13 11:43:38
    什么是自然语言处理 自然语言处理是人工智能的一部分,人工智能还有其他部分:计算机视觉、知识表示和推理等。语言是人工只能中一个非常特殊的部分,因为语言是人类特有的属性,而对于计算机视觉来说,地球上有很多...
  • 记录自然语言处理领域最新的理论解读、项目实例、开源代码库、视频、书籍等资讯
  • 代码补全漫谈(1) - 从TabNine说起

    千次阅读 2019-09-12 21:45:44
    代码补全漫谈(1) - 从TabNine说起 前不久,基于GPT-2模型的TabNine横空出世,在程序员界再次引起轰动。...从程序语言处理的近亲 - 自然语言处理NLP的发展来看,这样的乐观不是没有道理的。从进入深度学习...
  • 从BERT模型横空出世以后,通过预训练模型在NLP 领域的使用得到了快速的发展并且取得了非常好的效果。然而理解BERT 之前我们需要掌握大量知识
  • 意在总结笔记加深理解,同时也为其他学习该课程或想学习NLP相关知识的同学提供参考。 因本人仍在学习过程中,水平有限,难免有疏忽与错误,诚请各位指正。 2.相关参考资料: 课程原地址Coursera:...
  • 1.词汇表文件的第1个字是补全字,无实际含义,与kr.preprocessing.sequence.pad_sequences方法补全的0对应; 2.源代码作者使用了训练集、验证集、测试集作为总语料库,上面一段代码只使用了训练集作为语料库。 ''' ...
  • ChineseNLPcorpus An collection of Chinese nlp corpus including basic Chinese syntactic wordset, ... 中文自然语言处理的语料集合,包括语义词、领域共时、历时语料库、评测语料库等。本项目简单谈谈自己对语...
  • 文 | Liu Huanyong按语中文自然语言处理,目前在AI泡沫之下,真假难辨,实战技术与PPT技术往往存在着很大的差异。目前关于AI或者自然语言处理,做的人与讲的人往往是两回事。作者...
  • 有关实体及其关系的真实世界事实的知识库是各种自然语言处理任务的有用资源。然而,由于知识库通常是不完整的,因此能够执行知识库补全或链接预测是很有用的。本文全面概述了用于知识库完成的实体和关系的嵌入模型,...
  • 本篇文章将会带领大家了解什么是NLP模型当中的encoder-decoder和seq2seq。 一、什么是 Encoder-Decoder ? 1、Encoder-Decoder 模型主要是 NLP 领域里的概念。它并不特指某种具体的算法,而是一类算法的统称。...
  • Jupyterlab 3以及Kite代码补全插件安装

    千次阅读 2021-01-16 19:51:17
    Jupyterlab 3 以及Kate代码补全插件安装 为啥安个这玩意儿 之前一直用Jupyter写一些机器学习和深度学习的东西,尤其是去年一年里白嫖谷歌的Colab很长时间,甚至还开了pro,他们的工作台就是Jupyter类型的,用多了就...
  • 中文自然语言处理,目前在AI泡沫之下,真假难辨,实战技术与PPT技术往往存在着很大的差异。目前关于AI或者自然语言处理,做的人与讲的人往往是两回事。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,074
精华内容 2,829
关键字:

nlp补全