📜  textrank python 实现 - Python (1)

📅  最后修改于: 2023-12-03 15:20:37.094000             🧑  作者: Mango

TextRank Python实现 - Python

简介

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库快速轻松地实现此算法。我们可以使用上述的两个函数轻松地提取摘要和关键字。