无监督关键短语的生成问题博客02--extract.py的分析

2021SC@SDUSC

在上一篇博客中,我们小组各位成员阅读了《Unsupervised Deep Keyphrase Generation》这篇论文,了解了这一关键词抽取模型的任务与主要实现,并对该模型的各个步骤进行了简要的说明。之后,我们确定了小组分工,初步配置了环境。

一、项目总览

该项目的代码文件如下:

图1:项目的代码文件

其中,utils.py是该项目其他文件需要调用的工具文件,里面有很多封装好的函数,其他文件可以直接调用。 Extract.py实验了论文的step1&2,实验了phrase bank的构建并排名输出“silver label”,Model.py文件实现了论文中step3的Encoder-Decoder模型(基于LSTM,Long short-term memory),Train.py用Extract.py得到的"silver label"训练Seq2Seq模型。kp20k_training是我们选择的kp20k数据集。

README文件如下:

图2:项目的readme文件

根据论文的关键步骤,我们从第一步:phrase bank的构建入手,这一步骤需要从文档库中提取present的关键短语,并采用已实现的方法提取出所所有文档的absent的关键短语。其中,present的关键短语可以由pke完成,extract.py完成短语库的构建并对短语库中的各短语从TF-IDF和Embedding Similarity两方面进行评分,输出为phrase bank中的“silver label”,用于后续模型的构建。对与Seq2Seq模型,对应model.py文件,我们将在后续博客中进行分析。

二、Extract.py的初步分析

最初该项目在运行时,extract.py出现语法错误,utils.py出现缩进错误,在修改了相关基本错误后分析代码。

1.与第三方库的有关分析

import os
import json
from collections import defaultdict
import pandas as pd
import numpy as np
from utils import *
from nltk.stem.porter import PorterStemmer
import nltk
import math
from gensim.models.doc2vec import Doc2Vec
from gensim.test.utils import get_tmpfile
from nltk.corpus import stopwords

里面涉及pandas,numpy,nltk等多个第三方库。其中,math库提供了许多对浮点数的数学运算函数,这些函数一般是对平台 C 库中同名函数的简单封装。numpy与pandas库在数据处理中经常使用。与matlab类似,numpy实现了向量化操作,其与python中的list列表类似,而pandas可以理解为列表与字典的结合形式,数据既可以通过下标实现索引(如df[1]),也可以通过“key”进行索引(df[city]),数据的处理基于dataframe数据框。

from collections import defaultdict
from nltk.stem.porter import PorterStemmer
import nltk
from nltk.corpus import stopwords

关于defaultdict:Python中通过Key访问字典,当Key不存在时,会引发‘KeyError’异常。为了避免这种情况的发生,可以使用collections类中的defaultdict来为字典提供默认值。

NLTK,全称Natural Language Toolkit,自然语言处理工具包,是NLP研究领域常用的一个Python库,是一开源项目,其主要功能为搜索文本(包含单词搜索,生成文本等),计数词汇。其基本模块和相应功能如下:

图3:nltk模块 

注:图源https://blog.csdn.net/github_39655029/article/details/82893018 (关于nltk的基本知识总结)

from gensim.models.doc2vec import Doc2Vec
from gensim.test.utils import get_tmpfile

gensim是一款强大的自然语言处理工具,里面包括非常多自然语言处理的常见模型:

  • 基本的语料处理工具
  • LSI
  • LDA
  • HDP
  • DTM
  • DIM
  • TF-IDF
  • word2vec、paragraph2vec

2.代码部分分析

nltk.download('stopwords') # 下载stopwords

nltk.download('averaged_perceptron_tagger')

nltk.download('punkt')

stoplist = stopwords.words('english') # 选择英语停词
porter_stemmer = PorterStemmer() # 初始化一个PorterStemmer对象
stoplist = ['the','a','no','if','an','and','but','is','are','be','were','in',
'wchich','of','for','.','!',',','?','that','not','this'] 
# 指定stopwords并赋给stoplist列表
model = Doc2Vec.load('doc2vec.bin') # 加载预训练好的doc2vec模型

Porter词干算法(或“ Porter stemmer”)是用于从英语单词中删除较常见的词法和不固定词尾的过程。它的主要用途是术语标准化过程的一部分,该过程通常在设置信息检索系统时完成。

这一部分下载了nltk中的相关模块,并作了nltk提供的停词处理。之后加载已训练好的doc2vec模型
 

 图4:extract.py

extract.py主要是有deal和extract两个函数,deal进行了candidate keyphrase的tf-idf的计算,extarct函数调用doc2vec模型将文本向量化,进行embedding similarity的比较,最后选出了排名较高的keyphrase作为sliver label,之后作文train.py训练seq2seq模型的输入。也就是extract函数的最后一句:

 np.save('silver.npy', record)

