面向特定问题的开源算法管理和推荐(十六)

2021SC@SDUSC


系列文章目录

(一)组内分工情况

(二)任务一爬虫部分代码分析(上)

(三)任务一爬虫部分代码分析(下)

(四)任务一数据集统计代码分析

(五)任务二及PKE模型解读

(六)PKE模型使用一

(七)PKE模型使用二

(八)PKE代码分析一

(九)PKE代码分析二

(十)PKE代码分析三

(十一)PKE代码分析四

(十二)PKE代码分析五

(十三)PKE代码分析六

(十四)PKE代码分析七

(十五)PKE代码分析八

(十六)PKE代码分析九

前言

pke包含模型如下:

本篇博客将开始从有监督模型的基于神经的模型进行代码分析

supervised->neural_based


目录

系列文章目录

前言

一、seq2seq.py

(一)原理

(二)函数

(三)包

二、api.py

总结


一、seq2seq.py

用于自动关键短语提取的 Seq2Seq 模型的实现

(一)原理

目前Seq2Seq模型在机器翻译,语音识别,文本摘要,问答系统等领域取得了巨大的成功。如图1所示,Seq2Seq其实就是Encoder-Decoder结构的网络,它的输入是一个序列,输出也是一个序列。在Encoder中,将序列转换成一个固定长度的向量,然后通过Decoder将该向量转换成我们想要的序列输出出来。

                                                   图1 Encoder-Decoder结构

如图2所示,Encoder和Decoder一般都是RNN,通常为LSTM或者GRU,图中每一个方格都为一个RNN单元。

在Encoder中,“欢迎/来/北京”这些词转换成词向量,也就是Embedding,我们用 vi 来表示,与上一时刻的隐状态 h i-1 按照时间顺序进行输入,每一个时刻输出一个隐状态 [公式] ,我们可以用函数 [公式] 表达RNN隐藏层的变换: [公式] 。假设有t个词,最终通过Encoder自定义函数 [公式] 将各时刻的隐状态变换为向量 [公式] : [公式] ,这个 [公式] 就相当于从“欢迎/来/北京”这几个单词中提炼出来的大概意思一样,包含了这句话的含义。

Decoder的每一时刻的输入为Eecoder输出的 c 和Decoder前一时刻解码的输出 Si-1 还有前一时刻预测的词的向量 [公式] (如果是预测第一个词的话,此时输入的词向量为“_GO”的词向量,标志着解码的开始),我们可以用函数 [公式] 表达解码器隐藏层变换: [公式] 。直到解码解出“_EOS”,标志着解码的结束。

                                                     图2 Encoder-Decoder细节

参考资料:简说Seq2Seq原理及实现 - 知乎 (zhihu.com)

(二)函数

包含一个类

class Seq2Seq(SupervisedLoadFile):

类中包含4个函数,函数很简单

1、def __init__(self):

重新初始化定义Seq2Seq

        super(Seq2Seq, self).__init__()

        # 输入序列
        self.sequence = []
        
        # 词汇
        self.vocabulary = ['<SOS>', '<EOS>', '<UNK>']

2、def document_to_ix(self):

将文档转换为 ix 的序列

        self.sequence.append(self.vocabulary.index('<SOS>'))
        for i, sentence in enumerate(self.sentences):
            for word in sentence.stems:
                try:
                    self.sequence.append(self.vocabulary.index(word))
                except ValueError:
                    self.sequence.append(self.vocabulary.index('<UNK>'))
        self.sequence.append(self.vocabulary.index('<EOS>'))

3、def candidate_selection(self): pass

4、def candidate_weighting(self): pass

比较值得一提的是导入的包

(三)包

1.from __future__ import

Python的每个新版本都会增加一些新的功能,或者对原来的功能作一些改动。有些改动是不兼容旧版本的,也就是在当前版本运行正常的代码,到下一个版本运行就可能不正常了。
从Python 2.7到Python 3.x就有不兼容的一些改动,比如2.x里的字符串用'xxx'表示str,Unicode字符串用u'xxx'表示unicode,而在3.x中,所有字符串都被视为unicode,因此,写u'xxx'和'xxx'是完全一致的,而在2.x中以'xxx'表示的str就必须写成b'xxx',以此表示“二进制字符串”。
要直接把代码升级到3.x是比较冒进的,因为有大量的改动需要测试。相反,可以在2.7版本中先在一部分代码中测试一些3.x的特性,如果没有问题,再移植到3.x不迟。
Python提供了future模块,把下一个新版本的特性导入到当前版本,于是我们就可以在当前版本中测试一些新版本的特性。

