❶ tushare的介面怎麼樣使用
一、安裝TuShare
方式1:pip install tushare
方式2:訪問https://pypi.python.org/pypi/tushare/下載安裝
方式3:將源代碼下載到本地python setup.py install
二、升級TuShare
1、先查看本地與線上的版本版本號:
pip search tushare
2、升級TuShare:
pip install tushare --upgrade
確認安裝成功
import tushare as ts
print ts.__version__
import tushare as ts
df = ts.get_hist_data(『600848』)
ts.get_hist_data(『600848』,ktype='W『) #獲取周k線數據
ts.get_hist_data('600848』,ktype='M『) #獲取月k線數據
ts.get_hist_data('600848』,ktype='5『) #獲取5分鍾k線數據
ts.get_hist_data('600848』,ktype='15『) #獲取15分鍾k線數據
ts.get_hist_data('600848』,ktype='30『) #獲取30分鍾k線數據
ts.get_hist_data('600848』,ktype='60『) #獲取60分鍾k線數據
ts.get_hist_data('sh』)#獲取上證指數k線數據,其它參數與個股一致,下同
ts.get_hist_data(『sz』)#獲取深圳成指k線數據 ts.get_hist_data(『hs300』)#獲取滬深300指數k線數據
ts.get_hist_data(『sz50』)#獲取上證50指數k線數據
ts.get_hist_data(『zxb』)#獲取中小板指數k線數據
ts.get_hist_data(『cyb』)#獲取創業板指數k線數據
Python財經數據介麵包TuShare的使用
獲取歷史分筆數據
df = ts.get_tick_data(『000756','2015-03-27』)
df.head(10)
Python財經數據介麵包TuShare的使用
獲取實時分筆數據
df = ts.get_realtime_quotes(『000581』)
print df[['code','name','price','bid','ask','volume','amount','time']]
返回值說明:
0:name,股票名字
1:open,今日開盤價
2:pre_close,昨日收盤價
3:price,當前價格
4:high,今日最高價
5:low,今日最低價
6:bid,競買價,即「買一」報價
7:ask,競賣價,即「賣一」報價
8:volumn,成交量 maybe you need do volumn/100
9:amount,成交金額(元 CNY)
10:b1_v,委買一(筆數 bid volume)
11:b1_p,委買一(價格 bid price)
12:b2_v,「買二」
13:b2_p,「買二」
14:b3_v,「買三」
15:b3_p,「買三」
16:b4_v,「買四」
17:b4_p,「買四」
18:b5_v,「買五」
19:b5_p,「買五」
20:a1_v,委賣一(筆數 ask volume)
21:a1_p,委賣一(價格 ask price)
…
30:date,日期
31:time,時間
❷ python連接hive,怎麼安裝thrifthive
HiveServer2的啟動
啟動HiveServer2
HiveServer2的啟動十分簡便:
$ $HIVE_HOME/bin/hiveserver2
或者
$ $HIVE_HOME/bin/hive --service hiveserver2
默認情況下,HiverServer2的Thrift監聽埠是10000,其WEB UI埠是10002。可通過http://localhost:10002來查看HiveServer2的Web UI界面,這里顯示了Hive的一些基本信息。如果Web界面不能查看,則說明HiveServer2沒有成功運行。
使用beeline測試客戶端連接
HiveServer2成功運行後,我們可以使用Hive提供的客戶端工具beeline連接HiveServer2。
$ $HIVE_HOME/bin/beeline
beeline > !connect jdbc:hive2://localhost:10000
如果成功登錄將出現如下的命令提示符,此時可以編寫HQL語句。
0: jdbc:hive2://localhost:10000>
報錯:User: xxx is not allowed to impersonate anonymous
在beeline使用!connect連接HiveServer2時可能會出現如下錯誤信息:
Caused by: org.apache.hadoop.ipc.RemoteException:
User: xxx is not allowed to impersonate anonymous
這里的xxx是我的操作系統用戶名稱。這個問題的解決方法是在hadoop的core-size.xml文件中添加xxx用戶代理配置:
<property> <name>hadoop.proxyuser.xxx.groups</name> <value>*</value></property><property> <name>hadoop.proxyuser.xxx.hosts</name> <value>*</value></property>
重啟HDFS後,再用beeline連接HiveServer2即可成功連接。
常用配置
HiveServer2的配置可以參考官方文檔《Setting Up HiveServer2》
這里列舉一些hive-site.xml的常用配置:
hive.server2.thrift.port:監聽的TCP埠號。默認為10000。
hive.server2.thrift.bind.host:TCP介面的綁定主機。
hive.server2.authentication:身份驗證方式。默認為NONE(使用 plain SASL),即不進行驗證檢查。可選項還有NOSASL, KERBEROS, LDAP, PAM and CUSTOM.
hive.server2.enable.doAs:是否以模擬身份執行查詢處理。默認為true。
Python客戶端連接HiveServer2
python中用於連接HiveServer2的客戶端有3個:pyhs2,pyhive,impyla。官網的示例採用的是pyhs2,但pyhs2的官網已聲明不再提供支持,建議使用impyla和pyhive。我們這里使用的是impyla。
impyla的安裝
impyla必須的依賴包括:
six
bit_array
thriftpy(python2.x則是thrift)
為了支持Hive還需要以下兩個包:
sasl
thrift_sasl
可在Python PI中下載impyla及其依賴包的源碼。
impyla示例
以下是使用impyla連接HiveServer2的示例:
❸ python代碼運行助手怎麼打開
python代碼運行助手是能在網頁上運行python語言的工具。因為python的運行環境在很多教程里都是用dos的,黑乎乎的界面看的有點簡陋,所以出了這python代碼運行助手,作為ide。
實際上,python代碼運行助手界面只能算及格分,如果要找ide,推薦使用jupyter。jupyter被集成到ANACONDA里,只要安裝了anacoda就能使用了。
回到這個問題:
1、要打開這運行助手首先要下載一個learning.py,如果找不到可以復制如下代碼另存為「learning.py」,編輯器用sublime、或者notepad++。
#!/usr/bin/envpython3
#-*-coding:utf-8-*-
r'''
learning.py
APython3tutorialfromhttp://www.liaoxuefeng.com
Usage:
python3learning.py
'''
importsys
defcheck_version():
v=sys.version_info
ifv.major==3andv.minor>=4:
returnTrue
print('Yourcurrentpythonis%d.%d.PleaseusePython3.4.'%(v.major,v.minor))
returnFalse
ifnotcheck_version():
exit(1)
importos,io,json,subprocess,tempfile
fromurllibimportparse
fromwsgiref.simple_serverimportmake_server
EXEC=sys.executable
PORT=39093
HOST='local.liaoxuefeng.com:%d'%PORT
TEMP=tempfile.mkdtemp(suffix='_py',prefix='learn_python_')
INDEX=0
defmain():
httpd=make_server('127.0.0.1',PORT,application)
print('ReadyforPythoncodeonport%d...'%PORT)
httpd.serve_forever()
defget_name():
globalINDEX
INDEX=INDEX+1
return'test_%d'%INDEX
defwrite_py(name,code):
fpath=os.path.join(TEMP,'%s.py'%name)
withopen(fpath,'w',encoding='utf-8')asf:
f.write(code)
print('Codewroteto:%s'%fpath)
returnfpath
defdecode(s):
try:
returns.decode('utf-8')
exceptUnicodeDecodeError:
returns.decode('gbk')
defapplication(environ,start_response):
host=environ.get('HTTP_HOST')
method=environ.get('REQUEST_METHOD')
path=environ.get('PATH_INFO')
ifmethod=='GET'andpath=='/':
start_response('200OK',[('Content-Type','text/html')])
return[b'<html><head><title>LearningPython</title></head><body><formmethod="post"action="/run"><textareaname="code"style="width:90%;height:600px"></textarea><p><buttontype="submit">Run</button></p></form></body></html>']
ifmethod=='GET'andpath=='/env':
start_response('200OK',[('Content-Type','text/html')])
L=[b'<html><head><title>ENV</title></head><body>']
fork,vinenviron.items():
p='<p>%s=%s'%(k,str(v))
L.append(p.encode('utf-8'))
L.append(b'</html>')
returnL
ifhost!=HOSTormethod!='POST'orpath!='/run'ornotenviron.get('CONTENT_TYPE','').lower().startswith('application/x-www-form-urlencoded'):
start_response('400BadRequest',[('Content-Type','application/json')])
return[b'{"error":"bad_request"}']
s=environ['wsgi.input'].read(int(environ['CONTENT_LENGTH']))
qs=parse.parse_qs(s.decode('utf-8'))
ifnot'code'inqs:
start_response('400BadRequest',[('Content-Type','application/json')])
return[b'{"error":"invalid_params"}']
name=qs['name'][0]if'name'inqselseget_name()
code=qs['code'][0]
headers=[('Content-Type','application/json')]
origin=environ.get('HTTP_ORIGIN','')
iforigin.find('.liaoxuefeng.com')==-1:
start_response('400BadRequest',[('Content-Type','application/json')])
return[b'{"error":"invalid_origin"}']
headers.append(('Access-Control-Allow-Origin',origin))
start_response('200OK',headers)
r=dict()
try:
fpath=write_py(name,code)
print('Execute:%s%s'%(EXEC,fpath))
r['output']=decode(subprocess.check_output([EXEC,fpath],stderr=subprocess.STDOUT,timeout=5))
exceptsubprocess.CalledProcessErrorase:
r=dict(error='Exception',output=decode(e.output))
exceptsubprocess.TimeoutExpiredase:
r=dict(error='Timeout',output='執行超時')
exceptsubprocess.CalledProcessErrorase:
r=dict(error='Error',output='執行錯誤')
print('Executedone.')
return[json.mps(r).encode('utf-8')]
if__name__=='__main__':
main()
2,再用一個記事本寫如下的代碼:
@echooff
pythonlearning.py
pause
另存為『運行.bat』
3、把「運行.bat」和「learning.py」放到同一目錄下,
❹ tushare的介面怎麼樣使用
安裝TuShare
方式1:pip install tushare
方式2:訪問https://pypi.python.org/pypi/tushare/下載安裝
方式3:將源代碼下載到本地python setup.py install
升級TuShare
1、先查看本地與線上的版本版本號:
pip search tushare
2、升級TuShare:
pip install tushare --upgrade
確認安裝成功
import tushare as ts
print ts.__version__
獲取歷史交易數據
import tushare as ts
df = ts.get_hist_data(『600848』)
ts.get_hist_data(『600848』,ktype='W『) #獲取周k線數據
ts.get_hist_data('600848』,ktype='M『) #獲取月k線數據
ts.get_hist_data('600848』,ktype='5『) #獲取5分鍾k線數據
ts.get_hist_data('600848』,ktype='15『) #獲取15分鍾k線數據
ts.get_hist_data('600848』,ktype='30『) #獲取30分鍾k線數據
ts.get_hist_data('600848』,ktype='60『) #獲取60分鍾k線數據
ts.get_hist_data('sh』)#獲取上證指數k線數據,其它參數與個股一致,下同
ts.get_hist_data(『sz』)#獲取深圳成指k線數據 ts.get_hist_data(『hs300』)#獲取滬深300指數k線數據
ts.get_hist_data(『sz50』)#獲取上證50指數k線數據
ts.get_hist_data(『zxb』)#獲取中小板指數k線數據
ts.get_hist_data(『cyb』)#獲取創業板指數k線數據
Python財經數據介麵包TuShare的使用
獲取歷史分筆數據
df = ts.get_tick_data(『000756','2015-03-27』)
df.head(10)
Python財經數據介麵包TuShare的使用
獲取實時分筆數據
df = ts.get_realtime_quotes(『000581』)
print df[['code','name','price','bid','ask','volume','amount','time']]
返回值說明:
0:name,股票名字
1:open,今日開盤價
2:pre_close,昨日收盤價
3:price,當前價格
4:high,今日最高價
5:low,今日最低價
6:bid,競買價,即「買一」報價
7:ask,競賣價,即「賣一」報價
8:volumn,成交量 maybe you need do volumn/100
9:amount,成交金額(元 CNY)
10:b1_v,委買一(筆數 bid volume)
11:b1_p,委買一(價格 bid price)
12:b2_v,「買二」
13:b2_p,「買二」
14:b3_v,「買三」
15:b3_p,「買三」
16:b4_v,「買四」
17:b4_p,「買四」
18:b5_v,「買五」
19:b5_p,「買五」
20:a1_v,委賣一(筆數 ask volume)
21:a1_p,委賣一(價格 ask price)
…
30:date,日期
31:time,時間
❺ python stackless 怎麼多線程並發
1 介紹
1.1 為什麼要使用Stackless
摘自stackless網站。
Note
Stackless Python 是Python編程語言的一個增強版本,它使程序員從基於線程的編程方式中獲得好處,並避免傳統線程所帶來的性能與復雜度問題。Stackless為 Python帶來的微線程擴展,是一種低開銷、輕量級的便利工具,如果使用得當,可以獲益如下:
改進程序結構
增進代碼可讀性
提高編程人員生產力
以上是Stackless Python很簡明的釋義,但其對我們意義何在?——就在於Stackless提供的並發建模工具,比目前其它大多數傳統編程語言所提供的,都更加易用: 不僅是Python自身,也包括Java、C++,以及其它。盡管還有其他一些語言提供並發特性,可它們要麼是主要用於學術研究的(如 Mozart/Oz),要麼是罕為使用、或用於特殊目的的專業語言(如Erlang)。而使用stackless,你將會在Python本身的所有優勢之 上,在一個(但願)你已經很熟悉的環境中,再獲得並發的特性。
這自然引出了個問題:為什麼要並發?
1.1.1 現實世界就是並發的
現實世界就是「並發」的,它是由一群事物(或「演員」)所組成,而這些事物以一種對彼此所知有限的、鬆散耦合的方式相互作用。傳說中面向對象編程有 一個好處,就是對象能夠對現實的世界進行模擬。這在一定程度上是正確的,面向對象編程很好地模擬了對象個體,但對於這些對象個體之間的交互,卻無法以一種 理想的方式來表現。例如,如下代碼實例,有什麼問題?
第一印象,沒問題。但是,上例中存在一個微妙的安排:所有事件是次序發生的,即:直到丈夫吃完飯,妻子才開始吃;兒子則一直等到母親吃完才吃;而女 兒則是最後一個。在現實世界中,哪怕是丈夫還堵車在路上,妻子、兒子和女兒仍然可以該吃就吃,而要在上例中的話,他們只能餓死了——甚至更糟:永遠沒有人 會知道這件事,因為他們永遠不會有機會拋出一個異常來通知這個世界!
1.1.2 並發可能是(僅僅可能是)下一個重要的編程範式
我個人相信,並發將是軟體世界裡的下一個重要範式。隨著程序變得更加復雜和耗費資源,我們已經不能指望摩爾定律來每年給我們提供更快的CPU了,當 前,日常使用的個人計算機的性能提升來自於多核與多CPU機。一旦單個CPU的性能達到極限,軟體開發者們將不得不轉向分布式模型,靠多台計算機的互相協 作來建立強大的應用(想想GooglePlex)。為了取得多核機和分布式編程的優勢,並發將很快成為做事情的方式的事實標准。
1.2 安裝stackless
安裝Stackless的細節可以在其網站上找到。現在Linux用戶可以通過SubVersion取得源代碼並編譯;而對於Windows用戶, 則有一個.zip文件供使用,需要將其解壓到現有的Python安裝目錄中。接下來,本教程假設Stackless Python已經安裝好了,可以工作,並且假設你對Python語言本身有基本的了解。
2 stackless起步
本章簡要介紹了stackless的基本概念,後面章節將基於這些基礎,來展示更加實用的功能。
2.1 微進程(tasklet)
微進程是stackless的基本構成單元,你可以通過提供任一個Python可調用對象(通常為函數或類的方法)來建立它,這將建立一個微進程並將其添加到調度器。這是一個快速演示:
注意,微進程將排起隊來,並不運行,直到調用stackless.run()。
2.2 調度器(scheler)
調度器控制各個微進程運行的順序。如果剛剛建立了一組微進程,它們將按照建立的順序來執行。在現實中,一般會建立一組可以再次被調度的微進程,好讓每個都有輪次機會。一個快速演示:
注意:當調用stackless.schele()的時候,當前活動微進程將暫停執行,並將自身重新插入到調度器隊列的末尾,好讓下一個微進程被執行。一旦在它前面的所有其他微進程都運行過了,它將從上次 停止的地方繼續開始運行。這個過程會持續,直到所有的活動微進程都完成了運行過程。這就是使用stackless達到合作式多任務的方式。
2.3 通道(channel)
通道使得微進程之間的信息傳遞成為可能。它做到了兩件事:
能夠在微進程之間交換信息。
能夠控制運行的流程。
又一個快速演示:
接收的微進程調用channel.receive()的時候,便阻塞住,這意味著該微進程暫停執行,直到有信息從這個通道送過來。除了往這個通道發送信息以外,沒有其他任何方式可以讓這個微進程恢復運行。
若有其他微進程向這個通道發送了信息,則不管當前的調度到了哪裡,這個接收的微進程都立即恢復執行;而發送信息的微進程則被轉移到調度列表的末尾,就像調用了stackless.schele()一樣。
同樣注意,發送信息的時候,若當時沒有微進程正在這個通道上接收,也會使當前微進程阻塞:
發送信息的微進程,只有在成功地將數據發送到了另一個微進程之後,才會重新被插入到調度器中。
2.4 總結
以上涵蓋了stackless的大部分功能。似乎不多是吧?——我們只使用了少許對象,和大約四五個函數調用,來進行操作。但是,使用這種簡單的API作為基本建造單元,我們可以開始做一些真正有趣的事情。
3 協程(coroutine)
3.1 子常式的問題
大多數傳統編程語言具有子常式的概念。一個子常式被另一個常式(可能還是其它某個常式的子常式)所調用,或返回一個結果,或不返回結果。從定義上說,一個子常式是從屬於其調用者的。
見下例:
有經驗的編程者會看到這個程序的問題所在:它導致了堆棧溢出。如果運行這個程序,它將顯示一大堆討厭的跟蹤信息,來指出堆棧空間已經耗盡。
3.1.1 堆棧
我仔細考慮了,自己對C語言堆棧的細節究竟了解多少,最終還是決定完全不去講它。似乎,其他人對其所嘗試的描述,以及圖表,只有本身已經理解了的人才能看得懂。我將試著給出一個最簡單的說明,而對其有更多興趣的讀者可以從網上查找更多信息。
每當一個子常式被調用,都有一個「棧幀」被建立,這是用來保存變數,以及其他子常式局部信息的區域。於是,當你調用 ping() ,則有一個棧幀被建立,來保存這次調用相關的信息。簡言之,這個幀記載著 ping 被調用了。當再調用 pong() ,則又建立了一個棧幀,記載著 pong 也被調用了。這些棧幀是串聯在一起的,每個子常式調用都是其中的一環。就這樣,堆棧中顯示: ping 被調用所以 pong 接下來被調用。顯然,當 pong() 再調用 ping() ,則使堆棧再擴展。下面是個直觀的表示:
幀 堆棧
1 ping 被調用
2 ping 被調用,所以 pong 被調用
3 ping 被調用,所以 pong 被調用,所以 ping 被調用
4 ping 被調用,所以 pong 被調用,所以 ping 被調用,所以 pong 被調用
5 ping 被調用,所以 pong 被調用,所以 ping 被調用,所以 pong 被調用,所以 ping 被調用
6 ping 被調用,所以 pong 被調用,所以 ping 被調用,所以 pong 被調用,所以 ping 被調用……
現在假設,這個頁面的寬度就表示系統為堆棧所分配的全部內存空間,當其頂到頁面的邊緣的時候,將會發生溢出,系統內存耗盡,即術語「堆棧溢出」。
3.1.2 那麼,為什麼要使用堆棧?
上例是有意設計的,用來體現堆棧的問題所在。在大多數情況下,當每個子常式返回的時候,其棧幀將被清除掉,就是說堆棧將會自行實現清理過程。這一般 來說是件好事,在C語言中,堆棧就是一個不需要編程者來手動進行內存管理的區域。很幸運,Python程序員也不需要直接來擔心內存管理與堆棧。但是由於 Python解釋器本身也是用C實現的,那些實現者們可是需要擔心這個的。使用堆棧是會使事情方便,除非我們開始調用那種從不返回的函數,如上例中的,那 時候,堆棧的表現就開始和程序員別扭起來,並耗盡可用的內存。
3.2 走進協程
此時,將堆棧弄溢出是有點愚蠢的。 ping() 和 pong() 本不是真正意義的子常式,因為其中哪個也不從屬於另一個,它們是「協程」,處於同等的地位,並可以彼此間進行無縫通信。
幀 堆棧
1 ping 被調用
2 pong 被調用
3 ping 被調用
4 pong 被調用
5 ping 被調用
6 pong 被調用
在stackless中,我們使用通道來建立協程。還記得嗎,通道所帶來的兩個好處中的一個,就是能夠控制微進程之間運行的流程。使用通道,我們可以在 ping 和 pong 這兩個協程之間自由來回,要多少次就多少次,都不會堆棧溢出:
你可以運行這個程序要多久有多久,它都不會崩潰,且如果你檢查其內存使用量(使用Windows的任務管理器或Linux的top命令),將會發現 使用量是恆定的。這個程序的協程版本,不管運行一分鍾還是一天,使用的內存都是一樣的。而如果你檢查原先那個遞歸版本的內存用量,則會發現其迅速增長,直 到崩潰。
3.3 總結
是否還記得,先前我提到過,那個代碼的遞歸版本,有經驗的程序員會一眼看出毛病。但老實說,這裡面並沒有什麼「計算機科學」方面的原因在阻礙它的正 常工作,有些讓人堅信的東西,其實只是個與實現細節有關的小問題——只因為大多數傳統編程語言都使用堆棧。某種意義上說,有經驗的程序員都是被洗了腦,從 而相信這是個可以接受的問題。而stackless,則真正察覺了這個問題,並除掉了它。
4 輕量級線程
與當今的操作系統中內建的、和標准Python代碼中所支持的普通線程相比,「微線程」要更為輕量級,正如其名稱所暗示。它比傳統線程佔用更少的內存,並且微線程之間的切換,要比傳統線程之間的切換更加節省資源。
為了准確說明微線程的效率究竟比傳統線程高多少,我們用兩者來寫同一個程序。
4.1 hackysack模擬
Hackysack是一種游戲,就是一夥臟乎乎的小子圍成一個圈,來回踢一個裝滿了豆粒的沙包,目標是不讓這個沙包落地,當傳球給別人的時候,可以耍各種把戲。踢沙包只可以用腳。
在我們的簡易模擬中,我們假設一旦游戲開始,圈裡人數就是恆定的,並且每個人都是如此厲害,以至於如果允許的話,這個游戲可以永遠停不下來。
4.2 游戲的傳統線程版本
❻ 如何利用深度學習技術訓練聊天機器人語言模型
數據預處理
模型能聊的內容也取決於選取的語料。如果已經具備了原始聊天數據,可以用SQL通過關鍵字查詢一些對話,也就是從大庫里選取出一個小庫來訓練。從一些論文上,很多演算法都是在數據預處理層面的,比如Mechanism-Aware Neural Machine for Dialogue Response Generation就介紹了,從大庫中抽取小庫,然後再進行融合,訓練出有特色的對話來。
對於英語,需要了解NLTK,NLTK提供了載入語料,語料標准化,語料分類,PoS詞性標注,語意抽取等功能。
另一個功能強大的工具庫是CoreNLP,作為 Stanford開源出來的工具,特色是實體標注,語意抽取,支持多種語言。
下面主要介紹兩個內容:
中文分詞
現在有很多中文分詞的SDK,分詞的演算法也比較多,也有很多文章對不同SDK的性能做比較。做中文分詞的示例代碼如下。
# coding:utf8
'''
Segmenter with Chinese
'''
import jieba
import langid
def segment_chinese_sentence(sentence):
'''
Return segmented sentence.
'''
seg_list = jieba.cut(sentence, cut_all=False)
seg_sentence = u" ".join(seg_list)
return seg_sentence.strip().encode('utf8')
def process_sentence(sentence):
'''
Only process Chinese Sentence.
'''
if langid.classify(sentence)[0] == 'zh':
return segment_chinese_sentence(sentence)
return sentence
if __name__ == "__main__":
print(process_sentence('飛雪連天射白鹿'))
print(process_sentence('I have a pen.'))
以上使用了langid先判斷語句是否是中文,然後使用jieba進行分詞。
在功能上,jieba分詞支持全切分模式,精確模式和搜索引擎模式。
全切分:輸出所有分詞。
精確:概率上的最佳分詞。
所有引擎模式:對精確切分後的長句再進行分詞。
jieba分詞的實現
主要是分成下面三步:
1、載入字典,在內存中建立字典空間。
字典的構造是每行一個詞,空格,詞頻,空格,詞性。
上訴書 3 n
上訴人 3 n
上訴期 3 b
上訴狀 4 n
上課 650 v
建立字典空間的是使用python的dict,採用前綴數組的方式。
使用前綴數組的原因是樹結構只有一層 -word:freq,效率高,節省空間。比如單詞"dog", 字典中將這樣存儲:
{
"d": 0,
"do": 0,
"dog": 1 # value為詞頻
}
字典空間的主要用途是對輸入句子建立有向無環圖,然後根據演算法進行切分。演算法的取捨主要是根據模式- 全切,精確還是搜索。
2、對輸入的語句分詞,首先是建立一個有向無環圖。
有向無環圖,Directed acyclic graph(音 /ˈdæɡ/)。
【圖 3-2】 DAG
DAG對於後面計算最大概率路徑和使用HNN模型識別新詞有直接關系。
3、按照模式,對有向無環圖進行遍歷,比如,在精確模式下,便利就是求最大權重和的路徑,權重來自於在字典中定義的詞頻。對於沒有出現在詞典中的詞,連續的單個字元也許會構成新詞。然後用HMM模型和Viterbi演算法識別新詞。
精確模型切詞:使用動態規劃對最大概率路徑進行求解。
最大概率路徑:求route = (w1, w2, w3 ,.., wn),使得Σweight(wi)最大。Wi為該詞的詞頻。
更多的細節還需要讀一下jieba的源碼。
自定義字典
jieba分詞默認的字典是:1998人民日報的切分語料還有一個msr的切分語料和一些txt小說。開發者可以自行添加字典,只要符合字典構建的格式就行。
jieba分詞同時提供介面添加詞彙。
Word embedding
使用機器學習訓練的語言模型,網路演算法是使用數字進行計算,在輸入進行編碼,在輸出進行解碼。word embedding就是編解碼的手段。
【圖 3-3】 word embedding, Ref. #7
word embedding是文本的數值化表示方法。表示法包括one-hot,bag of words,N-gram,分布式表示,共現矩陣等。
Word2vec
近年來,word2vec被廣泛採用。Word2vec輸入文章或者其他語料,輸出語料中詞彙建設的詞向量空間。詳細可參考word2vec數學原理解析。
使用word2vec
安裝完成後,得到word2vec命令行工具。
word2vec -train "data/review.txt"
-output "data/review.model"
-cbow 1
-size 100
-window 8
-negative 25
-hs 0
-sample 1e-4
-threads 20
-binary 1
-iter 15
-train "data/review.txt" 表示在指定的語料庫上訓練模型
-cbow 1 表示用cbow模型,設成0表示用skip-gram模型
-size 100 詞向量的維度為100
-window 8 訓練窗口的大小為8 即考慮一個單詞的前八個和後八個單詞
-negative 25 -hs 0 是使用negative sample還是HS演算法
-sample 1e-4 採用閾值
-threads 20 線程數
-binary 1 輸出model保存成2進制
-iter 15 迭代次數
在訓練完成後,就得到一個model,用該model可以查詢每個詞的詞向量,在詞和詞之間求距離,將不同詞放在數學公式中計算輸出相關性的詞。比如:
vector("法國") - vector("巴黎) + vector("英國") = vector("倫敦")"
對於訓練不同的語料庫,可以單獨的訓練詞向量模型,可以利用已經訓練好的模型。
其它訓練詞向量空間工具推薦:Glove。
Seq2Seq
2014年,Sequence to Sequence Learning with Neural Networks提出了使用深度學習技術,基於RNN和LSTM網路訓練翻譯系統,取得了突破,這一方法便應用在更廣泛的領域,比如問答系統,圖像字幕,語音識別,撰寫詩詞等。Seq2Seq完成了【encoder + decoder -> target】的映射,在上面的論文中,清晰的介紹了實現方式。
【圖 3-4】 Seq2Seq, Ref. #1
也有很多文章解讀它的原理。在使用Seq2Seq的過程中,雖然也研究了它的結構,但我還不認為能理解和解釋它。下面談兩點感受:
a. RNN保存了語言順序的特點,這和CNN在處理帶有形狀的模型時如出一轍,就是數學模型的設計符合物理模型。
【圖 3-5】 RNN, Ref. #6
b. LSTM Cell的復雜度對應了自然語言處理的復雜度。
【圖 3-6】 LSTM, Ref. #6
理由是,有人將LSTM Cell嘗試了多種其它方案傳遞狀態,結果也很好。
【圖 3-7】 GRU, Ref. #6
LSTM的一個替代方案:GRU。只要RNN的Cell足夠復雜,它就能工作的很好。
使用DeepQA2訓練語言模型
准備工作,下載項目:
git clone https://github.com/Samurais/DeepQA2.git
cd DeepQA2
open README.md # 根據README.md安裝依賴包
DeepQA2將工作分成三個過程:
數據預處理:從語料庫到數據字典。
訓練模型:從數據字典到語言模型。
提供服務:從語言模型到RESt API。
預處理
DeepQA2使用Cornell Movie Dialogs Corpus作為demo語料庫。
原始數據就是movie_lines.txt和movie_conversations.txt。這兩個文件的組織形式參考README.txt
deepqa2/dataset/preprocesser.py是將這兩個文件處理成數據字典的模塊。
train_max_length_enco就是問題的長度,train_max_length_deco就是答案的長度。在語料庫中,大於該長度的部分會被截斷。
程序運行後,會生成dataset-cornell-20.pkl文件,它載入到python中是一個字典:
word2id存儲了{word: id},其中word是一個單詞,id是int數字,代表這個單詞的id。
id2word存儲了{id: word}。
trainingSamples存儲了問答的對話對。
比如 [[[1,2,3],[4,5,6]], [[7,8,9], [10, 11, 12]]]
1,2,3 ... 12 都是word id。
[1,2,3] 和 [4,5,6] 構成一個問答。 [7,8,9] 和 [10, 11, 12] 構成一個問答。
開始訓練
cp config.sample.ini config.ini # modify keys
python deepqa2/train.py
config.ini是配置文件, 根據config.sample.ini進行修改。訓練的時間由epoch,learning rate, maxlength和對話對的數量而定。
deepqa2/train.py大約100行,完成數據字典載入、初始化tensorflow的session,saver,writer、初始化神經元模型、根據epoch進行迭代,保存模型到磁碟。
session是網路圖,由placeholder, variable, cell, layer, output 組成。
saver是保存model的,也可以用來恢復model。model就是實例化variable的session。
writer是查看loss fn或者其他開發者感興趣的數據的收集器。writer的結果會被saver保存,然後使用tensorboard查看。
Model
Model的構建要考慮輸入,狀態,softmax,輸出。
定義損耗函數,使用AdamOptimizer進行迭代。
最後,參考一下訓練的loop部分。
每次訓練,model會被存儲在save路徑下,文件夾的命名根據機器的hostname,時間戳生成。
提供服務
在TensorFlow中,提供了標準的serving模塊 - tensorflow serving。但研究了很久,還專門看了一遍 《C++ Essentials》,還沒有將它搞定,社區也普遍抱怨tensorflow serving不好學,不好用。訓練結束後,使用下面的腳本啟動服務,DeepQA2的serve部分還是調用TensorFlow的python api。
cd DeepQA2/save/deeplearning.cobra.vulcan.20170127.175256/deepqa2/serve
cp db.sample.sqlite3 db.sqlite3
python manage.py runserver 0.0.0.0:8000
測試
POST /api/v1/question HTTP/1.1
Host: 127.0.0.1:8000
Content-Type: application/json
Authorization: Basic YWRtaW46cGFzc3dvcmQxMjM=
Cache-Control: no-cache
{"message": "good to know"}
response
{
"rc": 0,
"msg": "hello"
}
serve的核心代碼在serve/api/chatbotmanager.py中。
使用腳本
scripts/start_training.sh啟動訓練
scripts/start_tensorboard.sh啟動Tensorboard
scripts/start_serving.sh啟動服務
對模型的評價
目前代碼具有很高的維護性,這也是從DeepQA項目進行重構的原因,更清晰的數據預處理、訓練和服務。有新的變更可以添加到deepqa2/models中,然後在train.py和chatbotmanager.py變更一下。
有待改進的地方
a. 新建models/rnn2.py, 使用dropout。目前DeepQA中已經使用了Drop.
b. tensorflow rc0.12.x中已經提供了seq2seq network,可以更新成tf版本.
c. 融合訓練,目前model只有一個庫,應該是設計一個新的模型,支持一個大庫和小庫,不同權重進行,就如Mechanism-Aware Neural Machinefor Dialogue Response Generation的介紹。
d. 代碼支持多機多GPU運行。
e. 目前訓練的結果都是QA對,對於一個問題,可以有多個答案。
f. 目前沒有一個方法進行accuracy測試,一個思路是在訓練中就提供干擾項,因為當前只有正確的答案,如果提供錯誤的答案(而且越多越好),就可以使用recall_at_k方法進行測試。
機器人家上了解到的,希望對你有用
❼ tushare的介面怎麼樣使用
Tushare簡介
Tushare金融大數據開放社區,免費提供各類金融數據和區塊鏈數據,助力智能投資與創新型投資。網址:https://tushare.pro/register?reg=527754
註:推廣一下分享鏈接,幫我攢點積分,你好我也好 ^_^ 。
python環境安裝
強烈建議使用Anaconda,Anaconda的安裝見:https://tushare.pro/document/1?doc_id=29
python的IDE我使用vscode,在Anaconda主界面中直接打開vscode,它會幫你設置好環境,簡單方便。
tushare庫安裝
打開vscode的[查看]->[終端],輸入 pip install tushare 即可安裝tushare。輸入 pip install tushare --upgrade 即可更新tushare。缺少或者更新其他python庫,參照這個方法即可。
環境安裝好後,就可以開工了。直接上代碼,這份代碼從Tushare下載股票列表數據,保存為csv文件,同時保存在mssql資料庫中。
注意:在to_sql中的schema參數為資料庫名,需要帶上該資料庫的角色,我使用sa登錄,資料庫隸屬於dbo。使用to_sql不需要創建表,pandas會自動幫你創建好,也不需要自己寫插入數據的代碼,還是很方便的。如果你在表中增加了主鍵或者唯一索引,有重復數據時批量入庫會失敗。tushare本身是有少量重復數據的。採用逐行入庫的方式速度會比較慢,需要根據業務自己衡量選擇。
#!/usr/bin/python3
# coding:utf-8
# -*- coding: utf-8 -*-
import time
import datetime
import random
import tushare
import pandas
import pymssql
import sqlalchemy
#需修改的參數
stock_list_file = 'stock_list.csv' #股票列表文件csv
#tushare token
tushare_token='你自己的token'
#資料庫參數
db_host = '127.0.0.1'
db_user = 'sa'
db_password = 'pwd'
db_db = 'quantum'
db_charset = 'utf8'
db_url = 'mssql+pymssql://sa:[email protected]:1433/quantum'
#股票列表
def get_stock_basic() :
print('開始下載股票列表數據')
#獲取tushare
pro = tushare.pro_api()
#下載
data = pro.stock_basic(fields='ts_code,symbol,name,fullname,list_status,list_date,delist_date')
#保存到csv文件
data.to_csv(stock_list_file)
#入庫
engine = sqlalchemy.create_engine(db_url)
try:
#先一次性入庫,異常後逐條入庫
pandas.io.sql.to_sql(data, 'stock_basic', engine, schema='quantum.dbo', if_exists='append', index=False)
except :
#逐行入庫
print('批量入庫異常,開始逐條入庫.')
for indexs in data.index :
line = data.iloc[indexs:indexs+1, :]
try:
pandas.io.sql.to_sql(line, 'stock_basic', engine, schema='quantum.dbo', if_exists='append', index=False, chunksize=1)
except:
print('股票列表數據入庫異常:')
print(line)
finally:
pass
finally:
pass
print('完成下載股票列表數據')
return 1
#全量下載所有股票列表數據
if __name__ == '__main__':
print('開始...')
#初始化tushare
tushare.set_token(tushare_token)
print('獲取股票列表')
get_stock_basic()
print('結束')
❽ 我用Python做了一個櫻花樹,360說有活動感染病毒正在入侵你的電腦,怎麼回事。
你的exe應用沒有安全證書,360就會報錯的,我也遇到過。沒關系。網上下載的應用都是有安全證書的。你把360關了就行。