📅  最后修改于: 2023-12-03 15:20:37.094000             🧑  作者: Mango
TextRank是一种用于自动文本摘要,关键词提取和主题分类的算法。它可以将文本表示为图形,其中每个单词是节点,它们之间的共同出现是边缘。权重代表两个词之间的相关性和重要性。通过对该图进行PageRank算法,可以识别最重要的文本单元。
我们可以通过Python中的networkx和NLTK库轻松地实现TextRank算法。下面是使用Python实现TextRank的代码示例:
import nltk
import re
import string
import networkx as nx
from sklearn.feature_extraction.text import TfidfVectorizer
def clean_document(doc):
"""
使用NLTK库清理文档
"""
stop_words = nltk.corpus.stopwords.words('english')
stemmer = nltk.stem.PorterStemmer()
# 将文档拆分成单词
tokens = nltk.word_tokenize(doc)
# 将词干提取出来并去掉停用词和标点符号
return [stemmer.stem(w.lower()) for w in tokens if w.lower() not in stop_words and w not in string.punctuation]
def rank_sentences(doc):
# 获取句子
sents = nltk.sent_tokenize(doc)
# 清理句子并提取特征
clean_sents = [clean_document(s) for s in sents]
feature_docs = [" ".join(clean_doc) for clean_doc in clean_sents]
# 创建用于TF-IDF向量化或抽取文档特征的对象
vectorizer = TfidfVectorizer(norm='l2', use_idf=True)
feature_vectors = vectorizer.fit_transform(feature_docs)
# 计算文档中所有句子之间的相似度得分
sim_scores = nx.Graph()
cos_sim_values = nx.from_scipy_sparse_matrix(feature_vectors * feature_vectors.T)
nx.set_edge_attributes(sim_scores, name='weight', values={(i, j): float(wt) for i, j, wt in cos_sim_values.edges(data='weight')})
# 使用pagerank算法进行排序
scores = nx.pagerank(sim_scores)
# 根据分数对句子进行排序
ranked_sents = sorted(((scores[i],s.strip()) for i,s in enumerate(sents)),reverse=True)
return ranked_sents
我们将TextRank算法分为两部分来使用:文档摘要和关键字提取。
def summarize_doc(doc: str, sentence_count: int):
# 对文档中的所有句子进行排序
ranked_sents = rank_sentences(doc)
# 从排序的句子中选择前句子计入摘要
summary = " ".join([sent[1] for sent in ranked_sents[:sentence_count]])
return summary
def extract_keywords(doc: str, keyword_count: int):
# 对文档中的所有句子进行排序
ranked_sents = rank_sentences(doc)
# 获取前句子中的关键字
keywords = []
pos_tag_tokens = nltk.pos_tag(nltk.word_tokenize(ranked_sents[0][1]))
for token in pos_tag_tokens:
if token[1].startswith('N') or token[1].startswith('J'):
keywords.append(token[0])
# 获取所有剩余单词的tf-idf权重
for sent in ranked_sents[1:]:
pos_tag_tokens = nltk.pos_tag(nltk.word_tokenize(sent[1]))
for token in pos_tag_tokens:
if token[1].startswith('N') or token[1].startswith('J'):
keywords.append(token[0])
# 获取关键字的tf-idf权重
vectorizer = TfidfVectorizer(norm='l2', use_idf=True)
feature_vectors = vectorizer.fit_transform(keywords)
# 计算tf-idf权重并返回关键字列表
sorted_word_idx = feature_vectors.toarray().sum(axis=0).argsort()[::-1][:keyword_count]
keywords = [keywords[i] for i in sorted_word_idx]
return keywords
TextRank算法是一种简单但强大的技术,可以用于自动文本摘要,关键词提取和主题分类。此外,可以使用Python中的networkx和NLTK库快速轻松地实现此算法。我们可以使用上述的两个函数轻松地提取摘要和关键字。