python實現文章或博客的自動摘要(附java版開源項目)
寫博客的時候,都習慣給文章加入一個簡介。現在可以自動完成了!
TF-IDF與余弦相似性的應用(三):自動摘要 - 阮一峰的網絡日志
http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html
idf.txt來自 https://github.com/jannson/yaha/blob/master/yaha/analyse/idf.txt
python分詞庫中:https://github.com/jannson/yaha
使用summarize3 需要安裝numpy庫。
GitHub - jannson/yaha: yaha
https://github.com/jannson/yaha
基本功能:
精確模式,將句子切成最合理的詞。
全模式,所有的可能詞都被切成詞,不消除歧義。
搜索引擎模式,在精確的基礎上再次驛長詞進行切分,提高召回率,適合搜索引擎創建索引。
備選路徑,可生成最好的多條切詞路徑,可在此基礎上根據其它信息得到更精確的分詞模式。
可用插件:
正則表達式插件
人名前綴插件
地名后綴插件
定制功能。分詞過程產生4種階段,每個階段都可以加入個人的定制。
附加功能:
新詞學習功能。通過輸入大段文字,學習到此內容產生的新老詞語。 (添加了一個由我朋友實現的C++版本的最大熵新詞發現功能,速度是python的10倍吧)
獲取大段文本的關鍵字。
獲取大段文本的摘要。
詞語糾錯功能(新!常用在搜索里對用戶的錯誤輸入進行糾正)
支持用戶自定義詞典 (TODO目前還沒有實現得很好)
======================================
Python實現提取文章摘要的方法
一、概述
在博客系統的文章列表中,為了更有效地呈現文章內容,從而讓讀者更有針對性地選擇閱讀,通常會同時提供文章的標題和摘要。
一篇文章的內容可以是純文本格式的,但在網絡盛行的當今,更多是HTML格式的。無論是哪種格式,摘要 一般都是文章 開頭部分 的內容,可以按照指定的 字數 來提取。
二、純文本摘要
純文本文檔 就是一個長字符串,很容易實現對它的摘要提取:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Get a summary of the TEXT-format document"""
def get_summary(text, count):
u"""Get the first `count` characters from `text`
>>> text = u'Welcome 這是一篇關於Python的文章'
>>> get_summary(text, 12) == u'Welcome 這是一篇'
True
"""
assert(isinstance(text, unicode))
return text[0:count]
if __name__ == '__main__':
import doctest
doctest.testmod()
三、HTML摘要
HTML文檔 中包含大量標記符(如<h1>、<p>、<a>等等),這些字符都是標記指令,並且通常是成對出現的,簡單的文本截取會破壞HTML的文檔結構,進而導致摘要在瀏覽器中顯示不當。
在遵循HTML文檔結構的同時,又要對內容進行截取,就需要解析HTML文檔。在Python中,可以借助標准庫 HTMLParser 來完成。
一個最簡單的摘要提取功能,是忽略HTML標記符而只提取標記內部的原生文本。以下就是類似該功能的Python實現:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Get a raw summary of the HTML-format document"""
from HTMLParser import HTMLParser
class SummaryHTMLParser(HTMLParser):
"""Parse HTML text to get a summary
>>> text = u'<p>Hi guys:</p><p>This is a example using SummaryHTMLParser.</p>'
>>> parser = SummaryHTMLParser(10)
>>> parser.feed(text)
>>> parser.get_summary(u'...')
u'<p>Higuys:Thi...</p>'
"""
def __init__(self, count):
HTMLParser.__init__(self)
self.count = count
self.summary = u''
def feed(self, data):
"""Only accept unicode `data`"""
assert(isinstance(data, unicode))
HTMLParser.feed(self, data)
def handle_data(self, data):
more = self.count - len(self.summary)
if more > 0:
# Remove possible whitespaces in `data`
data_without_whitespace = u''.join(data.split())
self.summary += data_without_whitespace[0:more]
def get_summary(self, suffix=u'', wrapper=u'p'):
return u'<{0}>{1}{2}</{0}>'.format(wrapper, self.summary, suffix)
if __name__ == '__main__':
import doctest
doctest.testmod()
HTMLParser(或者 BeautifulSoup 等等)更適合完成復雜的HTML摘要提取功能,對於上述簡單的HTML摘要提取功能,其實有更簡潔的實現方案(相比 SummaryHTMLParser 而言):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Get a raw summary of the HTML-format document"""
import re
def get_summary(text, count, suffix=u'', wrapper=u'p'):
"""A simpler implementation (vs `SummaryHTMLParser`).
>>> text = u'<p>Hi guys:</p><p>This is a example using SummaryHTMLParser.</p>'
>>> get_summary(text, 10, u'...')
u'<p>Higuys:Thi...</p>'
"""
assert(isinstance(text, unicode))
summary = re.sub(r'<.*?>', u'', text) # key difference: use regex
summary = u''.join(summary.split())[0:count]
return u'<{0}>{1}{2}</{0}>'.format(wrapper, summary, suffix)
if __name__ == '__main__':
import doctest
doctest.testmod()
======================================
另外一個比較好的java版本的開源實現:
https://github.com/hankcs/HanLP
HanLP是由一系列模型與算法組成的Java工具包,目標是普及自然語言處理在生產環境中的應用。HanLP具備功能完善、性能高效、架構清晰、語料時新、可自定義的特點。
自然語言處理 中文分詞 詞性標注 命名實體識別 依存句法分析 關鍵詞提取 自動摘要 短語提取 拼音 簡繁轉換
根據文章內容自動提取tag