當前位置:首頁 » 編程語言 » dijkstrapython

dijkstrapython

發布時間: 2022-09-19 09:53:22

A. python寫的dijkstra看不懂,求指導

請問題主的問題是在語言上還是在演算法上?
如果是語言上的問題,請列出具體的代碼片段,說明具體的疑惑之處。
如果是演算法問題,建議題主先學習一下dijkstra演算法。學習演算法最好的方法不是看程序實現,必須先自己弄懂原理,然後自己動手實現一次。

B. 學習python必備的8本書,你看過幾本-簡書

1.Python Cookbook

如果你在編寫Python3程序時需要幫助,或者想更新老的Python2代碼,這本書正是你所需要的。這本書包含了大量使用Python3.3編寫並測試過的實用編程技巧。對於那些關注現代工具和慣用技巧的有經驗的Python程序員來說,這本書無可替代。

此書是矽谷創業之父PaulGraham的文集,主要介紹黑客即優秀程序員的愛好和動機,討論黑客成長、黑客對世界的貢獻以及編程語言和黑客工作方法等所有對計算機時代感興趣的人的一些話題。書中的內容不但有助於了解計算機編程的本質、互聯網行業的規則,還會幫助讀者了解我們所在的時代,迫使讀者獨立思考。本書適合所有程序員和互聯網創業者,也適合一切對計算機行業感興趣的讀者。

C. dijkstra in python

這個不知道是不是你要的那個

http://blog.chinaunix.net/u1/54441/showart_1335190.html

在CSDN中C的

D. 關於Python 的經典入門書籍有哪些

1.《Python編程:從入門到實踐》
這本書算是比較全面系統的入門Python教程。基本的概念解釋得算是比較不錯的,我們知道,對於零基礎學習編程的人來說,基礎的概念是最關鍵也是最重要的一部分,誰能把基本的概念講得通俗易懂,那麼誰也就自然受歡迎了。
2.《像計算機科學家一樣思考Python》
本書更多的是想培養讀者以計算機科學家一樣的思維方式來理解Python語言編程。貫穿全書的主體是如何思考、設計、開發的方法。從基本的編程概念開始,一步步引導讀者了解Python語言,再逐漸掌握函數、遞歸、數據結構和面向對象設計等高階概念。
3.《Python編程:從入門到實踐》
2016年出版的書,基於 Python3.5 同時也兼顧 Python2.7 ,書中涵蓋的內容是比較精簡的,沒有艱深晦澀的概念,每個小結都附帶練習題,它可以幫助你更快的上手編寫程序,解決實際編程問題,上到有編程基礎的程序員,下到10歲少年,想入門Python並達到可以開發實際項目的水平,這本書都是個不錯的選擇。
4.《Python核心編程第三版(中文版)》
該書向讀者介紹了這種語言的核心內容,並展示了Python語言可以完成哪些任務。其主要內容包括:語法和編程風格、Python語言的對象、Web程序設計、執行環境等。該書條理清晰、通俗易懂,是學習Python語言的最好教材及參考手冊。所附光碟包括Python語言最新的三個版本及書中示例代碼。
5.《Python演算法教程》
Python演算法教程用Python語言來講解演算法的分析和設計。本書主要關注經典的演算法,但同時會為讀者理解基本演算法問題和解決問題打下很好的基礎。全書共11章。分別介紹了樹、圖、計數問題、歸納遞歸、遍歷、分解合並、貪心演算法、復雜依賴、Dijkstra演算法、匹配切割問題以及困難問題及其稀釋等內容。本書在每一章結束的時候均有練習題和參考資料,這為讀者的自我檢查以及進一步學習提供了較多的便利。在全書的結尾,給出了練習題的提示,方便讀者進行查漏補缺。

E. Python中networkx中shortest_path使用的是哪一種最短路徑方法

不全是。依據傳入的參數決定調用哪種演算法。

源碼:至少涉及了dijkstra、廣度優先/深度優先演算法。

ifsourceisNone:
iftargetisNone:
##Findpathsbetweenallpairs.
ifweightisNone:
paths=nx.all_pairs_shortest_path(G)
else:
paths=nx.all_pairs_dijkstra_path(G,weight=weight)
else:
##Findpathsfromallnodesco-accessibletothetarget.
directed=G.is_directed()
ifdirected:
G.reverse(=False)

