關鍵詞提取

201812發表於2024-04-05

參考:

NLP關鍵詞提取方法總結及實現_關鍵詞提取演算法-CSDN部落格

TF-IDF演算法介紹及實現-CSDN部落格

TextRank演算法介紹及實現-CSDN部落格

使用pandas庫實現csv行和列的獲取 - chuyaoxin - 部落格園 (cnblogs.com)

一看到地圖資料下鑽顯示我就煩。。。。沒關係的。。。。。額。看錯了原來不用實現太好辣哈哈哈哈哈哈哈哈額。

那就用TextRank提取關鍵詞吧~

可能出現的錯誤:

1.module'networks 'has no attribute 'from_numpy_ matrix ',可參考這篇文章進行解決文字摘要 - 使用 TextRank4ZH 抽取中文文字摘要_textrank4sentence-CSDN部落格

2.ImportError: cannot import name 'gcd' from 'fractions' 可以嘗試在lib資料夾中找到fractions.py檔案,在匯入庫那裡加入一行from math import gcd

檔案在哪找:看報錯提示後面有寫。

主要實現程式碼(主要就是改改text的獲取,然後在輸出到想要的檔案即可):

文字檔案處理方法可參考如下程式碼

# coding=utf-8
from textrank4zh import TextRank4Keyword, TextRank4Sentence
import jieba.analyse
import codecs
# from snownlp import SnowNLP
import pandas as pd
# import numpy as np


# 關鍵詞抽取
def keywords_extraction(text):
    tr4w = TextRank4Keyword(allow_speech_tags=['n', 'nr', 'nrfg', 'ns', 'nt', 'nz'])
    # allow_speech_tags   --詞性列表,用於過濾某些詞性的詞
    tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words',
                 pagerank_config={'alpha': 0.85, })
    # text    --  文字內容,字串
    # window  --  視窗大小,int,用來構造單詞之間的邊。預設值為2
    # lower   --  是否將英文文字轉換為小寫,預設值為False
    # vertex_source  -- 選擇使用words_no_filter, words_no_stop_words, words_all_filters中的哪一個來構造pagerank對應的圖中的節點
    #                -- 預設值為`'all_filters'`,可選值為`'no_filter', 'no_stop_words', 'all_filters'
    # edge_source  -- 選擇使用words_no_filter, words_no_stop_words, words_all_filters中的哪一個來構造pagerank對應的圖中的節點之間的邊
    #              -- 預設值為`'no_stop_words'`,可選值為`'no_filter', 'no_stop_words', 'all_filters'`。邊的構造要結合`window`引數

    # pagerank_config  -- pagerank演算法引數配置,阻尼係數為0.85
    keywords = tr4w.get_keywords(num=6, word_min_len=2)
    # num           --  返回關鍵詞數量
    # word_min_len  --  詞的最小長度,預設值為1
    return keywords


# 關鍵短語抽取
def keyphrases_extraction(text):
    tr4w = TextRank4Keyword()
    tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words',
                 pagerank_config={'alpha': 0.85, })
    keyphrases = tr4w.get_keyphrases(keywords_num=6, min_occur_num=1)
    # keywords_num    --  抽取的關鍵詞數量
    # min_occur_num   --  關鍵短語在文中的最少出現次數
    return keyphrases


# 關鍵句抽取
def keysentences_extraction(text):
    tr4s = TextRank4Sentence()
    tr4s.analyze(text, lower=True, source='all_filters')
    # text    -- 文字內容,字串
    # lower   -- 是否將英文文字轉換為小寫,預設值為False
    # source  -- 選擇使用words_no_filter, words_no_stop_words, words_all_filters中的哪一個來生成句子之間的相似度。
    #           -- 預設值為`'all_filters'`,可選值為`'no_filter', 'no_stop_words', 'all_filters'
    # sim_func -- 指定計算句子相似度的函式

    # 獲取最重要的num個長度大於等於sentence_min_len的句子用來生成摘要
    keysentences = tr4s.get_key_sentences(num=3, sentence_min_len=6)
    return keysentences


def keywords_textrank(text):
    keywords = jieba.analyse.textrank(text, topK=6)
    return keywords


if __name__ == "__main__":
    f = codecs.open('../資料清洗/t1_test_test.txt', mode='r', encoding='utf-8')
    lines = f.readlines()
    # 第八列是專案成果簡介,提取出來
    lines = lines[:160]
    text_list = []  # 專案成果簡介
    key_list = []   # 關鍵詞
    keyphrases_list = []    # 關鍵短語
    for line in lines:
        # print(line.strip().split("|")[8])
        text_list.append(line.strip().split("|")[8])
    print(text_list)

    # 關鍵詞抽取
    for text in text_list:
        key_list.append(keywords_extraction(text))
        keyphrases_list.append(keyphrases_extraction(text))
        # keysentences_extraction(text) # 關鍵句抽取

    print(key_list)
    print(keyphrases_list)

對csv檔案可參考一下程式碼

# coding=utf-8
from textrank4zh import TextRank4Keyword, TextRank4Sentence
import jieba.analyse
import codecs
# from snownlp import SnowNLP
import pandas as pd
# import numpy as np