deal函数和extract函数的具体分析将由我的队友完成,这里由于源代码文件中没有附doc2vec.bin文件,而我们需要用wiki数据训练好的doc2vec模型,我在github上找到了训练模型的代码,将在后续博客中进行分析并依据代码自己训练模型。

3.extract的分析

由于项目的核心是抽取关键词,我们也会用到pke工具包进行初步单词的抽取,这里先进行初步分析。

pke是一个基于python的开源关键字提取工具包。它提供了一个end-to-end的关键字提取管道,其中每个组件都可以轻松修改或扩展,以开发新的模型。pke还允许对最先进的关键字提取模型进行简单的基准测试,并使用SemEval-2010数据集上训练的监督模型。

执行如下pip指令便可安装pke。

pip install git+https://github.com/boudinfl/pke.git

 pke还需要安装以下资源,目前pke仅支持python3.6+

python -m nltk.downloader stopwords
python -m nltk.downloader universal_tagset
python -m spacy download en_core_web_sm # download the english model

pke源码的下载地址为:

 https://github.com/boudinfl/pke

pke目前实现的模型,无监督的有基于统计的TfIdf,YAKE 等模型,以图为基础的TextRank,TopicRank,PositionRank等模型,有监督的特征基础的Kea模型和WINGNUS模型。我们将以无监督的TopicRank为例,分析extract的代码。

from pke.unsupervised import TopicRank

# 生成一个TopicRank提取器
extractor = TopicRank()

# 加载输入文档,选择语言为英文,标准化设置为题干提取
extractor.load_document(input='C-1.xml',
                        language="en",
                        normalization='stemming')

# 选择candidate keyphrase,TopicRank的最长序列的名词和形容词
extractor.candidate_selection(pos={'NOUN', 'PROPN', 'ADJ'})


# 使用随机游走对候选者进行加权。阈值参数设置了聚类的最小相似度,方法参数定义了链接方法
extractor.candidate_weighting(threshold=0.74,
                              method='average')

# print得分最高的10个关键词
for (keyphrase, score) in extractor.get_n_best(n=10, stemming=True):
    print(keyphrase, score)

input为CoreNLP XML格式,选择Porter's stemming算法进行标准化,调用extractor对象的candidate_selection方法,之后使用随机游走对candidate进行加权,threshold设置为聚类的最小相似度,最后调用extractor对象的get_n_best方法,取排名的前n名,这里设置取前10名,打印提取的关键词和得分。

图5:输入的C1.xml文档

 

 图6:关键词提取运行结果

4.positionrank的实现

pke中实现了很多关键词抽取的常用方法,这里我们再以positionrank的实现为例分析,positionrank和textrank相似,都是基于pagerank,关于textrank,我们会在后面的博客详细介绍,这里先简单说一下positionrank的思想。该算法主要是需要构建词图,每个单词作为图中的一个顶点,邻近的单词作为图中的边,可以构建出无向图。每个点都有一个rank值,rank值高的,就会是关键词,(也可以提取出关键短语或摘要)这里的w_{ji}为权重,当两个词频繁出现时会有较高的权重,\alpha 为阻尼因子,使结果最后收敛,page的计算过程是迭代的,其值会慢慢收敛。

与textrank不同的是,这里使用词的初始得分归一化后的值,如下:

 

 

词的初始得分跟词的在文本中的位置成反比,跟词频成正比。假定词v在文本的第2,第3,第8位置出现,p=1/2+1/3+1/8. O(V_j)为所有与所有与该词连接(图中连接)的边的权重和。

import pke

# 定义在图中出现的有效的part-of-speech
pos = {'NOUN', 'PROPN', 'ADJ'}

# 定义用于选择候选关键短语的语法
grammar = "NP: {<ADJ>*<NOUN|PROPN>+}"

# 初始化PositionRank extractor
extractor = pke.unsupervised.PositionRank()

# 加载文本内容
extractor.load_document(input='path/to/input',
                        language='en',
                        normalization=None)

# 选择不超过3个单词的名词短语作为关键词候选词。
extractor.candidate_selection(grammar=grammar,maximum_word_number=3)

# 使用词的分数的来衡量candidate。在图中,节点是单词(名词和仅形容词)连接的
# 窗口大小为10
extractor.candidate_weighting(window=10,pos=pos)

# 把得分最高的10个候选词作为关键词
keyphrases = extractor.get_n_best(n=10)

首先是初始化PositionRank extractor然后载入文本,然后调用candidate_selection方法得出所有候选candidate,规定候选关键短语的最大单词长度为3,之后使用rank衡量cnadidate,调用candidate_weighting方法,这里指定window=10,也就是相邻的10个单词,在图中有边相连。最后取出得分最高的10个候选词作为关键词。

在之后的博客中,我们将分析doc2vec模型及其训练的代码部分,之后将分析项目的核心代码model.py对seq2seq模型的构建。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值