ifweightisNone:
paths=nx.single_source_shortest_path(G,target)
else:
paths=nx.single_source_dijkstra_path(G,target,weight=weight)

#.
fortargetinpaths:
paths[target]=list(reversed(paths[target]))

ifdirected:
G.reverse(=False)
else:
iftargetisNone:
##.
ifweightisNone:
paths=nx.single_source_shortest_path(G,source)
else:
paths=nx.single_source_dijkstra_path(G,source,weight=weight)
else:
##Findshortestsource-targetpath.
ifweightisNone:
paths=nx.bidirectional_shortest_path(G,source,target)
else:
paths=nx.dijkstra_path(G,source,target,weight)

F. 程序員9個不良編程習慣

我們曾經都做過這樣的事情:當媽媽不注意的時候,偷偷地吃糖果零食,然後導致有了蛀牙。同樣的,我們都違背過一些編程的基本規則,並且都會堅定地表示這種行為是不可取的。但我們就是偷偷愛著這些不良的編程習慣。


我們對所謂的編程規則嗤之以鼻,輸出的代碼也很糟糕——但我們依然活著。編程上帝沒有下閃電劈死我們,我們的電腦也沒有爆炸。事實上,只要我們能編譯和發布代碼,客戶似乎就很滿意了。


這是因為糟糕的編程不像安裝電路或者摸老虎屁股那樣有直接的危害性。大多數時間里它也是可以工作的。規則通常是作為一種指導或格式上的建議,並沒有硬性規定一定要遵守,也不會導致代碼馬上死掉。當然,你的代碼可能會被人恥笑,甚至可能大家公開嘲笑你,不過,這種挑戰慣例的行為可以讓人增加一點顛覆傳統的快感,哪怕是在不經意間。


為了讓問題變得更加復雜,有時候違反規則反而更好。(一般人我不告訴他!)出來的代碼會更干凈,甚至可能會更快和更簡單。規則通常顯得太過於寬泛,有技巧的程序員可以通過打破這些規則來提高代碼。不要告訴你的老闆,這對你的編碼生涯會很有意義。


下面這9個編碼習慣,雖然在編程規則中是被駁斥的,但我們很多人就是會不由自主地使用它們。


編程習慣No.1:使用goto


關於禁止使用goto可以追溯到許多結構化編程工具還未面世的時代。如果程序員想要創建一個循環或跳到另一段程序中,那麼他們需要輸入goto後再跟一個行號。過了幾年之後,編譯器團隊讓程序員使用字元串標簽取代行號。這在當時被認為是一個熱門的新功能。


有的人認為這會導致「義大利面條式代碼」。代碼會變得不可讀,並且很難理解代碼的執行路徑。線程混亂,纏纏綿綿到天涯。Edsger
Dijkstra就三令五申地表示應該禁止這個命令,他有一份詼諧的手稿,題目為《Goto語句害人不淺》。


但絕對的分支是沒有問題的。這就讓人糾結了。通常,巧妙的break語句和return
語句可提供一個非常干凈的關於代碼在那個時候執行什麼的聲明。有時候,添加goto
到case語句會比更恰當的多級嵌套的if-then-else語句塊更易於理解。


也有反例。在蘋果的SSL堆棧中的「goto
fail」安全漏洞就是最好的例子之一。但是,如果我們能夠仔細避免case語句和循環的一些尷尬問題,那麼我們就可以嵌入良好的絕對轉移,使閱讀代碼的人更容易明白這是怎麼回事。我們可以插入break和return
語句,讓每一個人感覺更清潔和更愉快——可能得除了goto的敵視者。


編程習慣No.2:成功避開文檔


我的一個朋友有一個非常精明的老闆,這位老闆雖然從來沒有寫過任何代碼,但卻秉持著每一個功能都必須包含在文檔中的理念。哪個程序員不提供注釋,那麼他就會受到懲罰。所以,我的朋友在他的編輯器中聯入了一個有點像人工智慧的玩意兒,於是乎,他的每一個功能就都有幾行「文檔」了。因為這位精明的老闆還不夠聰明到能理解這些注釋其實啥意思也沒有,所以我的朋友逃過一劫。他的代碼常常被作為正式文檔。我想,他應該快要升職了!


