1. 程式人生 > >python根據文章標題內容自動生成摘要

python根據文章標題內容自動生成摘要

  • text.py
title = '智慧金融起錨:文因、數庫、通聯瞄準的kensho革命'
text = '''2015年9月13日,39歲的鮑捷乘上從矽谷至北京的飛機,開啟了他心中的金融夢想。

鮑捷,人工智慧博士後,如今他是文因互聯公司創始人兼CEO。和鮑捷一樣,越來越多的矽谷以及華爾街的金融和科技人才已經踏上了歸國創業征程。

在矽谷和華爾街,已湧現出Alphasense、Kensho等智慧金融公司。

如今,這些公司已經成長為獨角獸。

大資料、演算法驅動的人工智慧已經進入到金融領域。人工智慧有望在金融領域最新爆發。

前段時間,筆者寫完了《激盪二十五年:Wind、同花順、東方財富、大智慧等金融服務商爭霸史》、《邊緣崛起:雪球、老虎、富途、牛股王等網際網路券商的新玩法》,探討了網際網路時代、移動網際網路時代創業者們的創想。

人工智慧與金融正在融合,這裡我們聚焦一下投研領域,後續會向交易、投顧等領域延展。這篇文章將描繪一下Kensho、文因互聯、數庫科技、通聯資料在這個領域的探索和嘗試,看看新時代正在掀起的巨浪。

1、Kensho的顛覆式革命

華爾街的Kensho是金融資料分析領域裡誰也繞不過的一個獨角獸。這家公司獲得由高盛領投的6280萬美元投資,總融資高達7280萬美元。

33歲的Kensho創始人Daniel Nadler預言:在未來十年內,由於Kensho和其他自動化軟體,金融行業有三分之一到二分之一的僱員將失業。

2014年,Nadler在哈佛大學學習數學和古希臘文化。大學期間,他在美聯儲擔任訪問學者時驚奇地發現,這家全球最具權勢的金融監管機構仍然依靠Excel來對經濟進行分析。

當時,希臘選舉以及整個歐洲的不穩定局面正強烈衝擊金融市場。訪問期間,Nadler意識到無論是監管者還是銀行家,除了翻過去的新聞訊息以外,並不能給出什麼好的方案。

於是,他和麻省理工學院的好友一起想辦法,並借鑑Google的資訊處理方法,來分析資本市場,設計出了Kensho軟體。

一個典型的工作場景是:早上八點,華爾街的金融分析師衝進辦公室,等待即將在8點半公佈的勞工統計局月度就業報告。他開啟電腦,用Kensho軟體蒐集勞工部資料。

兩分鐘之內,一份Kensho自動分析報告便出現在他的電腦螢幕上:一份簡明的概覽,隨後是13份基於以往類似就業報告對投資情況的預測。

金融分析師們再無需檢查,因為Kensho提取的這些分析基於來自數十個資料庫的成千上萬條資料。

Kensho介面與Google相似,由一條簡單的黑色搜尋框構成。其搜尋引擎自動將發生的事件根據抽象特徵進行分類。

福布斯報道過運用Kensho的成功案例。例如,英國脫歐期間,交易員成功運用Kensho瞭解到退歐選舉造成當地貨幣貶值;此外,Kensho還分析了美國總統任期的前100天內股票漲跌情況(見下圖):

(圖片來源:福布斯)

Kensho在構建金融與萬物的關聯,並用結構化、資料化的方式去呈現。公司還專門僱傭了一位機器學習專家,而這位專家此前為谷歌研究世界圖書館的大型分類方法。

處理複雜的事件與投資關聯,Kensho只需要幾分鐘。但是在華爾街一個普通的分析師需要幾天時間去測算對各類資產的影響。而這些分析師普遍拿著30—40萬美元的年薪。

此外,矽谷的創業公司AlphaSense公司已經悄然建成了一個解決專業資訊獲取和解決資訊碎片問題的金融搜尋引擎。

AlphaSense的執行長Jack Kukko曾是摩根士丹利分析師,這賦予了其強大的金融基因。

AlphaSense可以搜尋“研究文獻,包括公司提交的檔案證明、演示、實時新聞、新聞報道、華爾街的投資研究、以及客戶的內部內容。”

AlphaSense幾秒鐘內即可搜尋數百萬個不同的財務文件, 公司內部紕漏內容和賣方研究等,使使用者可以快速發現關鍵資料點,並通過智慧提醒、跟蹤重要資訊點、防止資料遺漏,做出關鍵的決策。

AlphaSense目前已經向包括摩根大通等投資和諮詢公司、全球銀行、律師事務所和公司(如甲骨文)等500餘位客戶提供服務。

2、海歸博士的智慧金融實驗

2017年6月,在北京朝陽區的一個居民樓的辦公室內,鮑捷和他的20名創業夥伴正在摸索打造一款智慧金融分析工具,而他的目標正是華爾街的AlphaSense和Kensho。

41歲的鮑捷很享受創業,他說在中國這是最好的創業時代。在此之前,他有一段漫長的求學歷程。

鮑捷是一個資訊整理控,他從小學開始整理所有的歷史人物、水文地理、卡通人物的關係等。合肥工業大學研究生階段,他師從德國斯圖加特大學歸來的博士高雋,學習人工智慧,深度研究神經網路。

2001年,他離開中國進入美國,先後為Lowa State Univ博士、RPI博士後、MIT訪問研究員、BBN訪問研究員,在美國完成了11年人工智慧的學習和研究。他先後師從語義網創始人Jim Hendler和全球資訊網發明人、圖靈獎得主Tim Berners-Lee,參與了語義網學科形成期間的一些關鍵研究專案,並是知識圖譜國際標準OWL的作者之一。

2013年,在三星研究院工作不到兩年後,他開始了在矽谷的創業,研發了一款名為“好東西傳送門”的產品。

該產品主要利用機器人程式在網站抓取人工智慧、機器學習、大資料的最新技術資訊,利用專業領域知識過濾後,自動生產內容,傳送至需要的人。

好東西傳送門獲取了數萬鐵粉,但無法盈利。2015年9月,他離開矽谷飛往北京,歸國的第一天,便獲得了無量資本100萬美元的天使輪融資。他在中國創立了“文因互聯”。

其實鮑捷很早就看到了人工智慧和金融結合的前景。在2010年,他就提出了金融報表語言XBRL的語義模型。2015年底,他看到了Kensho在金融領域帶來的革命,結合國內的投資需求,他選擇了在新三板領域開始切入,當時只有7名員工,經過半年研發,文因在2016年5月推出了“快報”和“搜尋”。

“快報”能夠自動抓取每日公告、財報、新聞資訊等;而“搜尋”能夠自動提取產業鏈上下游公司、結構化財報等各類資料。

“這兩款產品為我們獲取了1萬鐵粉,雖然產品有很多缺陷,但是依舊很多人喜歡這個工具,因為以前沒有能夠滿足這種需求的服務。”鮑捷向華爾街見聞表示。

但是他們發現做搜尋需要龐大的知識架構,需要去整合各種金融相關資料,開發公司標籤、產業標籤、產業鏈等複雜的知識圖譜,而做這個體系,再燒幾億,可能也無法完成。

更為恐怖的是,做完產品還要和金融資訊服務商競爭。Wind、同花順、東方財富,擋在了文因互聯面前。

“我放棄了從頭到尾設計一個大系統的想法,而是從具體場景出發解決單點問題。從年底開始我分了一部分人去做專案,但每一個專案都是我們大系統裡面的一個元件,這個專案根據金融客戶的真實需求去打磨,然後將這些元件整合為一個系統的產品。”鮑捷反思道,創業需要尋找使用者最痛的點,然後紮下去解決問題。

經過一年的創業,鮑捷變得更接地氣。去年下半年以來,他密集地拜訪各大銀行、基金、保險、券商,根據金融機構的需求,在標準化產品之上定製化,從具體業務的自動化出發走向智慧化。

目前恆豐銀行、南京銀行、中債資信等均已成為文因互聯的合作客戶。

文因互聯很快根據金融機構的需求開發出了公告摘要、自動化報告、財報結構化資料等多個軟體產品,並開發出了投研小機器人。

2016年年底,文因互聯再次獲得睿鯨資本Pre-A輪融資。而這位睿鯨資本的投資人,曾經是鮑捷的網友,他們經常在一起討論人工智慧問題。

鮑捷舉例說,深市、滬市、新三板加在一起每天平均大概3000-4000份公告,每天處理公告資料提取和摘要,這是一件非常繁瑣的事情。很多金融機構要養20多人處理公告,而且這些人還不能快速高效準確地處理。這類事情機器做最適合。給機器程式輸入金融知識,並通過模型訓練,能夠快速準確地提取各項公告摘要和年報摘要。

鮑捷表示,文因互聯長遠目標是Kensho,用人工智慧提升金融投研效率和渠道效率,而這還有很長的路要走。

3、中國式創新距離Kensho有多遠?

上海的另外一位海歸,也選擇在金融研投領域創業,他叫劉彥,已經歸國創業了八年。

八年前,他創立的數庫科技,如今獲得了京東金融1000萬美元的投資。

2003年,23歲的他從密歇根商學院畢業,進入華爾街瑞信公司,一年後他主動調到香港分公司。 5年裡,他主導完成了建設銀行、工商銀行、太平洋保險等大公司的上市專案。

華爾街2008年的金融危機波及全球,人性的貪婪和恐懼暴露無遺。在劉彥眼裡,從資料層面到決策層面,每一個環節都充斥著被加工過的資訊。2009年,他選擇回到上海創業。劉彥最初的野心很大,想構建中國的彭博終端,他花費兩年的時間構建完成“半結構化資料”。

2011年,數庫獲得穆迪資本500萬美元投資。很快,原公司從70人擴張到140人。但因數庫的戰略計劃並未完成,穆迪資本放棄進一步投資,他和聯合創始人沈鑫賣掉房子,繼續維持運營。

劉彥破釜沉舟,公司很快攻克了資訊識別系統和精度抓取,並在深度分析等方面取得突破。

數庫科技試圖覆蓋全球上市公司:A股3218家、港股1993家美股4953家、新三板10725家、非上市金融490家、股權交易中心2467家。

目前,數庫主要服務於B端金融機構。數庫自稱核心獨家的產品有兩款:其一、SAM(Segment Analytics Mapping)行業分析工具。數庫是根據上市公司實際披露的產品分項推匯出其行業分類,會根據上市公司的定期報告實時做出調整。數庫行業分類,分為10個層級,4000個產品節點,幫助投資者快速瞭解產業競爭環境、系統化對比公司財務及運營資料。其二、產業鏈的分析工具。數庫在行業分析工具SAM的基礎上,衍生出的一個分析工具。從產業鏈條的角度,將上市公司通過產品相互關聯,幫助投資人優先佈局上下游的投資機會。

劉彥的終極理想是通過科技的發展,使金融從“投機”和“博弈”中逐漸走出來,走向非人為的自動化執行,把專業人士和投資弱勢群體之間的距離拉近,使個人擁有機構投資者的能力。

這兩年,科技金融成為創投最熱的風口。中國的大集團也瞄準了這個產業變革的機會。國內民營巨頭萬向集團看準了智慧金融這個方向。

2011年,萬向集團挖來了時任博時基金總經理肖風,擔任萬向集團副董事長。他迅速構建起龐大的金融帝國:浙商銀行、浙商基金、民生人壽、萬向財務、通聯資料等公司。

2013年12月,註冊資本3億元的通聯資料在上海創立,肖峰為創始人兼董事長。

通聯資料的野心很龐大,目前員工達到300人,正面與Wind、同花順、東方財富競爭,並推出了PC和移動端的資產管理業務的一站式服務平臺,內容涵蓋大資料分析、智慧投資研究、量化研究、智慧投顧和資產配置管理服務等多個領域。

通聯資料認為,自己的核心是有一批高素質的技術人才,同時還有頂級金融人才。

2017年6月6日,恆生電子正式面向金融機構推出最新的人工智慧產品:涵蓋智慧投資、智慧資訊、智慧投顧、智慧客服四大領域。其中一款產品智慧小梵可通過強大人機自然互動,提供精準資料提煉及智慧資訊分析。

在筆者的走訪中,越來越多高科技人才、金融人才進入智慧金融投研領域,這個領域已經成為紅海。

誰能夠乘著人工智慧浪潮,成為新一代的金融資訊服務終端?

敬請關注後續報道。
'''

