返回小栈
关于自然语言处理系列-文本摘要提取
bq_wang2020-03-03 09:07:31

python最大的好处就是有无穷无尽的包资源,如何把这些包资源组合起来发挥其应有的价值也是一个很重要的工作。比如NLP的文本摘要提取就有几个现成的可以实现,如snownlp,goose3,sumy,虽然摘要效果未必理想。

后续还会有相关文章对文本摘要进行处理。


代码示例

  1. import jieba,pkuseg

  2. from snownlp import SnowNLP

  3. from goose3 import Goose

  4. from goose3.text import StopWordsChinese

  5. from sumy.parsers.html import HtmlParser

  6. from sumy.parsers.plaintext import PlaintextParser

  7. from sumy.nlp.tokenizers import Tokenizer

  8. from sumy.summarizers.lsa import LsaSummarizer as Summarizer

  9. from sumy.nlp.stemmers import Stemmer

  10. from sumy.utils import get_stop_words

  11. # 通过snownlp实现摘要

  12. def gen_summary_snownlp(text):

  13. # 初始化SnowNLP对象

  14. s = SnowNLP(text)

  15. # s = <snownlp.SnowNLP object at 0x000001B16C85CB00>


  16. # 断句

  17. sentences = s.sentences


  18. # 分词

  19. words = s.words


  20. # 词性标注

  21. tags = s.tags

  22. tag = [x for x in tags]

  23. # tags = <zip object at 0x000001B10D642B48>


  24. # 情感分析,返回值为正面情绪的概率,越接近1表示正面情绪,越接近表示负面情绪

  25. sentiments = s.sentiments

  26. # sentiments = 1.0


  27. # 繁体转简体

  28. han=s.han


  29. # 拼音

  30. pinyin= s.pinyin


  31. # 关键字提取

  32. keyword= s.keywords(10)

  33. # keyword = ['文化', '岭南', '爱国主义', '社会', '研究', '中', '历史', '传统', '近代', '人民']


  34. # 文章摘要

  35. summary= s.summary(10)

  36. print(summary)

  37. # summary = ['(2)确定可能的配电规划方案:在整个电力系统中',

  38. # '规划区在经济发展中的地位对配电网的规划任务有着重要的影响',

  39. # '配电网规划是配电网发展和改造的总体计划',

  40. # '配电网可分为:城市配电网',

  41. # '远期规划要求中期和近期的城市电网建设和改造是远期电网发展目标的一部分',

  42. # '网络结构复杂等学科电力学将电力系统中从降压配电变电站(高压配电变电站)出口到用户端的这一段系统称为配电系统',

  43. # '配电系统是由多种配电设备(或元件)和配电设施所组成的变换电压和直接向终端用户分配电能的一个电力网络系统',

  44. # '(4)确定最佳配电网规划方案',

  45. # '配电网可分为:高压配电网(6~110kV)',

  46. # '配电网规划是指在分析和研究未来负荷增长情况以及城市配电网现状的基础上']


  47. # TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

  48. # TF词频越大越重要,但是文中会的“的”,“你”等无意义词频很大,却信息量几乎为,这种情况导致单纯看词频评价词语重要性是不准确的。因此加入了idf

  49. # IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t越重要

  50. # TF-IDF综合起来,才能准确的综合的评价一词对文本的重要性。

  51. s = SnowNLP([[u'这篇', u'文章',u'很好', u'老师',u'很好'],

  52. [u'这篇', u'文章', u'很烂'],

  53. [u'那篇', u'论文',u'很好'],

  54. [u'老师', u'不错']])

  55. tf=s.tf

  56. # [{'这篇': 1, '文章': 1, '很好': 2, '老师': 1},

  57. # {'这篇': 1, '文章': 1, '很烂': 1},

  58. # {'那篇': 1, '论文': 1, '很好': 1},

  59. # {'老师': 1, '不错': 1}]

  60. idf=s.idf

  61. # {'这篇': 0.0, '文章': 0.0, '很好': 0.0, '老师': 0.0, '很烂': 0.8472978603872037, '那篇': 0.8472978603872037, '论文': 0.8472978603872037, '不错': 0.8472978603872037}

  62. sim=s.sim([u'论文',u'很好'])

  63. # 返回相似度评分

  64. # [0.0, , 0.8776790585684181, ]


  65. def gen_summary_goose(url):

  66. g = Goose({'stopwords_class': StopWordsChinese})

  67. article = g.extract(url=url)

  68. print(article.cleaned_text[:400])

  69. # 将电力系统中从降压配电变电站(高压配电变电站)出口到用户端的这一段系统称为配电系统。

  70. # 配电系统是由多种配电设备(或元件)和配电设施所组成的变换电压和直接向终端用户分配电能的一个电力网络系统。

  71. # 配电网具有电压等级多,网络结构复杂,设备类型多样,作业点多面广,安全环境相对较差等特点,因此配电网的安全风险因素也相对较多。

  72. # 另外,由于配电网的功能是为各类用户提供电力能源,这就对配网的安全可靠运行提出更高要求。

  73. # 电网电压等级一般可划分为:特高压(1000kV交流及以上和±800kV直流)、超高压(330kV及以上至1000kV以下)、高压(35220kV)、中压(620kV)、低压(0.4kV)五类。

  74. # 我国配电系统的电压等级,根据(Q/GDW 156-2006)《城市电网规划设计导则》的规定,35kV63kv110kv为高压配电系统;6kV~10kV20kV)为中压配电系统;220V380


  75. def gen_summary_sumy(text):

  76. LANGUAGE = "chinese"

  77. SENTENCES_COUNT = 5

  78. # url方式

  79. # url = "https://en.wikipedia.org/wiki/Automatic_summarization"

  80. # parser = HtmlParser.from_url(url, Tokenizer(LANGUAGE))

  81. # 文件方式

  82. # parser = PlaintextParser.from_file("document.txt", Tokenizer(LANGUAGE))

  83. # 字符串方式

  84. parser = PlaintextParser.from_string(text, Tokenizer(LANGUAGE))

  85. stemmer = Stemmer(LANGUAGE)


  86. summarizer = Summarizer(stemmer)

  87. summarizer.stop_words = get_stop_words(LANGUAGE)

  88. for sentence in summarizer(parser.document, SENTENCES_COUNT):

  89. print(sentence)

  90. # 是由架空线路、电缆、杆塔、配电变压器、隔离开关、无功补偿器及一些附属设施等组成的,在电力网中起重要分配电能作用的网络。

  91. # 另外,由于配电网的功能是为各类用户提供电力能源,这就对配网的安全可靠运行提出更高要求。

  92. # 不仅使得在输电网中所采用的潮流计算常规算法难以在配网潮流计算时得到收敛,还会因不同点故障的短路阻抗角不一致,对保护动作灵敏度和可靠性产生一定影响。

  93. # 在尽可能满足未来用户容量和电能质量的情况下,对可能的各种接线形式、不同的线路数和不同的导线截面,以运行经济性为指标,选择最优或次优方案作为规划改造方案,使电力公司及其有关部门获得最大利益的过程。

  94. # (2)确定可能的配电规划方案:在整个电力系统中,按地区从满足长期供电需要出发,并考虑经济等因素。




  95. if __name__ == '__main__':

  96. inputdir = 'C:\Python\Pycharm\langprocess\\train'

  97. idffile = 'C:\Python\Pycharm\langprocess\\udfidf.txt'

  98. stopwordfile= 'C:\Python\Pycharm\langprocess\\stopwords.txt'

  99. #filename = 'C:\Python\Pycharm\langprocess\\train\C4-Literature\C4-Literature02.txt'

  100. filename = 'C:\Python\Pycharm\langprocess\配电网.txt'

  101. content = open(filename, 'r', encoding='utf-8', errors='ignore').read()

  102. print('------------------通过snownlp提取摘要------------------------')

  103. gen_summary_snownlp(content)

  104. print('------------------通过goose提取摘要------------------------')

  105. url = 'https://baike.baidu.com/item/%E9%85%8D%E7%94%B5%E7%BD%91?fromtitle=%E9%85%8D%E7%BD%91&fromid=16611137'

  106. gen_summary_goose(url)

  107. print('------------------通过sumy提取摘要------------------------')

  108. gen_summary_sumy(content)

长按二维码关注“追梦IT人”



6
0