許多函數方法,甚至一些類或多或少都能自文檔化。冠以insertReservation或cancelReservation或deleteAll
等名稱的函數並不需要多此一舉來解釋它們的作用。為函數取一個正確的名字往往就足夠了。事實上,這比寫一段長長的注釋要好,因為函數名可以出現在代碼中的其他地方。而文檔只能默默地呆在某個角落。自文檔化的函數名可以改進它們出現的每個文件。


在有些情況下,寫文檔甚至會導致情況變糟。例如,當代碼瞬息萬變,團隊像瘋了似的重構的時候,文檔會產生分歧。代碼是這樣寫的,但文檔解釋的還是四五個版本以前的情況。這類「過時」的文檔通常位於代碼頂部,有的人會在這里對代碼應該發生什麼作一個美好總結。因此,盡管重構團隊已經仔細修改了相關的注釋,但還是會遺漏文件頂部的這段「美好總結」。


當代碼和文本出現分歧的時候,注釋就變得毫無價值,甚至會產生誤導。在這樣的情況下,良好的自文檔化的代碼顯然勝出了。


編程習慣No.3:一行寫太多代碼


老闆突然發神經地給團隊發了一封討厭的郵件:為了執行非常嚴格的風格規定,我們大家都必須重寫我們的代碼。最神奇的要求是:每個行為或步驟或子句必須各自成行。你不能使用點語法連續調用函數。在一個分支語句中,你不能有兩個及以上返回布爾值的子句。如果要定義變數,那麼另起一行。如果你正在做一個復雜的計算,那麼不要使用括弧。每個片段也自成一行。


他認為他的這個法令將能使調試變得更加容易。就像你單步調試代碼一樣,調試器會一個動作一個動作地前進。這樣就不會卡在某一行。而且更容易執行。


但是這樣一來,鍵盤上的回車鍵煩不勝煩,因為我需要不斷地插入行。而且我敢肯定,老闆因此還可以到處吹噓他的團隊能寫多少行代碼。


唉,有時在同一行中聲明一堆變數反而更容易;有時把所有的布爾子句放在一起反而更簡單——一切都能變得更加緊湊。那也意味著,我們可以在屏幕上看到更多的邏輯而無需滾動滑鼠。更易於閱讀就意味著理解起來更快。這才是簡單的精粹。


編程習慣No.4:不聲明類型


那些熱愛類型化語言的人認為,如果為每個變數添加明確的數據類型聲明,就可以寫出更好的、沒有錯誤的代碼。花一點時間來拼寫類型,能幫助編譯器在代碼開始運行之前標志愚蠢的錯誤。可能會讓人覺得痛苦,但很有幫助。這是編程中停止bug的一種有備無患的方法。


但是時代變了。許多較新的編譯器完全可以智能地通過查看代碼來推斷類型。它們會向後和向前瀏覽代碼,直到可以肯定這個變數是string
還是int,抑或其他。如果這些被查看的類型不成隊列,那麼錯誤標志就會點亮。因此再也不需要我們輸入變數的類型了。


這意味著我們現在可以在代碼中省略掉一些最簡單的聲明。代碼更清潔,而且閱讀代碼的人也猜得出for循環中命名為i的變數表示一個整數型。


編程習慣No.5:搖擺不定的代碼


有的程序員在代碼上特別優柔寡斷,猶豫不決。先是一開始將值存儲為字元串,然後又解析成整數。接著又轉換回字元串。這是非常低效的,你甚至可以感覺到CPU在咆哮這種浪費負載的行為。聰明的程序員之所以能快速地編碼,是因為他們事先會設計架構,以盡量減少轉換。他們的代碼能更快地運行是因為他們有一個良好的規劃。


但是,不管你信不信,這種搖擺不定的代碼有時候也是有意義的。比如說,你有一個非常棒的庫,在它專有的黑盒子里能做無數智能的事情。如果庫需要字元串的數據,那麼你就給它字元串,即使你剛將這個數據轉換成為整數型。


