【NLP】python中英文关键词抽取技术总结

【NLP】python中英文关键词抽取技术总结

无论是在中文还是英文中关键词抽取技术都是有着很重要的应用价值和分析价值,下面在python环境中分别针对中文和英文介绍几种常用的关键词抽取方法。

1. 英文

抽取英文关键词的几种方法:

1.1 spaCy

spaCy是一个集成化的工业级自然语言处理工具,主要功能包括分词、词性标注、词干化、命名实体识别、名词短语提取等等。

text = "Private investment firm Carlyle Group,which has a reputation for making well-timed and occasionally controversial plays in the defense industry, has quietly placed its bets on another part of the market."
## spaCy
import spaCy
spacy_nlp = spacy.load("en_core_web_sm")
doc = spacy_nlp(text)
for ent in doc.ents:
    print(ent.text,ent.label_)
    
## output
Carlyle Group ORG

doc.ents的输出可能是1-gram, 2-gram, 3-gram等,无法人工调控。

1.2 yake

yake使用文本统计特征方法从文章中选择最重要的关键字。

## yake
import yake
kw_extractor = yake.KeywordExtractor()
language = "en"
max_ngram_size = 2 #最大关键词语长度
deduplication_threshold = 0.9 #设置在关键词中是否可以重复单词
numOfKeywords = 20 
custom_kw_extractor = yake.KeywordExtractor(lan=language, n=max_ngram_size, dedupLim=deduplication_threshold, top=numOfKeywords, features=None)
keywords = custom_kw_extractor.extract_keywords(text)

## output
[('Carlyle Group,which', 0.007444681613352736),
 ('firm Carlyle', 0.013797198203993007),
 ('Private investment', 0.015380821171891606),
 ('defense industry', 0.015380821171891606),
 ('investment firm', 0.02570861714399338),
 ('making well-timed', 0.02570861714399338),
 ('occasionally controversial', 0.02570861714399338),
 ('controversial plays', 0.02570861714399338),
 ('Carlyle', 0.08596317751626563),
 ('Group,which', 0.08596317751626563),
 ('Private', 0.09568045026443411),
 ('industry', 0.09568045026443411),
 ('market', 0.09568045026443411),
 ('investment', 0.15831692877998726),
 ('firm', 0.15831692877998726),
 ('reputation', 0.15831692877998726),
 ('making', 0.15831692877998726),
 ('well-timed', 0.15831692877998726),
 ('occasionally', 0.15831692877998726),
 ('controversial', 0.15831692877998726)]

1.3 rare_nltk

一种与NLTK工具集成在一起的快速自动关键词抽取技术Rapid Automatic Keyword Extraction (RAKE)。

## Rake
from rake_nltk import Rake
rake_nltk_var = Rake(max_length=2)
rake_nltk_var.extract_keywords_from_text(text)
keyword_extracted = rake_nltk_var.get_ranked_phrases()

## output
['quietly placed',
 'making well',
 'defense industry',
 'another part',
 'timed',
 'reputation',
 'market',
 'bets']

rake-nltk的性能与spaCy相当

1.4 gensim

## gensim
import gensim
gensim_kw = gensim.summarization.keywords(text,words=10,split=True,scores=True)

## output
[('carlyle', 0.3454150914587271),
 ('investment firm', 0.3405754844080691),
 ('occasionally controversial plays', 0.28088699744995504),
 ('defense', 0.2808869974499539),
 ('industry', 0.28088699744995377),
 ('quietly placed', 0.2808869974499534)]

genisim在关键字提取方面的性能还没有达到spaCy和``rakenltk级。gensim`在关键字提取任务上还有改进的空间

2. 中文

2.1 TextRank

TextRank是一种由PageRank启发的算法,最早用在了摘要的提取上,现有的python库能够同时实现对关键词和摘要的提取。TextRank的效果不见得比TF-IDF(有着合适语料库)要好,但是优点在于不需要语料的训练就能对单篇文章分析,在语料不足的时候可以作为一种方法来用。

test_text = '知识图谱(Knowledge Graph),在图书情报界称为知识域可视化或知识领域映射地图,是显示知识发展进程与结构关系的一系列各种不同的图形,用可视化技术描述知识资源及其载体,挖掘、分析、构建、绘制和显示知识及它们之间的相互联系。知识图谱,是通过将应用数学、图形学、信息可视化技术、信息科学等学科的理论与方法与计量学引文分析、共现分析等方法结合,并利用可视化的图谱形象地展示学科的核心结构、发展历史、前沿领域以及整体知识架构达到多学科融合目的的现代理论。'

tr4w = TextRank4Keyword()
tr4w.analyze(text=test_text,lower=True,window=5)
print('测试文本关键词如下:\n')
for item in tr4w.get_keywords(5,word_min_len=1):
    print(item['word'],item['weight'])

tr4s = TextRank4Sentence()
tr4s.analyze(text=test_text, lower=True, source='no_stop_words')
key_sentences = tr4s.get_key_sentences(num=5,sentence_min_len=2)
for sentence in key_sentences:
    print(sentence['weight'],sentence['sentence'])
    
## output
知识 0.07136000358189572
可视化 0.050885665487685895
学科 0.04382397117871283
图谱 0.034505489704179104
分析 0.032669435513839745

2.2 TF-IDF

TF-IDF,是基于词频与逆文档频次的一种算法,TF-IDF较为简单快速,而且效果相对不错,但是TF-IDF中的IDF要基于已有的语料进行训练,语料的好坏对结果影响很大,如果应用到目前的项目,语料是必须要解决的一个问题。

keywords_tfidf = jieba.analyse.extract_tags(test_text, topK = 20, withWeight=True)
for item in keywords_tfidf:
    print(item[0],item[1])
## output
知识 0.6291566258975609
可视化 0.5459818268731708
图谱 0.36000858444256095
学科 0.24579239780817075
分析 0.17720506157560972
情报界 0.16952045917073172
图形学 0.16952045917073172
Knowledge 0.14578984759634145
Graph 0.14578984759634145
共现 0.14578984759634145
信息科学 0.1364954567182927
领域 0.1320072083514634
计量学 0.12932732665853658
引文 0.1284558758780488
理论 0.12825460906317074
方法 0.12116597634243903
映射 0.12043080440536585
结构 0.1178287709707317
技术 0.11510871167243902
显示 0.11022549280878048

2.3 Textrank(jieba)

keywords_textrank_jieba = jieba.analyse.textrank(test_text, topK=20, withWeight=True)
for item in keywords_textrank_jieba:
    print(item[0],item[1])
tr4w = TextRank4Keyword()
## output
知识 1.0
可视化 0.6295270480086527
分析 0.48002211534304284
学科 0.448184981430669
技术 0.33755106917904004
结构 0.3218718222753201
发展 0.3176518370007447
方法 0.3153386943262916
领域 0.3120507490347102
图谱 0.2845462026540273
显示 0.28294240822624933
图形学 0.23556758861253835
达到 0.22453237874888934
资源 0.2231116119429888
架构 0.21777848096566976
共现 0.21498592836125222
融合 0.1941284901445365
理论 0.19230572366470158
载体 0.18945172483525918
核心 0.18851788164895478

参考资料:

Keyword Extraction process in Python with Natural Language Processing(NLP)

Understand TextRank for Keyword Extraction by Python

上一篇:How do I learn mathematics for machine learning?


下一篇:java 查找list中指定字符串出现的次数