# 關鍵詞抽取
def keywords_extraction(text):
    tr4w = TextRank4Keyword(allow_speech_tags=['n', 'nr', 'nrfg', 'ns', 'nt', 'nz'])
    # allow_speech_tags   --詞性列表,用於過濾某些詞性的詞
    tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words',
                 pagerank_config={'alpha': 0.85, })
    # text    --  文字內容,字串
    # window  --  視窗大小,int,用來構造單詞之間的邊。預設值為2
    # lower   --  是否將英文文字轉換為小寫,預設值為False
    # vertex_source  -- 選擇使用words_no_filter, words_no_stop_words, words_all_filters中的哪一個來構造pagerank對應的圖中的節點
    #                -- 預設值為`'all_filters'`,可選值為`'no_filter', 'no_stop_words', 'all_filters'
    # edge_source  -- 選擇使用words_no_filter, words_no_stop_words, words_all_filters中的哪一個來構造pagerank對應的圖中的節點之間的邊
    #              -- 預設值為`'no_stop_words'`,可選值為`'no_filter', 'no_stop_words', 'all_filters'`。邊的構造要結合`window`引數

    # pagerank_config  -- pagerank演算法引數配置,阻尼係數為0.85
    keywords = tr4w.get_keywords(num=6, word_min_len=2)
    # num           --  返回關鍵詞數量
    # word_min_len  --  詞的最小長度,預設值為1
    return keywords


# 關鍵短語抽取
def keyphrases_extraction(text):
    tr4w = TextRank4Keyword()
    tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words',
                 pagerank_config={'alpha': 0.85, })
    keyphrases = tr4w.get_keyphrases(keywords_num=6, min_occur_num=1)
    # keywords_num    --  抽取的關鍵詞數量
    # min_occur_num   --  關鍵短語在文中的最少出現次數
    return keyphrases


# 關鍵句抽取
def keysentences_extraction(text):
    tr4s = TextRank4Sentence()
    tr4s.analyze(text, lower=True, source='all_filters')
    # text    -- 文字內容,字串
    # lower   -- 是否將英文文字轉換為小寫,預設值為False
    # source  -- 選擇使用words_no_filter, words_no_stop_words, words_all_filters中的哪一個來生成句子之間的相似度。
    #           -- 預設值為`'all_filters'`,可選值為`'no_filter', 'no_stop_words', 'all_filters'
    # sim_func -- 指定計算句子相似度的函式

    # 獲取最重要的num個長度大於等於sentence_min_len的句子用來生成摘要
    keysentences = tr4s.get_key_sentences(num=3, sentence_min_len=6)
    return keysentences


def keywords_textrank(text):
    keywords = jieba.analyse.textrank(text, topK=6)
    return keywords


if __name__ == "__main__":
    df = pd.read_csv("t2.csv",encoding= 'utf-8')
    # 如果匯出的csv檔案沒有行頭,可以設定一個
    df.columns=['ID','成果名稱','行業','年度','批准登記號','單位名稱','課題來源','主要人員','評價單位名稱','成果簡介']
    # t2的最後一列是成果簡介列,提取出來
    # 這裡要注意iloc和loc的區別,loc是從1開始,iloc從0開始
    # (這倆種方法也可以)text_list = df[['成果簡介']]       text_list = df.loc[:,'成果簡介']
    t2_text = df.iloc[:,[9]]      # 專案成果簡介
    print(t2_text)
    t2_key_list = []  # 關鍵詞+比重
    t2_keyphrases_list = []  # 關鍵短語
    print(t2_text.values[2])

    # 關鍵詞抽取
    for i in range(len(t2_text)):
        # print(t2_text.values[i])    # 列印出來的是1X1陣列
        # 所以這裡需要再取一下陣列裡面的具體內容(字串)
        t2_key_list.append(keywords_extraction(t2_text.values[i][0]))
        t2_keyphrases_list.append(keyphrases_extraction(t2_text.values[i][0]))     # 關鍵短語

    # 將關鍵詞資料新增到檔案中
    # df['關鍵短語']=t2_keyphrases_list     # 如果直接這樣子寫,有些關鍵詞是一個陣列,寫入也是陣列的形式['玉米播種', '施肥技術', '農藝技術']
    # 所以我們將期合併下,如[['生態預測'], ['品系侵染'], ['柴胡根腐病'], ['玉米播種', '施肥技術', '農藝技術']]
    # 變為[['生態預測'], ['品系侵染'], ['柴胡根腐病'], ['玉米播種 施肥技術 農藝技術']]
    for i in range(len(t2_keyphrases_list)):
        t2_keyphrases_list[i] = ' '.join([elem for elem in t2_keyphrases_list[i]])
    # print(t2_keyphrases_list)
    df['關鍵短語'] = t2_keyphrases_list
    df.to_csv('t2_add.csv',index=False)




    """
    f = codecs.open('../資料清洗/t1_test_test.txt', mode='r', encoding='utf-8')
    lines = f.readlines()
    # 第9列是專案成果簡介,提取出來
    lines = lines[:160]
    text_list = []  # 專案成果簡介
    key_list = []  # 關鍵詞
    keyphrases_list = []  # 關鍵短語
    for line in lines:
        # print(line.strip().split("|")[8])
        text_list.append(line.strip().split("|")[8])
    print(text_list)

    # 關鍵詞抽取
    for text in text_list:
        key_list.append(keywords_extraction(text))
        keyphrases_list.append(keyphrases_extraction(text))
        # keysentences_extraction(text) # 關鍵句抽取

    print(key_list)
    print(keyphrases_list)
    """

ok

相關文章