最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用TextRank算法實(shí)現(xiàn)文獻(xiàn)關(guān)鍵信息提取

 更新時(shí)間:2025年03月12日 10:56:56   作者:Atlas Shepherd  
?TextRank算法是一種基于圖的排序算法,主要用于文本處理中的關(guān)鍵詞提取和文本摘要,下面我們就來看看如何使用?TextRank算法實(shí)現(xiàn)文獻(xiàn)關(guān)鍵信息提取吧

算法介紹‌

‌TextRank算法是一種基于圖的排序算法,主要用于文本處理中的關(guān)鍵詞提取和文本摘要。它由PageRank算法改進(jìn)而來,PageRank算法是谷歌用于網(wǎng)頁重要性排序的算法。TextRank算法通過構(gòu)建文本的圖模型,利用句子之間的相似度作為邊的權(quán)重,通過迭代計(jì)算句子的TextRank值,最后抽取排名高的句子組合成文本摘要。‌

實(shí)現(xiàn)思路

我們基于python代碼,使用PyQt5創(chuàng)建圖形用戶界面(GUI),同時(shí)支持中英文兩種語言的文本論文文獻(xiàn)關(guān)鍵信息提取。

PyQt5:用于創(chuàng)建GUI應(yīng)用程序。

jieba:中文分詞庫,用于中文文本的處理。

re:正則表達(dá)式模塊,用于文本清理和句子分割。

numpy:提供數(shù)值計(jì)算能力,如數(shù)組操作、矩陣運(yùn)算等,主要用于TextRank算法的實(shí)現(xiàn)。

完整代碼

import sys
import re
import jieba
import numpy as np
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
                             QHBoxLayout, QTextEdit, QPushButton, QLabel,
                             QMessageBox, QSpinBox, QFileDialog, QComboBox)
