解决方案:使用NLP从文章中自动提取关键字
优采云 发布时间: 2020-09-03 12:55使用NLP从文章中自动提取关键字
1. 背景
在许多研究和新闻文章中,关键字是其中的重要组成部分,因为关键字提供了文章内容的简洁表示. 关键字在信息检索系统,数据库文章和优化搜索引擎的搜索中起着至关重要的作用. 此外,关键字还有助于将文章分类到相关主题或学科.
提取关键字的常规方法包括根据文章的内容和作者的判断手动分配关键字,但这需要大量的时间和精力,并且在选择合适的关键字时可能不准确. 随着NLP的发展,关键字提取变得更加有效和准确.
在下面的文章中,我们将展示使用NLP进行关键字提取.
2. 数据集
在本文中,我们将从收录大约3800个摘要的数据集中提取关键字. 原创数据集来自kaggle-NIPS Paper,而神经信息处理系统(NIPS)是世界上顶级的机器学习会议之一. 该数据集收录从1987年第一次会议到2016年会议的NIPS论文的标题和摘要.
原创数据集还收录文章文本. 但是,由于重点是理解关键字提取的概念,并且使用所有文章内容可能会消耗大量计算资源,因此仅摘要用于NLP建模.
3. 方法
3.1文本预处理和数据浏览(1)导入数据集
本文使用的数据集是Kaggle上NIPS纸张数据集中的papers.csv文件数据集. 需要对原创数据集进行一些处理.
#加载原始数据集
filePath="/content/drive/My Drive/data/关键字提取/papers.csv"
dataset=pd.read_csv(filePath)
dataset.head()
数据集收录7列,而“抽象”列代表论文的摘要. 可以看出,有大量的“摘要缺失”,即没有摘要的论文,我们需要将其删除. 在这里,我只保留了50多个字符的摘要,最后保留了3900多个摘要.
dataset=dataset[dataset['abstract'].str.len()>50]
len(dataset) #3924
(2)初步文本探索
在进行文本预处理之前,建议快速计算摘要中的单词数,以查看最常见和最不常见的单词.
#统计每个摘要中有多少个单词
dataset["word_count"]=dataset["abstract"].apply(lambda x:len(str(x).split(" ")))
dataset[["abstract","word_count"]].head()
#对每个摘要中的单词数量做一个描述性统计
dataset.word_count.describe()
摘要中的平均单词数为148,单词数在19到317之间. 单词数非常重要. 它使我们能够知道要处理的数据集的大小以及抽象词的数量的变化.
此外,您还可以查看摘要中的一些常见和稀有单词. 可以将更多常用词添加到停用词列表中.
#最常见的单词
freq=pd.Series("".join(dataset["abstract"]).split()).value_counts()[:20]
freq
#最不常见的单词
freq1=pd.Series(" ".join(dataset["abstract"]).split()).value_counts()[-20:]
freq1
(3)文本预处理
#文本预处理
from nltk.stem.porter import PorterStemmer
from nltk.stem.wordnet import WordNetLemmatizer
lem=WordNetLemmatizer()
stem=PorterStemmer()
word="inversely"
print("stemming:",stem.stem(word))
print("lemmatization:",lem.lemmatize(word,"v"))
在文本挖掘中,基于单词频率创建了一个巨大的稀疏矩阵,其中许多值均为0.这个问题称为数据稀疏性,可以使用各种技术将其最小化.
文本预处理可以分为两类: 噪声消除和标准化. 核心文本分析中的冗余数据成分可被视为噪声.
处理同一单词在不同表现形式中的多次出现被称为标准化. 主要有两种形式: 词干和词法化. 例如: 学习,学习,学习,学习者等都是学习词的不同版本. 标准化会将这些词转换为单个标准化版本“学习”.
以下示例说明了词干和词根化的工作原理:
#文本预处理
from nltk.stem.porter import PorterStemmer
from nltk.stem.wordnet import WordNetLemmatizer
lem=WordNetLemmatizer()
stem=PorterStemmer()
word="inversely"
print("stemming:",stem.stem(word))
print("lemmatization:",lem.lemmatize(word,"v"))
为了对数据集执行文本预处理,请首先导入所需的库
import nltk
import re
from nltk.corpus import stopwords
from nltk.tokenize import RegexpTokenizer
nltk.download("stopwords")
# nltk.download('wordnet')
删除停用词: 停用词在句子中收录大量介词,代词,连词等. 在分析文本之前,需要删除这些词,以便使常用词主要是与上下文相关的词,而不是文本中最常见的词.
python nltk库中有一个默认的停用词列表,我们也可以添加自己的自定义停用词.
#停用词
stop_words=set(stopwords.words("english"))
new_words=["using","show","result","large","also","iv","one","two","new","previously","shown"]
stop_words=stop_words.union(new_words)
您还需要对文本进行一些处理,例如删除标点符号,小写字母等.
<p>corpus=[]
for text in dataset["abstract"]:
#去除标点符号
text=re.sub("[^a-zA-Z]"," ",text)
#转换成小写
text=text.lower()
#去除标签
text=re.sub("