方法一:根據標題內容生成摘要

# -*- coding: utf-8 -*-
import jieba,copy,re,codecs
from collections import Counter

from text import title,text


class Summary():
    #**** 切分句子 ************
    def cutSentence(self,text):
        sents = []
        text = re.sub(r'\n+','。',text)  # 換行改成句號(標題段無句號的情況)
        text = text.replace('。。'
,'。') # 刪除多餘的句號 text = text.replace('?。','。') # text = text.replace('!。','。') # 刪除多餘的句號 sentences = re.split(r'。|!|?|】|;',text) # 分句 #print(sentences) sentences = sentences[:-1] # 刪除最後一個句號後面的空句 for sent in sentences: len_sent = len(sent) if
len_sent < 4: # 刪除換行符、一個字元等 continue # sent = sent.decode('utf8') sent = sent.strip('  ') sent = sent.lstrip('【') sents.append(sent) return sents #**** 提取特徵詞 ********************** def getKeywords(self,title,sentences,n=10): words = [] #**** 分詞,獲取詞彙列表 ***** # split_result = pseg.cut(text) for sentence in sentences: split_result = jieba.cut(sentence) for i in split_result: words.append(i) #**** 統計詞頻TF ***** c = Counter(words) # 詞典 #**** 去除停用詞(為了提高效率,該步驟放到統計詞頻之後) self.delStopwords(c) #**** 標題中提取特徵 ********* words_title = [word for word in jieba.cut(title,cut_all=True)] self.delStopwords(words_title) #**** 獲取topN ************ topN = c.most_common(n) # for i in topN: # print(i[0],i[1]) words_topN = [i[0] for i in topN if i[1]>1] #在topN中排除出現次數少於2次的詞 words_topN = list(set(words_topN)|set(words_title)) # 正文關鍵詞與標題關鍵詞取並集 print (' '.join(words_topN)) return words_topN #**** 去除停用詞 ******************************* def delStopwords(self,dict): sw_file = codecs.open('stopwords.txt',encoding='utf8') stop_words = [] for line in sw_file.readlines(): stop_words.append(line.strip()) #***** 輸入引數為list ************* # if type(dict) is types.ListType: if type(dict) is list: words = dict for word in words: if word in stop_words: words.remove(word) #***** 輸入引數type為 <class 'collections.Counter'> ***** else: words = copy.deepcopy(list(dict.keys())) for word in words: if word in stop_words: del dict[word] return words #**** 提取topN句子 ********************** def getTopNSentences(self,sentences,keywords,n=3): sents_score = {} len_sentences = len(sentences) #**** 初始化句子重要性得分,並計算句子平均長度 len_avg = 0 len_min = len(sentences[0]) len_max = len(sentences[0]) for sent in sentences: sents_score[sent] = 0 l = len(sent) len_avg += l if len_min > l: len_min = l if len_max < l: len_max = l len_avg = len_avg / len_sentences # print(len_min,len_avg,len_max) #**** 計算句子權重得分 ********** for sent in sentences: #**** 不考慮句長在指定範圍外的句子 ****** l = len(sent) if l < (len_min + len_avg) / 2 or l > (3 * len_max - 2 * len_avg) / 4: continue words = [] sent_words = jieba.cut(sent) # <generator object cut at 0x11B38120> for i in sent_words: words.append(i) keywords_cnt = 0 len_sent = len(words) if len_sent == 0: continue for word in words: if word in keywords: keywords_cnt += 1 score = keywords_cnt * keywords_cnt * 1.0 / len_sent sents_score[sent] = score if sentences.index(sent) == 0:# 提高首句權重 sents_score[sent] = 2 * score #**** 排序 ********************** dict_list = sorted(sents_score.items(),key=lambda x:x[1],reverse=True) # print(dict_list) #**** 返回topN ****************** sents_topN = [] for i in dict_list[:n]: sents_topN.append(i[0]) # print i[0],i[1] sents_topN = list(set(sents_topN)) #**** 按比例提取 ************************** if len_sentences <= 5: sents_topN = sents_topN[:1] elif len_sentences < 9: sents_topN = sents_topN[:2] return sents_topN #**** 恢復topN句子在文中的相對順序 ********* def sents_sort(self,sents_topN,sentences): keysents = [] for sent in sentences: if sent in sents_topN and sent not in keysents: keysents.append(sent) keysents = self.post_processing(keysents) return keysents def post_processing(self,keysents): #**** 刪除不完整句子中的詳細部分 ******************** detail_tags = [',一是',':一是',',第一,',':第一,',',首先,',';首先,'] for i in keysents: for tag in detail_tags: index = i.find(tag) if index != -1: keysents[keysents.index(i)] = i[:index] #**** 刪除編號 **************************** for i in keysents: # print(i) regex = re.compile(r'^一、|^二、|^三、|^三、|^四、|^五、|^六、|^七、|^八、|^九、|^十、|^\d{1,2}、|^\d{1,2} ') result = re.findall(regex,i) if result: keysents[keysents.index(i)] = re.sub(regex,'',i) #**** 刪除備註性質的句子 ******************** for i in keysents: regex = re.compile(r'^注\d*:') result = re.findall(regex,i) if result: keysents.remove(i) #**** 刪除句首括號中的內容 ******************** for i in keysents: regex = re.compile(r'^\[.*\]') result = re.findall(regex,i) if result: keysents[keysents.index(i)] = re.sub(regex,'',i) #**** 刪除來源(空格前的部分) ******************** for i in keysents: regex = re.compile(r'^.{1,20} ') result = re.findall(regex,i) if result: keysents[keysents.index(i)] = re.sub(regex,'',i) #**** 刪除引號部分(如:銀行間債市小幅下跌,見下圖:) ******************** for i in keysents: regex = re.compile(r',[^,]+:$') result = re.findall(regex,i) if result: keysents[keysents.index(i)] = re.sub(regex,'',i) return keysents def main(self,title,text): sentences = self.cutSentence(text) keywords = self.getKeywords(title, sentences, n=8) sents_topN = self.getTopNSentences(sentences, keywords, n=3) keysents = self.sents_sort(sents_topN, sentences) print(keysents) return keysents if __name__=='__main__': summary=Summary() summary.main(title,text)

效果圖

方法二:根據內容生成摘要

import pyhanlp
from text import text

summary = pyhanlp.HanLP.extractSummary(text, 3)
print(summary)

效果圖