from PyQt5.QtCore import Qt
 
 
class TextRankSummarizer:
    def __init__(self, language='chinese'):
        self.language = language
        self.stopwords = self.load_stopwords()
 
        # 初始化jieba中文分詞器
        if language == 'chinese':
            jieba.initialize()
 
    def load_stopwords(self):
        """內(nèi)置停用詞表"""
        if self.language == 'chinese':
            return {'的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一', '一個(gè)', '也', '要'}
        else:  # 英文停用詞
            return {'a', 'an', 'the', 'and', 'or', 'but', 'if', 'is', 'are', 'of', 'to', 'in', 'on'}
 
    def preprocess_text(self, text):
        """文本預(yù)處理"""
        # 清洗特殊字符
        text = re.sub(r'[^\w\s。,.?!]', '', text)
 
        # 分句處理
        if self.language == 'chinese':
            sentences = re.split(r'[。???]', text)
        else:
            sentences = re.split(r'[.!?]', text)
 
        return [s.strip() for s in sentences if len(s) > 2]
 
    def calculate_similarity(self, sentence, other_sentence):
        """計(jì)算句子相似度"""
        words1 = [w for w in (jieba.cut(sentence) if self.language == 'chinese' else sentence.lower().split())
                  if w not in self.stopwords]
        words2 = [w for w in
                  (jieba.cut(other_sentence) if self.language == 'chinese' else other_sentence.lower().split())
                  if w not in self.stopwords]
 
        # 使用Jaccard相似度
        intersection = len(set(words1) & set(words2))
        union = len(set(words1) | set(words2))
        return intersection / union if union != 0 else 0
 
    def textrank(self, sentences, top_n=5, damping_factor=0.85, max_iter=100):
        """TextRank算法實(shí)現(xiàn)"""
        similarity_matrix = np.zeros((len(sentences), len(sentences)))
 
        # 構(gòu)建相似度矩陣
        for i in range(len(sentences)):
            for j in range(len(sentences)):
                if i != j:
                    similarity_matrix[i][j] = self.calculate_similarity(sentences[i], sentences[j])
 
        # 歸一化矩陣
        row_sum = similarity_matrix.sum(axis=1)
        normalized_matrix = similarity_matrix / row_sum[:, np.newaxis]
 
        # 初始化得分
        scores = np.ones(len(sentences))
 
        # 迭代計(jì)算
        for _ in range(max_iter):
            prev_scores = np.copy(scores)
            for i in range(len(sentences)):
                scores[i] = (1 - damping_factor) + damping_factor * np.sum(normalized_matrix[i, :] * prev_scores)
 
            if np.linalg.norm(scores - prev_scores) < 1e-5:
                break
 
        # 獲取重要句子索引
        ranked_indices = np.argsort(scores)[::-1][:top_n]
        return sorted(ranked_indices)
 
    def summarize(self, text, ratio=0.2):
        """生成摘要"""
        sentences = self.preprocess_text(text)
        if len(sentences) < 3:
            return "文本過短,無法生成有效摘要"
 
        top_n = max(1, int(len(sentences) * ratio))
        important_indices = self.textrank(sentences, top_n=top_n)
 
        # 按原文順序排列
        selected_sentences = [sentences[i] for i in sorted(important_indices)]
 
        # 中文使用句號(hào)連接,英文使用.連接
        separator = '。' if self.language == 'chinese' else '. '
        return separator.join(selected_sentences) + ('。' if self.language == 'chinese' else '.')
 
 
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
 
        # 初始化摘要器
        self.summarizer = TextRankSummarizer()
 
        # 界面設(shè)置
        self.setup_ui()
 
    def setup_ui(self):
        self.setWindowTitle("TextRank文本摘要工具")
        self.setGeometry(100, 100, 1000, 800)
 
        main_widget = QWidget()
        layout = QVBoxLayout()
 
        # 輸入?yún)^(qū)
        self.input_text = QTextEdit()
        self.input_text.setPlaceholderText("在此粘貼需要摘要的文本(建議500字以上)...")
 
        # 控制區(qū)
        control_layout = QHBoxLayout()
        self.ratio_spin = QSpinBox()
        self.ratio_spin.setRange(5, 50)
        self.ratio_spin.setValue(20)
        self.ratio_spin.setSuffix("%")
 
        self.lang_combo = QComboBox()
        self.lang_combo.addItems(["中文", "英文"])
 
        self.summarize_btn = QPushButton("生成摘要")
        self.import_btn = QPushButton("導(dǎo)入文件")
        self.clear_btn = QPushButton("清空")
 
        control_layout.addWidget(QLabel("摘要比例:"))
        control_layout.addWidget(self.ratio_spin)
        control_layout.addWidget(QLabel("語言:"))
        control_layout.addWidget(self.lang_combo)
        control_layout.addWidget(self.import_btn)
        control_layout.addWidget(self.summarize_btn)
        control_layout.addWidget(self.clear_btn)
 
        # 輸出區(qū)
        self.output_text = QTextEdit()
        self.output_text.setReadOnly(True)
 
        # 布局組合
        layout.addWidget(QLabel("輸入文本:"))
        layout.addWidget(self.input_text)
        layout.addLayout(control_layout)
        layout.addWidget(QLabel("摘要結(jié)果:"))
        layout.addWidget(self.output_text)
 
        main_widget.setLayout(layout)
        self.setCentralWidget(main_widget)
 
        # 信號(hào)連接
        self.summarize_btn.clicked.connect(self.generate_summary)
        self.import_btn.clicked.connect(self.import_file)
        self.clear_btn.clicked.connect(self.clear_content)
        self.lang_combo.currentTextChanged.connect(self.change_language)
 
    def change_language(self, lang):
        self.summarizer = TextRankSummarizer('chinese' if lang == "中文" else 'english')
 
    def generate_summary(self):
        text = self.input_text.toPlainText().strip()
        if not text:
            QMessageBox.warning(self, "輸入錯(cuò)誤", "請(qǐng)輸入需要摘要的文本")
            return
 
        ratio = self.ratio_spin.value() / 100
        summary = self.summarizer.summarize(text, ratio)
        self.output_text.setPlainText(summary)
 
    def import_file(self):
        path, _ = QFileDialog.getOpenFileName(
            self, "打開文本文件", "",
            "文本文件 (*.txt);;所有文件 (*.*)"
        )
        if path:
            try:
                with open(path, 'r', encoding='utf-8') as f:
                    self.input_text.setPlainText(f.read())
            except Exception as e:
                QMessageBox.critical(self, "錯(cuò)誤", f"文件讀取失?。篭n{str(e)}")
 
    def clear_content(self):
        self.input_text.clear()
        self.output_text.clear()
 
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

