关键词提取

参考:

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

 

posted on 2024-04-05 11:03  201812  阅读(28)  评论(0编辑  收藏  举报