第2关:TF/IDF 算法

#本程序的作用是通过TF/IDF算法完成对文本的关键词提取,输出前十个关键词。

import math

import jieba

import jieba.posseg as psg

from gensim import corpora, models

from jieba import analyse

import functools

class TfIdf(object):

    # 四个参数分别是:训练好的idf字典,默认idf值,处理后的待提取文本,关键词数量

    def __init__(self, idf_dic, default_idf, word_list, keyword_num):

        self.word_list = word_list

        self.idf_dic, self.default_idf = idf_dic, default_idf

        self.tf_dic = self.get_tf_dic()

        self.keyword_num = keyword_num

        

    def get_tf_dic(self):

        tf_dic = {}

    # 任务:完成word_list的tf值的统计函数,将结果存储到tf_dic变量中

     # ** Begin *****#  

        for word in self.word_list:

            tf_dic[word] = tf_dic.get(word, 0.0) + 1.0

        tt_count = len(self.word_list)

        for k, v in tf_dic.items():

            tf_dic[k] = float(v) / tt_count

     # ** End **#  

        return tf_dic

    # 按公式计算tf-idf

    def get_tfidf(self):

        tfidf_dic = {}

        for word in self.word_list:

            idf = self.idf_dic.get(word, self.default_idf)

            tf = self.tf_dic.get(word, 0)

            tfidf = tf * idf

            tfidf_dic[word] = tfidf

        tfidf_dic.items()

        # 根据tf-idf排序,去排名前keyword_num的词作为关键词

        for k, v in sorted(tfidf_dic.items(), key=functools.cmp_to_key(cmp), reverse=True)[:self.keyword_num]:

            print(k + "/ ", end='')

        print()

        

        

#排序函数,用于topK关键词的按值排序

def cmp(e1, e2):

    import numpy as np

    res = np.sign(e1[1] - e2[1])

    if res != 0:

        return res

    else:

        a = e1[0] + e2[0]

        b = e2[0] + e1[0]

        if a > b:

            return 1

        elif a == b:

            return 0

        else:

            return -1

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的竞赛项目学习资料,作为参考学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 JDDC大赛第4名解决方案参赛源码+学习说明.zip ## 初赛阶段思路及算法模型 初赛采用的是基于TFIDF的检索式算法TF-IDF (Term Frequency-Inverse Document Frequency) 表示词频和逆文档频率的乘积,代表了单词对文章的重要程度。TF-IDF是深度学习应用于NLP之的经典表示方法。我们将TF-IDF作为检索的第一步操作,即检索出top 10 的候选集结果,再对候选集进行重新排序。 TF-IDFTF的定义如下: ![](media/8659ed935357d383513379963bac3424.png) IDF的定义如下: ![](media/4bef51dfd171cb29ab3f98dfdd9af41d.png) 我们对数据进行了一些预处理,主要包括:1)删除轮次低于3的会话;2)将同一角色连续说的话合并成单句;3)将每个对话整理成Q1A1Q2A2Q3+A3的形式,删除多余轮次的对话记录。 **针对tfidf检索式方案的优化,主要有两个方面:1)文本特征提取中加入了tri-grams;2)结果生成方式改成top10重排序,重排序准则为A的长度。** ![](media/e9bcc33f41e9358c814584b5db3bca0e.png) 图 1:初赛解决方案 在初赛阶段,我们还尝试了多种不同的检索方案,主要有:1)BM25;2)使用word2vec创建词向量,构建句子向量后计算余弦相似性;3)LSI等。这些方案的最终得分都没能超越经过优化的tfidf基线。 ## 决赛阶段思路及算法模型 决赛刚开始阶段,我们顺延初赛的思路,继续尝试了一些检索式方法,如:BM25、TFIDF等,最终发现,检索式方法效果是比较差的,测评得分徘徊在0.3。进而,我们开始采用生成式方法。生成式模型方面,我们主要尝试了两个算法,分别是seq2seq和Transformer,这两个算法都是端到端的模型。从测评的结果来看,seq2seq+attention+dropout+beam search方案的测评得分在0.56\~0.6之间;transformer+beam search方案得分能够超过0.7。 由于决赛中包含多轮测评,因此,一个合理的context信息引入方案是十分重要的。经过分析、讨论以及实践,我们最终的context引入方案是:“**仅使用用户上一轮次说的内容作为当轮次的context**”。这个方案在比赛中被证实为有效,正是这个方案的引入,使得我们可以使用一个模型同时完成单轮和多轮评测。基于这个方案,数据集中的每一个历史对话都被处理成Qn-1Qn+An形式的QA对。同时,为了兼顾模型的单轮评测效果,选择了部分(约10%)历史对话仅按照Q2Q3+A3方式构造QA对,这种数据划分处理方案是确保单一模型同时完成单轮和多轮测评的键之一。同时,在开发过程中发现数据集中部分QA对中A的长度过长,影响到模型的整体性能,因此,我们仅保留A的长度在[3, 200]范围内的QA对。 我们的最终方案是transformer+beam search。Transformer 最初被用在机器翻译上,在文章发表时取得了state-of-the-art 的翻译结果,其网络结构如下图所示: ![](media/b38d6c17cc4137fa7058db16c5467765.png) 图 2:Transformer模型架构(摘自文献3) 上图左边为Encoder模块,右边为Decoder模块。Encoder模块包括6层堆叠,每一层都具有相同的结构:Multi-Head Attention层和Feed Forward Neural Network层,同时,使用residual connection和layer normalization进行正则化,为了让正则计算方便,所有sub-layer的输出维度都定义为512。Decoder模块也是6层堆叠,每层除了包括Multi-Head Attention层和Feed Forward Neural Network层外,还有一个Masked Multi-Head Attention层,同样的使用了residual connection和layer normalization作为正则。由于Attention无法捕捉文本顺序信息,Transformer在input embedding和output em

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值