效果圖

最后效果如下

到此這篇關(guān)于Python使用TextRank算法實(shí)現(xiàn)文獻(xiàn)關(guān)鍵信息提取的文章就介紹到這了,更多相關(guān)Python TextRank關(guān)鍵信息提取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python+PIL實(shí)現(xiàn)批量在圖片上寫上自定義文本

    Python+PIL實(shí)現(xiàn)批量在圖片上寫上自定義文本

    Pillow 是一個(gè) Python 的圖像處理庫,它是 Python Imaging Library (PIL) 的一個(gè)分支,并且增加了更多的功能,下面我們看看如何利用它實(shí)現(xiàn)批量在圖片上寫上自定義的文本吧
    2024-11-11
  • 通過實(shí)例了解python property屬性

    通過實(shí)例了解python property屬性

    這篇文章主要介紹了通過實(shí)例了解python property屬性,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Windows下Anaconda安裝、換源與更新的方法

    Windows下Anaconda安裝、換源與更新的方法

    這篇文章主要介紹了Windows下Anaconda安裝、換源與更新的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Python裝飾器的函數(shù)式編程詳解

    Python裝飾器的函數(shù)式編程詳解

    本文向大家詳細(xì)介紹了Python裝飾器的函數(shù)式編程的相關(guān)資料,需要的朋友可以參考下
    2015-02-02
  • python中tqdm使用,對(duì)于for和while下的兩種不同情況問題

    python中tqdm使用,對(duì)于for和while下的兩種不同情況問題

    這篇文章主要介紹了python中tqdm使用,對(duì)于for和while下的兩種不同情況問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python多線程與同步機(jī)制淺析

    Python多線程與同步機(jī)制淺析

    線程(Thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位;線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源
    2022-12-12
  • python中class的定義及使用教程

    python中class的定義及使用教程

    這篇文章主要介紹了python中class的定義及使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Python時(shí)間模塊datetime、time、calendar的使用方法

    Python時(shí)間模塊datetime、time、calendar的使用方法

    這篇文章主要介紹了Python時(shí)間模塊的使用方法,主要包括三大模塊datetime、time、calendar,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Django視圖類型總結(jié)

    Django視圖類型總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于Django視圖類型的總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-02-02
  • Python處理Excel文件遇到的常見問題解析與解決

    Python處理Excel文件遇到的常見問題解析與解決

    Python 的 pandas 庫提供了便捷的 read_excel() 方法,但在實(shí)際使用中,我們可能會(huì)遇到各種問題,本文將分析這些常見錯(cuò)誤,并提供 Python 和 Java 的解決方案,有需要的可以參考下
    2025-04-04

最新評(píng)論

和政县| 庆安县| 收藏| 建阳市| 罗源县| 库车县| 大新县| 卢氏县| 南木林县| 衡山县| 出国| 延寿县| 盈江县| 浦城县| 广南县| 南昌市| 黄陵县| 亳州市| 寿阳县| 新安县| 长寿区| 泊头市| 龙口市| 衡水市| 泗阳县| 龙南县| 平阴县| 莱州市| 上虞市| 枞阳县| 邹城市| 彭泽县| 清苑县| 斗六市| 延川县| 小金县| 福泉市| 惠州市| 横峰县| 正蓝旗| 汉沽区|