(1)from __future__ import absolute_import

这是一个在py2.x中导入3.x的导入特性的语句, 是为了区分出绝对导入和相对导入.
在一般的Python学习资料中介绍3.x的相对导入时候一般都会说相对导入最后不要超过两层.
但是需要区分出我们编写的代码是干嘛的,如果是写的应用程序,在加入了from __future__ import absolute_import 之后,那么在程序的编写过程中使用类似from package.submodule import b 只能导入系统环境路径里面的包,导入不了你写的应用程序的子包,如果导入你写的应用程序的子包必须使用from ..submodule import b。
如果写的是工具类程序,比如说写的是三方包,发布给别人安装。那么在加入了from __future__ import absolute_import 之后还是可以在相对导入的时候使用from package.submodule import b 。那么这么做不是from __future__ import absolute_import 所说的特性没有了么。其实不然。因为我们编写的程序是需要安装在系统环境路径里面的,所以这种绝对导入的方式是可以相对导入的,这个时候搜索包名的时候是在系统环境路径里面搜索,但是因为你的包就在这些路径的某一个路径里面,所以可以搜得到from package.submodule import b 里面的b(模块,函数,变量,类)。这种编写工具包以绝对导入进行相对导入的方法还避免了from ..submodule import b 最好导入不超过两层的这一建议. 特别适合在开发大型工具的时候。比如著名的深度学习框架tensorflow就是用的这种特性.
 

(2)from __future__ import print_function

在开头加上from __future__ import print_function这句之后,即使在python2.X,使用print就得像python3.X那样加括号使用。python2.X中print不需要括号,而在python3.X中则需要。

# python2.7
print "Hello world"

# python3
print("Hello world")

2.from pke.supervised.api import SupervisedLoadFile

根据名字可以看出,这个是存在pke中的一个文件,结构如下

下面对这个文件进行代码分析

二、api.py

监督模型的抽象基类

包含一个类

class SupervisedLoadFile(LoadFile):#SupervisedLoadFile 类为监督模型提供额外的基本函数。

类中包含5个函数

1.def __init__(self):

重新定义初始化器

        super(SupervisedLoadFile, self).__init__()
        
        #实例容器
        self.instances = {}
        

2.def feature_scaling(self):

将特征缩放到 [0.1]

        candidates = self.instances.keys()
        X = [self.instances[u] for u in candidates]
        X = MinMaxScaler().fit_transform(X)
        for i, candidate in enumerate(candidates):
            self.instances[candidate] = X[i]

3.def feature_extraction(self): pass

用于特征提取的骨架

4.def classify_candidates(self, model=None):

将候选词分类为关键短语或非关键短语。

参数:
            model(str):以pickle格式加载模型的路径,默认为None。

        # 如果没有提供,则设置默认模型
        if model is None:
            instance = self.__class__.__name__
            # model = os.path.join(self._models, instance+"-semeval2010.pickle")
            if six.PY2:
                model = os.path.join(self._models,
                                     instance + "-semeval2010.py2.pickle")
            else:
                model = os.path.join(self._models,
                                     instance + "-semeval2010.py3.pickle")

        # 加载模型
        clf = load_model(model)
        # with open(model, 'rb') as f:
        #     clf = pickle.load(f)

        # 获取实例矩阵
        candidates = self.instances.keys()
        X = [self.instances[u] for u in candidates]

        # 对候选进行分类
        y = clf.predict_proba(X)

        for i, candidate in enumerate(candidates):
            self.weights[candidate] = y[i][1]

5.def candidate_weighting(self):

提取特征并使用默认参数对候选者进行分类。

        if not self.candidates:
            return

        self.feature_extraction()
        self.classify_candidates()

总结

本文分析了supervised->neural_based->seq2seq.py以及它调用的包,其中包括api.py

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值