當然,你可以重寫所有的代碼,以盡量減少轉換,但是這需要時間。而且,有時候讓代碼稍微多花點額外時間來運行也未嘗不可,因為重寫代碼需要耗費我們更多的時間。有時,背負這樣的技術債務比一開始就正確構建的成本要更低。


有的時候,庫不是專有的代碼,但那些你以前全部自己寫的代碼是你獨有的。有的時候,再次轉換數據比重寫庫中的所有代碼要快得多。所以,就讓它這樣吧,就讓代碼搖擺吧。


編程習慣No.6:編寫你自己的數據結構


有一個標准規則是,程序員在完成數據結構課程的第二年,不應該寫用於存儲數據的代碼。基本上我們需要的所有的數據結構,已經有人寫好了,而且其代碼已歷經多年的測試和再測試。它和語言捆綁在一起,而且常常是免費的。你的代碼只能造就bug。


但有時你會發現數據結構庫有點慢。有時它們會迫使我們使用標準的,但於我們的代碼卻是錯誤的結構。有時庫會把我們推向在使用結構之前重新配置數據的地步。有時庫會包含一些所謂有備無患的保護功能,如線程鎖,但其實我們的代碼並不需要。


如果遇到這種情況,那麼就應該著手寫我們自己的數據結構。這或許能讓你做得更快,做得更多。而且代碼會變得更清潔,因為我們不會包括那些多餘的用於格式化數據來完成一些功能的代碼。


編程習慣No.7:在中間打破循環


有一個規則制定小組宣稱,每個循環都應該有一個「常量」,也就是說當這個邏輯語句為true的時候,循環一直執行。當常量一定不會是true的時候,循環才會結束。這是考慮復雜循環的好方法,但它會導致愚蠢的禁令——例如禁止我們在循環中間使用return
和break語句。這一條也包含在禁止goto語句的規則中。


這個理論是好的,但它通常會導致更復雜的代碼。請看下面這個簡單的案例,遍歷數組,將找到的元素傳遞給test函數,並將該元素返回:


while(i


...


if(test(a[i])thenreturna[i];


...


}


「循環常量」愛好者會要求我們增加一個布爾變數,命名為notFound,然後這樣使用:


while((notFound)&&(i


...


if(test(a[i]))thennotFound=false;


...


}


如果這個布爾值能夠合理地命名,那麼這就是一段很棒的自文檔化的代碼,更易於大家理解。但這也增加了復雜性。這意味著你需要分配另一個局部變數,並堵塞寄存器,因為編譯器也許還不能足夠智能到解決這個問題。


有時候,一個goto語句或一個跳轉會更干凈利索。


編程習慣No.8:使用短變數名(i和x和and也是有意義的)


EdgarAllan
Poe這位詩人和小說家曾經說過,在一個故事中的每一個詞都應該是有內涵的。編碼規則也強調如此。變數名應該說明這個變數的所作所為。那些使用駝峰式大小寫的方法來寫變數名,以表達關於變數細節的Java程序員深以為然,於是一個又一個瘋狂長度的變數名出爐了。有些程序員寫的變數名,會組合五六個甚至更多的詞語。


但有的時候,使用單個字母作為變數名反而會更方便。有時在循環迭代中只使用i或j會更簡單。有時使用字母a代表array
,l代表list會更便捷,即使是字母l和數字1看上去很難辨別。


正如這篇文章前面鼓勵的是自文檔化的代碼,而非長長的注釋。在上述情況下,單個字母的變數名也是自文檔化的。字母i
是通用的迭代器。只要是程序員立刻就會懂。


編程習慣No.9:重新定義運算符和函數


一些最有趣的編程語言允許你去做一些特別詭異的事情,例如重新定義元素的值,就如同常量一般。例如Python,你可以輸入TRUE=FALSE(在Version2.7及之前的版本)。這並不會產生某種邏輯崩潰,或導致宇宙終結——僅僅只是互換了TRUE和FALSE的含義。你也可以在C預處理器和一些其他語言中玩玩類似於這樣的危險游戲。還有一些語言允許你重新定義運算符,如加號。


當然這是延伸了,不過有一個觀點是,在一個大的代碼塊內,當重新定義一個或多個所謂的常量時,速度會更快。有時老闆會要求代碼做一些截然不同的事情。當然,你可以修改代碼的每個事件,或者,你可以重新定義。這讓你看上去像一個天才。不必重寫一個龐大的庫,只需翻轉一下,就可以做相反的事情了。


這9個習慣就都在這兒了。千萬不要輕易嘗試,不管它看上去有多牛掰。太危險了——真的,這是實話。

G. 自然語言處理(NLP)的基礎難點:分詞演算法

自然語言處理(NLP,Natural Language Processing)是人工智慧領域中的一個重要方向,主要研究人與計算機之間用自然語言進行有效通信的各種理論和方法。自然語言處理的底層任務由易到難大致可以分為詞法分析、句法分析和語義分析。分詞是詞法分析(還包括詞性標注和命名實體識別)中最基本的任務,也是眾多NLP演算法中必不可少的第一步,其切分准確與否往往與整體結果息息相關。

金融領域分詞的難點

分詞既簡單又復雜。簡單是因為分詞的演算法研究已經很成熟了,大部分的演算法(如HMM分詞、CRF分詞)准確率都可以達到95%以上;復雜則是因為剩下的5%很難有突破,主要可以歸結於三點:

▲粒度,即切分時的最小單位,不同應用對粒度的要求不一樣,比如「融資融券」可以是一個詞也可以是兩個詞

▲歧義,比如「恆生」一詞,既可指恆生公司,又可指恆生指數

▲未登錄詞,即未出現在演算法使用的詞典中的詞,比如不常見的專業金融術語,以及各種上市公司的名稱

在金融領域中,分詞也具有上述三個難點,並且在未登錄詞方面的難點更為突出,這是因為金融類詞彙本來就多,再加上一些專有名詞不僅有全稱還有簡稱,這就進一步增大了難度。

在實際應用中,以上難點時常會造成分詞效果欠佳,進而影響之後的任務。尤其是在一些金融業務中,有許多需要與用戶交互的場景,某些用戶會用口語化的詞彙描述業務,如果分詞錯誤會影響用戶意圖的解析,這對分詞的准確性提出了更高的要求。因此在進行NLP上層應用開發時,需要對分詞演算法有一定的了解,從而在效果優化時有能力對分詞器進行調整。接下來,我們介紹幾種常用的分詞演算法及其應用在金融中的優劣。

幾種常見的分詞演算法

分詞演算法根據其核心思想主要分為兩種:

第一種是基於字典的分詞,先把句子按照字典切分成詞,再尋找詞的最佳組合方式,包括最大匹配分詞演算法、最短路徑分詞演算法、基於N-Gram model的分詞演算法等;

第二種是基於字的分詞,即由字構詞,先把句子分成一個個字,再將字組合成詞,尋找最優的切分策略,同時也可以轉化成序列標注問題,包括生成式模型分詞演算法、判別式模型分詞演算法、神經網路分詞演算法等。

最大匹配分詞尋找最優組合的方式是將匹配到的最長片語合在一起,主要的思路是先將詞典構造成一棵Trie樹(也稱為字典樹),Trie樹由詞的公共前綴構成節點,降低了存儲空間的同時可以提升查找效率。

最大匹配分詞將句子與Trie樹進行匹配,在匹配到根結點時由下一個字重新開始進行查找。比如正向(從左至右)匹配「他說的確實在理」,得出的結果為「他/說/的確/實在/理」。如果進行反向最大匹配,則為「他/說/的/確實/在理」。

這種方式雖然可以在O(n)時間對句子進行分詞,但是只單向匹配太過絕對,尤其是金融這種詞彙較豐富的場景,會出現例如「交易費/用」、「報價單/位」等情況,所以除非某些詞的優先順序很高,否則要盡量避免使用此演算法。

最短路徑分詞演算法首先將一句話中的所有詞匹配出來,構成詞圖(有向無環圖DAG),之後尋找從起始點到終點的最短路徑作為最佳組合方式,例:

我們認為圖中每個詞的權重都是相等的,因此每條邊的權重都為1。

在求解DAG圖的最短路徑問題時,總是要利用到一種性質:即兩點之間的最短路徑也包含了路徑上其他頂點間的最短路徑。比如S->A->B->E為S到E到最短路徑,那S->A->B一定是S到B到最短路徑,否則會存在一點C使得d(S->C->B)<d(S->A->B),那S到E的最短路徑也會變為S->C->B->E,這就與假設矛盾了。利用上述的最優子結構性質,可以利用貪心演算法或動態規劃兩種求解演算法:

(1)基於Dijkstra演算法求解最短路徑,該演算法適用於所有帶權有向圖,求解源節點到其他所有節點的最短路徑,並可以求得全局最優解;

(2)N-最短路徑分詞演算法,該方法是對Dijkstra演算法的擴展,在每一步保存最短的N條路徑,並記錄這些路徑上當前節點的前驅,在最後求得最優解時回溯得到最短路徑。這種方法的准確率優於Dijkstra演算法,但在時間和空間復雜度上都更大。

相較於最大匹配分詞演算法,最短路徑分詞演算法更加靈活,可以更好地把詞典中的片語合起來,能更好地解決有歧義的場景。比如上述「他說的確實在理」這句話,用最短路徑演算法的計算結果為「他/說/的/確實/在理」,避免了正向最大匹配的錯誤。但是對於詞典中未存在的詞基本沒有識別能力,無法解決金融領域分詞中的「未登錄詞」難點。

N-Gram(又稱N元語法模型)是基於一個假設:第n個詞出現與前n-1個詞相關,而與其他任何詞不相關。在此種假設下,可以簡化詞的條件概率,進而求解整個句子出現的概率。

現實中,常用詞的出現頻率或者概率肯定比罕見詞要大。因此,可以將求解詞圖最短路徑的問題轉化為求解最大概率路徑的問題,即分詞結果為「最有可能的詞的組合「。

計算詞出現的概率,僅有詞典是不夠的,還需要充足的語料,所以分詞任務已經從單純的「演算法」上升到了「建模」,即利用統計學方法結合大數據挖掘,對「語言」(句子出現的概率)進行建模。

我們將基於N-gram模型所統計出的概率分布應用到詞圖中,可以得到詞的概率圖。對該詞圖用最短路徑分詞演算法求解最大概率的路徑,即可得到分詞結果。

相較於前兩種分詞演算法,基於N-Gram model的分詞演算法對詞頻進行了統計建模,在切分有歧義的時候力求得到全局最優值,比如在切分方案「證券/自營/業務」和「證券/自/營業/務」中,統計出「證券/自營/業務」出現的概率更大,因此結果有更高的准確率。但也依然無法解決金融場景中未登錄詞的問題。

生成式模型主要有隱馬爾可夫模型(HMM,Hidden Markov Model)、樸素貝葉斯分類等。HMM是常用的分詞模型,基於Python的jieba分詞器和基於Java的HanLP分詞器都使用了HMM。

HMM模型認為在解決序列標注問題時存在兩種序列,一種是觀測序列,即人們顯性觀察到的句子,另一種是隱狀態序列,即觀測序列的標簽。假設觀測序列為X,隱狀態序列是Y,則因果關系為Y->X。因此要得到標注結果Y,必須對X的概率、Y的概率、P(X|Y)進行計算,即建立P(X,Y)的概率分布模型。

HMM演算法可以在一定程度上解決未登錄詞的問題,但生成式模型的准確率往往沒有接下來要談到的判別式模型高。

判別式模型主要有感知機、支持向量機(SVM,Support Vector Machine)、條件隨機場(CRF,Conditional Random Field)、最大熵模型等,其中感知機模型和CRF模型是常用的分詞模型。

(1)平均感知機分詞演算法

感知機是一種簡單的二分類線性模型,通過構造超平面,將特徵空間(輸入空間)中的樣本分為正負兩類。通過組合,感知機也可以處理多分類問題。但由於每次迭代都會更新模型的所有權重,被誤分類的樣本會造成很大影響,因此採用平均的方法,在處理完一部分樣本後對更新的權重進行平均。

(2)CRF分詞演算法

CRF可以看作一個無向圖模型,假設給定的標注序列為Y,觀測序列為X,CRF對條件概率P(Y|X)進行定義,而不是對聯合概率建模。

平均感知機演算法雖然速度快,但仍不夠准確。適合一些對速度要求高、對准確性要求相對不那麼高的場景。CRF分詞演算法可以說是目前最常用的分詞、詞性標注和實體識別演算法,它對未登陸詞也有很好的識別能力,是目前在速度、准確率以及未登錄詞識別上綜合表現最突出的演算法,也是我們目前所採用的解決方案,但速度會比感知機慢一些。

在NLP中,最常用的神經網路為循環神經網路(RNN,Recurrent Neural Network),它在處理變長輸入和序列輸入問題中有著巨大的優勢。LSTM(Long Short-Term Memory,長短期記憶網路)為RNN變種的一種,在一定程度上解決了RNN在訓練過程中梯度消失和梯度爆炸的問題。

目前對於序列標注任務,業內公認效果最好的模型是BiLSTM+CRF。相比於上述其它模型,雙向循環神經網路BiLSTM,可以更好地編碼當前字等上下文信息,並在最終增加CRF層,核心是用Viterbi演算法進行解碼,以得到全局最優解,避免B,S,E這種不可能的標記結果的出現,提高准確率。

神經網路分詞雖然能在准確率、未登錄詞識別上有更好的表現,但RNN無法並行計算,在速度上沒有優勢,所以該演算法通常在演算法研究、句子精確解析等對速度要求不高的場景下使用。

分詞作為NLP底層任務之一,既簡單又重要,很多時候上層演算法的錯誤都是由分詞結果導致的。因此,對於底層實現的演算法工程師,不僅需要深入理解分詞演算法,更需要懂得如何高效地實現和調試。

而對於上層應用的演算法工程師,在實際分詞時,需要根據業務場景有選擇地應用上述演算法,比如在搜索引擎對大規模網頁進行內容解析時,對分詞對速度要求大於精度,而在智能問答中由於句子較短,對分詞的精度要求大於速度。

H. 求助Python大神!

這是圖論中經典的求最短路徑問題,已經有很多基礎演算法和實現。你可以直接搜
Dijkstra演算法與Floyd演算法,python實現也有很多,很容易搜到。

I. 如何使用QGIS裡面的python編程求最優路線

題主:
你的問題描述不是很詳盡。
比如,你所說的最短路徑,是直線還是沿道路的最短路徑。如果是後者這個稍微麻煩些,並需要補充路網數據。如是直線距離最短,那麼,你所需求的是以最短路徑走訪完所有農戶(以居委會為起點),還是每戶至居委會的距離最短(兩點間直線距離)。還有就是GIS文件的屬性表和你的EXCEL表格的關系...
所以,如你題中所說,建議你現在做的有以下幾件事:
①明確要目標到底是什麼,就如上面所說的一樣;
②對於每一戶(包括居委會),你還需獲取其坐標(X/Y),這個在GIS軟體中易獲取;
③將excel數據連接至屬性表中。
最後,你這個項目要解決的問題有Dijkstra、Floyd、A*等演算法可用。但是具體用哪一種還需根據問題進行優選...
希望對你有所幫助!!!

熱點內容
安卓手機哪個生態好 發布:2025-01-11 17:56:01 瀏覽:272
資料庫數據的一致性 發布:2025-01-11 17:30:45 瀏覽:708
手機怎麼設置手勢安卓 發布:2025-01-11 17:15:54 瀏覽:965
威能壁掛爐解壓閥 發布:2025-01-11 17:15:53 瀏覽:560
突破伺服器ip限制 發布:2025-01-11 17:11:23 瀏覽:819
支付寶上傳憑證 發布:2025-01-11 17:10:29 瀏覽:877
怎麼打開行李箱的密碼鎖 發布:2025-01-11 17:09:51 瀏覽:594
蘋果怎麼刪除id賬號和密碼 發布:2025-01-11 17:09:50 瀏覽:785
7z解壓很慢 發布:2025-01-11 16:51:23 瀏覽:943
電腦改文檔伺服器 發布:2025-01-11 16:41:14 瀏覽:871