A. python中文分詞的原理你知道嗎
中文分詞,即 Chinese Word Segmentation,即將一個漢字序列進行切分,得到一個個單獨的詞。表面上看,分詞其實就是那麼回事,但分詞效果好不好對信息檢索、實驗結果還是有很大影響的,同時分詞的背後其實是涉及各種各樣的演算法的。
中文分詞與英文分詞有很大的不同,對英文而言,一個單詞就是一個詞,而漢語是以字為基本的書寫單位,詞語之間沒有明顯的區分標記,需要人為切分。根據其特點,可以把分詞演算法分為四大類:
基於規則的分詞方法
基於統計的分詞方法
基於語義的分詞方法
基於理解的分詞方法
下面我們對這幾種方法分別進行總結。
基於規則的分詞方法
這種方法又叫作機械分詞方法、基於字典的分詞方法,它是按照一定的策略將待分析的漢字串與一個「充分大的」機器詞典中的詞條進行匹配。若在詞典中找到某個字元串,則匹配成功。該方法有三個要素,即分詞詞典、文本掃描順序和匹配原則。文本的掃描順序有正向掃描、逆向掃描和雙向掃描。匹配原則主要有最大匹配、最小匹配、逐詞匹配和最佳匹配。
最大匹配法(MM)。基本思想是:假設自動分詞詞典中的最長詞條所含漢字的個數為 i,則取被處理材料當前字元串序列中的前 i 個字元作為匹配欄位,查找分詞詞典,若詞典中有這樣一個 i 字詞,則匹配成功,匹配欄位作為一個詞被切分出來;若詞典中找不到這樣的一個 i 字詞,則匹配失敗,匹配欄位去掉最後一個漢字,剩下的字元作為新的匹配欄位,再進行匹配,如此進行下去,直到匹配成功為止。統計結果表明,該方法的錯誤率 為 1/169。
逆向最大匹配法(RMM)。該方法的分詞過程與 MM 法相同,不同的是從句子(或文章)末尾開始處理,每次匹配不成功時去掉的是前面的一個漢字。統計結果表明,該方法的錯誤率為 1/245。
逐詞遍歷法。把詞典中的詞按照由長到短遞減的順序逐字搜索整個待處理的材料,一直到把全部的詞切分出來為止。不論分詞詞典多大,被處理的材料多麼小,都得把這個分詞詞典匹配一遍。
設立切分標志法。切分標志有自然和非自然之分。自然切分標志是指文章中出現的非文字元號,如標點符號等;非自然標志是利用詞綴和不構成詞的詞(包 括單音詞、復音節詞以及象聲詞等)。設立切分標志法首先收集眾多的切分標志,分詞時先找出切分標志,把句子切分為一些較短的欄位,再用 MM、RMM 或其它的方法進行細加工。這種方法並非真正意義上的分詞方法,只是自動分詞的一種前處理方式而已,它要額外消耗時間掃描切分標志,增加存儲空間存放那些非 自然切分標志。
最佳匹配法(OM)。此法分為正向的最佳匹配法和逆向的最佳匹配法,其出發點是:在詞典中按詞頻的大小順序排列詞條,以求縮短對分詞詞典的檢索時 間,達到最佳效果,從而降低分詞的時間復雜度,加快分詞速度。實質上,這種方法也不是一種純粹意義上的分詞方法,它只是一種對分詞詞典的組織方式。OM 法的分詞詞典每條詞的前面必須有指明長度的數據項,所以其空間復雜度有所增加,對提高分詞精度沒有影響,分詞處理的時間復雜度有所降低。
此種方法優點是簡單,易於實現。但缺點有很多:匹配速度慢;存在交集型和組合型歧義切分問題;詞本身沒有一個標準的定義,沒有統一標準的詞集;不同詞典產生的歧義也不同;缺乏自學習的智能性。
基於統計的分詞方法
該方法的主要思想:詞是穩定的組合,因此在上下文中,相鄰的字同時出現的次數越多,就越有可能構成一個詞。因此字與字相鄰出現的概率或頻率能較好地反映成詞的可信度。可以對訓練文本中相鄰出現的各個字的組合的頻度進行統計,計算它們之間的互現信息。互現信息體現了漢字之間結合關系的緊密程度。當緊密程 度高於某一個閾值時,便可以認為此字組可能構成了一個詞。該方法又稱為無字典分詞。
該方法所應用的主要的統計模型有:N 元文法模型(N-gram)、隱馬爾可夫模型(Hiden Markov Model,HMM)、最大熵模型(ME)、條件隨機場模型(Conditional Random Fields,CRF)等。
在實際應用中此類分詞演算法一般是將其與基於詞典的分詞方法結合起來,既發揮匹配分詞切分速度快、效率高的特點,又利用了無詞典分詞結合上下文識別生詞、自動消除歧義的優點。
基於語義的分詞方法
語義分詞法引入了語義分析,對自然語言自身的語言信息進行更多的處理,如擴充轉移網路法、知識分詞語義分析法、鄰接約束法、綜合匹配法、後綴分詞法、特徵詞庫法、矩陣約束法、語法分析法等。
擴充轉移網路法
該方法以有限狀態機概念為基礎。有限狀態機只能識別正則語言,對有限狀態機作的第一次擴充使其具有遞歸能力,形成遞歸轉移網路 (RTN)。在RTN 中,弧線上的標志不僅可以是終極符(語言中的單詞)或非終極符(詞類),還可以調用另外的子網路名字分非終極符(如字或字串的成詞條件)。這樣,計算機在 運行某個子網路時,就可以調用另外的子網路,還可以遞歸調用。詞法擴充轉移網路的使用, 使分詞處理和語言理解的句法處理階段交互成為可能,並且有效地解決了漢語分詞的歧義。
矩陣約束法
其基本思想是:先建立一個語法約束矩陣和一個語義約束矩陣, 其中元素分別表明具有某詞性的詞和具有另一詞性的詞相鄰是否符合語法規則, 屬於某語義類的詞和屬於另一詞義類的詞相鄰是否符合邏輯,機器在切分時以之約束分詞結果。
基於理解的分詞方法
基於理解的分詞方法是通過讓計算機模擬人對句子的理解,達到識別詞的效果。其基本思想就是在分詞的同時進行句法、語義分析,利用句法信息和語義信息來處理歧義現象。它通常包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統可以獲得有關詞、句子等的句法和語義信息來對分詞歧義進行判斷,即它模擬了人對句子的理解過程。這種分詞方法需要使用大量的語言知識和信息。目前基於理解的分詞方法主要有專家系統分詞法和神經網路分詞法等。
專家系統分詞法
從專家系統角度把分詞的知識(包括常識性分詞知識與消除歧義切分的啟發性知識即歧義切分規則)從實現分詞過程的推理機中獨立出來,使知識庫的維護與推理機的實現互不幹擾,從而使知識庫易於維護和管理。它還具有發現交集歧義欄位和多義組合歧義欄位的能力和一定的自學習功能。
神經網路分詞法
該方法是模擬人腦並行,分布處理和建立數值計算模型工作的。它將分詞知識所分散隱式的方法存入神經網路內部,通過自學習和訓練修改內部權值,以達到正確的分詞結果,最後給出神經網路自動分詞結果,如使用 LSTM、GRU 等神經網路模型等。
神經網路專家系統集成式分詞法
該方法首先啟動神經網路進行分詞,當神經網路對新出現的詞不能給出准確切分時,激活專家系統進行分析判斷,依據知識庫進行推理,得出初步分析,並啟動學習機制對神經網路進行訓練。該方法可以較充分發揮神經網路與專家系統二者優勢,進一步提高分詞效率。
以上便是對分詞演算法的基本介紹。
B. 關鍵字分詞技術是怎麼回事呢
何為分詞?中文分詞與其他的分詞又有什麼不同呢?分詞就是將連續的字序列按照一定的規范重新組合成詞序列的過程。在上面的例子中我們就可以看出,在英文的行文中,單詞之間是以空格作為自然分界符的,而中文只是字、句和段可以通過明顯的分界符來簡單劃界,唯獨詞沒有一個形式上的分界符,雖然英文也同樣存在短語的劃分問題,但是在詞這一層上,上面的例子中我們也可以看出,中文比之英文要復雜的多、困難的多。
目前主流的中文分詞演算法有以下3種:
1、 基於字元串匹配的分詞方法
這種方法又叫做機械分詞方法,它是按照一定的策略將待分析的漢字串與一個「充分大的」機器詞典中的詞條進行配,若在詞典中找到某個字元串,則匹 配成功(識別出一個詞)。按照掃描方向的不同,串匹配分詞方法可以分為正向匹配和逆向匹配;按照不同長度優先匹配的情況,可以分為最大(最長)匹配和最小(最短)匹配;按照是否與詞性標注過程相結合,又可以分為單純分詞方法和分詞與標注相結合的一體化方法。常用的幾種機械分詞方法如下:
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的詞數最小)。
還可以將上述各種方法相互組合,例如,可以將正向最大匹配方法和逆向最大匹配方法結合起來構成雙向匹配法。由於漢語單字成詞的特點,正向最小匹配和逆向最小匹配一般很少使用。一般說來,逆向匹配的切分精度略高於正向匹配,遇到的歧義現象也較少。統計結果表明,單純使用正向最大匹配的錯誤率為 1/169,單純使用逆向最大匹配的錯誤率為1/245。但這種精度還遠遠不能滿足實際的需要。實際使用的分詞系統,都是把機械分詞作為一種初分手段,還 需通過利用各種其它的語言信息來進一步提高切分的准確率。
一種方法是改進掃描方式,稱為特徵掃描或標志切分,優先在待分析字元串中識別和切分出一些帶有明顯特徵的詞,以這些詞作為斷點,可將原字元串分 為較小的串再來進機械分詞,從而減少匹配的錯誤率。另一種方法是將分詞和詞類標注結合起來,利用豐富的詞類信息對分詞決策提供幫助,並且在標注過程中又反 過來對分詞結果進行檢驗、調整,從而極大地提高切分的准確率。
2、 基於理解的分詞方法
這種分詞方法是通過讓計算機模擬人對句子的理解,達到識別詞的效果。其基本思想就是在分詞的同時進行句法、語義分析,利用句法信息和語義信息來處理歧義現象。它通常包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統可以獲得有關詞、句子等的句法和語義信息來對分詞歧義進行判斷,即它模擬了人對句子的理解過程。這種分詞方法需要使用大量的語言知識和信息。由於漢語語言知識的籠統、復雜性,難以將各種語言信息組織 成機器可直接讀取的形式,因此目前基於理解的分詞系統還處在試驗階段。
3、 基於統計的分詞方法
從形式上看,詞是穩定的字的組合,因此在上下文中,相鄰的字同時出現的次數越多,就越有可能構成一個詞。因此字與字相鄰共現的頻率或概率能夠較好的反映成詞的可信度。可以對語料中相鄰共現的各個字的組合的頻度進行統計,計算它們的互現信息。定義兩個字的互現信息,計算兩個漢字X、Y的相鄰共現概率。互現信息體現了漢字之間結合關系的緊密程度。當緊密程度高於某一個閾值時,便可認為此字組可能構成了一個詞。這種方法只需對語料中的字組頻度進行統 計,不需要切分詞典,因而又叫做無詞典分詞法或統計取詞方法。但這種方法也有一定的局限性,會經常抽出一些共現頻度高、但並不是詞的常用字組,例如「這 一」、「之一」、「有的」、「我的」、「許多的」等,並且對常用詞的識別精度差,時空開銷大。實際應用的統計分詞系統都要使用一部基本的分詞詞典(常用詞詞典)進行串匹配分詞,同時使用統計方法識別一些新的詞,即將串頻統計和串匹配結合起來,既發揮匹配分詞切分速度快、效率高的特點,又利用了無詞典分詞結合上下文識別生詞、自動消除歧義的優點。
分詞幾點要注意:
1.分詞演算法的時間性能要比較高。尤其是現在的web搜索,實時性要求很高。所以作為中文信息處理基礎的分詞首先必須佔用盡可能少的時間。
2.分詞正確率的提高並不一定帶來檢索性能的提高。分詞到達一定精度之後,對中文信息檢索的影響不再會很明顯,雖然仍然還是有一些影響,但是這已經不是CIR的性能瓶頸。所以片面的一味追求高准確率的分詞演算法並不是很適合大規模中文信息檢索。在時間和精度之間存在矛盾無法兼顧的情況下,我們需要在二者之間找到一個合適的平衡點。
3.切分的顆粒度仍然可以依照長詞優先准則,但是需要在查詢擴展層面進行相關後續處理。在信息檢索中,分詞演算法只需要集中精力考慮如何消除交叉歧義。對於覆蓋歧義,我們可以利用詞典的二次索引和查詢擴展來解決。
4.未登錄詞識別的准確率要比召回率更加重要。要盡量保證未登錄詞識別時不進行錯誤結合,避免因此切分出錯誤的未登錄詞。如果將單字錯誤的結合成未登錄詞了,則有可能導致無法正確檢索到相應的文檔。
網路的分詞
首先根據分割符號將查詢分開。「信息檢索 理論 工具」 分詞後 <信息檢索,理論,工具>。
然後看看是否有重復的字元串,如果有,就拋棄多餘的,只保留一個。「理論 工具理論」分詞後<工具理論>,GOOGLE不考慮這個並歸計算。
接著判斷是否有英文或者數字,如果有的話,把英文或者數字當作一個整體保留並把前後的中文切開。查詢」電影BT下載」分詞後<電影,BT,下載>。
如果字元串只包含小於等於3個中文字元的話,那就保留不動,當字元串長度大於4個中文字元的時候,網路的分詞程序才出馬大幹快上,把這個字元串肢解掉。
分詞演算法類型正向最大匹配,反向最大匹配,雙向最大匹配,語言模型方法,最短路徑演算法判斷一個分詞系統好不好,關鍵看兩點,一個是消除歧義能力;一個是詞典未登錄詞的識別比如人名,地名,機構名等。
網路分詞採取了至少兩個詞典,一個是普通詞典,一個是專用詞典(人名、地名、新詞等)。而且是專用詞典先切分,然後將剩餘的片斷交由普通詞典來切分。
網路用分詞演算法類型採用的是雙向最大匹配演算法。
C. 加分求搜索引擎的工作機制
搜索引擎是一種依靠技術取勝的產品,搜索引擎的各個組成部分,包括頁面搜集器、索引器、檢索器等,都是搜索引擎產品提供商進行比拼的著力點。
近幾年,搜索引擎的商業化取得了巨大的成功,如著名搜索引擎公司Google、Yahoo(本文中提到Yahoo時,特指英文Yahoo)、網路等紛紛成功上市,引發了眾多公司涉足於該領域,帶動了人力、資本的大量投入,連軟體巨人Microsoft公司也禁不住誘惑積極打造自己的搜索引擎。但是,從性能上來說,目前的搜索引擎還不盡如人意,搜索返回的結果往往與用戶的檢索要求相去甚遠,有效性還不是很高。本文將對搜索引擎的工作原理及其實現技術進行分析,從中可以了解限制搜索引擎用戶體驗改善的因素到底有哪些。
——————————————————————————
[相關鏈接]
搜索引擎的技術流派
搜索引擎的技術流派可以分為三類:第一類是利用計算機程序自動進行信息處理的自動化派,其典型代表是Google以及Ghunt等;第二類是以人工進行信息分類處理為主的人力加工派,這方面的典型代表是早期的Yahoo,正在興起的Web2.0、網摘等社區化搜索是這一流派的新發展;第三類是強調智能化人機交互、協同的融合派,目前英文Yahoo的搜索引擎在發展這方面的技術,MSNLive也顯示出其更加重視融合性的技術,聯索IFACE專業搜索融入了用戶知識和機器學習方法,可以看做是融合派在中文搜索引擎方面的典型代表。
如果按照網頁庫的容量、相關度計算技術、用戶搜索體驗以及商業模式等方面來劃分,到目前為止,搜索引擎的發展大約經歷了兩代。第一代搜索引擎(1994年~1997年)的索引網頁量一般都在數百萬量級左右,採用全文檢索技術和分布式並行運算技術,但極少重新搜集網頁並去刷新索引,而且其檢索速度較慢,一般都要等待10秒甚至更長的時間,同時承受的檢索請求也受到很大限制,商業模式處於探索期並且尚未成型。
第二代搜索引擎(1998年至今)大多採用分布式協同處理方案,其網頁索引庫一般都在數千萬個網頁量級甚至更多,採用可伸縮的索引庫架構,每天能夠響應數千萬次甚至數以億計的用戶檢索請求。1997年11月,當時最先進的幾個搜索引擎宣稱能建立1億數量級的網頁索引。以Google為代表的第二代搜索引擎通過鏈接分析和點擊分析(網頁流行度)方法來計算(網頁權威性)相關度取得了巨大的成功。另外,以自然語言進行問題解答的搜索引擎在某種程度上改善了用戶體驗,更重要的是第二代搜索引擎奠定了目前搜索引擎普遍採用的成熟商業模式,如Google、Overture、網路等收費搜索服務均受益於此商業模式。
相關名詞解釋
全文搜索引擎是由一個稱為蜘蛛(Spider)的機器人程序以某種策略自動地在互聯網中搜集和發現信息,由索引器為搜集到的信息建立網頁索引資料庫,由檢索器根據用戶輸入的查詢條件檢索索引庫,並將查詢結果返回給用戶。服務方式是面向網頁的全文檢索服務。
目錄索引搜索引擎主要以人工方式搜集信息,由編輯人員查看信息之後,人工形成信息摘要,並將信息置於事先確定的分類框架中。信息大多面向網站,提供目錄瀏覽服務和直接檢索服務。用戶完全可以不用關鍵詞(Keywords)進行查詢,僅靠分類目錄也可找到需要的信息。
元搜索引擎是指在統一的用戶查詢界面與信息反饋的形式下,共享多個搜索引擎的資源庫為用戶提供信息服務的系統。元搜索引擎是藉助於其他搜索引擎進行工作,沒有自己的索引庫,它是將用戶的查詢請求同時向多個搜索引擎遞交,將返回的結果進行重復排除、重新排序等處理後,作為自己的結果返回給用戶。
自動分類技術是計算機根據分類標准自動將文檔歸類到已經存在的類別體系(或者主題)下的某一個具體類別中。目前自動分類並不能完全代替人工所做的相關工作,只是提供了一個花費較少的可選擇方法。
文本聚類技術是利用計算機將已經存在的大量文本(很多文檔)進行分組的全自動處理過程。聚類可以提供對一個大的文本集內容的概況了解,可以識別隱藏的共同點,可以便捷地瀏覽相近或相關的文本。
網文摘錄又稱網摘,它具有對內容頁的收藏、分類、摘錄、加註標簽、保存到信息庫、信息庫共享等功能,主要是為了滿足用戶閱讀網路內容和信息知識積累的需要。
D. 請問什麼是自然語言處理中的中文分詞技術
眾所周知,英文是以詞為單位的,詞和詞之間是靠空格隔開,而中文是以字為單位,句子中所有的字連起來才能描述一個意思。例如,英文句子I am a student,用中文則為:「我是一個學生」。計算機可以很簡單通過空格知道student是一個單詞,但是不能很容易明白「學」、「生」兩個字合起來才表示一個詞。把中文的漢字序列切分成有意義的詞,就是中文分詞,有些人也稱為切詞。我是一個學生,分詞的結果是:我 是 一個 學生。
中文分詞技術屬於自然語言處理技術范疇,對於一句話,人可以通過自己的知識來明白哪些是詞,哪些不是詞,但如何讓計算機也能理解?其處理過程就是分詞演算法。
現有的分詞演算法可分為三大類:基於字元串匹配的分詞方法、基於理解的分詞方法和基於統計的分詞方法。
1、基於字元串匹配的分詞方法
這種方法又叫做機械分詞方法,它是按照一定的策略將待分析的漢字串與一個「充分大的」機器詞典中的詞條進行配,若在詞典中找到某個字元串,則匹配成功(識別出一個詞)。按照掃描方向的不同,串匹配分詞方法可以分為正向匹配和逆向匹配;按照不同長度優先匹配的情況,可以分為最大(最長)匹配和最小(最短)匹配;按照是否與詞性標注過程相結合,又可以分為單純分詞方法和分詞與標注相結合的一體化方法。常用的幾種機械分詞方法如下:
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的詞數最小)。
還可以將上述各種方法相互組合,例如,可以將正向最大匹配方法和逆向最大匹配方法結合起來構成雙向匹配法。由於漢語單字成詞的特點,正向最小匹配和逆向最小匹配一般很少使用。一般說來,逆向匹配的切分精度略高於正向匹配,遇到的歧義現象也較少。統計結果表明,單純使用正向最大匹配的錯誤率為1/169,單純使用逆向最大匹配的錯誤率為1/245。但這種精度還遠遠不能滿足實際的需要。實際使用的分詞系統,都是把機械分詞作為一種初分手段,還需通過利用各種其它的語言信息來進一步提高切分的准確率。
一種方法是改進掃描方式,稱為特徵掃描或標志切分,優先在待分析字元串中識別和切分出一些帶有明顯特徵的詞,以這些詞作為斷點,可將原字元串分為較小的串再來進機械分詞,從而減少匹配的錯誤率。另一種方法是將分詞和詞類標注結合起來,利用豐富的詞類信息對分詞決策提供幫助,並且在標注過程中又反過來對分詞結果進行檢驗、調整,從而極大地提高切分的准確率。
對於機械分詞方法,可以建立一個一般的模型,在這方面有專業的學術論文,這里不做詳細論述。
2、基於理解的分詞方法
這種分詞方法是通過讓計算機模擬人對句子的理解,達到識別詞的效果。其基本思想就是在分詞的同時進行句法、語義分析,利用句法信息和語義信息來處理歧義現象。它通常包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統可以獲得有關詞、句子等的句法和語義信息來對分詞歧義進行判斷,即它模擬了人對句子的理解過程。這種分詞方法需要使用大量的語言知識和信息。由於漢語語言知識的籠統、復雜性,難以將各種語言信息組織成機器可直接讀取的形式,因此目前基於理解的分詞系統還處在試驗階段。
3、基於統計的分詞方法
從形式上看,詞是穩定的字的組合,因此在上下文中,相鄰的字同時出現的次數越多,就越有可能構成一個詞。因此字與字相鄰共現的頻率或概率能夠較好的反映成詞的可信度。可以對語料中相鄰共現的各個字的組合的頻度進行統計,計算它們的互現信息。定義兩個字的互現信息,計算兩個漢字X、Y的相鄰共現概率。互現信息體現了漢字之間結合關系的緊密程度。當緊密程度高於某一個閾值時,便可認為此字組可能構成了一個詞。這種方法只需對語料中的字組頻度進行統計,不需要切分詞典,因而又叫做無詞典分詞法或統計取詞方法。但這種方法也有一定的局限性,會經常抽出一些共現頻度高、但並不是詞的常用字組,例如「這一」、「之一」、「有的」、「我的」、「許多的」等,並且對常用詞的識別精度差,時空開銷大。實際應用的統計分詞系統都要使用一部基本的分詞詞典(常用詞詞典)進行串匹配分詞,同時使用統計方法識別一些新的詞,即將串頻統計和串匹配結合起來,既發揮匹配分詞切分速度快、效率高的特點,又利用了無詞典分詞結合上下文識別生詞、自動消除歧義的優點。
到底哪種分詞演算法的准確度更高,目前並無定論。對於任何一個成熟的分詞系統來說,不可能單獨依靠某一種演算法來實現,都需要綜合不同的演算法。筆者了解,海量科技的分詞演算法就採用「復方分詞法」,所謂復方,相當於用中葯中的復方概念,即用不同的葯才綜合起來去醫治疾病,同樣,對於中文詞的識別,需要多種演算法來處理不同的問題。
E. 分詞演算法是什麼
分詞演算法是文本挖掘的基礎,通常對整個模型的效果起著較大的決定作用。
分詞演算法常用的兩種運行方式:
1、用戶搜索及匹配。
例如:我們在網路搜索一個詞 「手機回收」,那麼網路會先把這個詞分為手機和回收兩個詞這個時候呢網路會先在庫中搜索手機這個詞然後進行第一輪的篩選。把網頁當中沒有手機這個詞的去除,只保留帶有手機這個詞的結果,之後再從已篩選出來的網頁中,篩選出帶有回收這個詞的頁面。然後在所得結果裡面根據頁面評分給用戶進行排序。
2、網頁主題計算
前面啟蒙博客也講過,網路蜘蛛只是一個機器,並不能向人一樣去思考,而在處理文章的時候,網路蜘蛛則會把文章也進行分詞去處理,如過文章里 手機 這個詞出現頻率比較多,也就是所說的關鍵詞密度,那麼這個頁面也就會定性為手機方面的文章。
搜索引擎是通過分詞演算法來計算網頁的,如果我們能夠合理地利用分詞演算法進行網頁布局,會讓網頁將會有一個很好的得分。
中文分詞演算法大概分為三大類:
第一類是基於字元串匹配,即掃描字元串,如果發現字元串的子串和詞典中的詞相同,就算匹配,比如機械分詞方法。這類分詞通常會加入一些啟發式規則,比如「正向/反向最大匹配」,「長詞優先」等。
第二類是基於統計以及機器學習的分詞方法,它們基於人工標注的詞性和統計特徵,對中文進行建模,即根據觀測到的數據(標注好的語料)對模型參數進行訓練,在分詞階段再通過模型計算各種分詞出現的概率,將概率最大的分詞結果作為最終結果。
常見的序列標注模型有HMM和CRF。這類分詞演算法能很好處理歧義和未登錄詞問題,效果比前一類效果好,但是需要大量的人工標注數據,以及較慢的分詞速度。
第三類是通過讓計算機模擬人對句子的理解,達到識別詞的效果,由於漢語語義的復雜性,難以將各種語言信息組織成機器能夠識別的形式,目前這種分詞系統還處於試驗階段。
F. 如何對excel表格里的詞結巴分詞python
#-*-coding:utf-8-*-
importjieba
'''''
Createdon2015-11-23
'''
defword_split(text):
"""
Splitatextinwords.
(word,location).
"""
word_list=[]
windex=0
word_primitive=jieba.cut(text,cut_all=True)
forwordinword_primitive:
iflen(word)>0:
word_list.append((windex,word))
windex+=1
returnword_list
definverted_index(text):
"""
CreateanInverted-.
{word:[locations]}
"""
inverted={}
forindex,wordinword_split(text):
locations=inverted.setdefault(word,[])
locations.append(index)
returninverted
definverted_index_add(inverted,doc_id,doc_index):
"""
AddInvertd-Indexdoc_indexofthedocumentdoc_idtothe
Multi-DocumentInverted-Index(inverted),
usingdoc_idasdocumentidentifier.
{word:{doc_id:[locations]}}
"""
forword,locationsindoc_index.iteritems():
indices=inverted.setdefault(word,{})
indices[doc_id]=locations
returninverted
defsearch_a_word(inverted,word):
"""
searchoneword
"""
word=word.decode('utf-8')
ifwordnotininverted:
returnNone
else:
word_index=inverted[word]
returnword_index
defsearch_words(inverted,wordList):
"""
searchmorethanoneword
"""
wordDic=[]
docRight=[]
forwordinwordList:
ifisinstance(word,str):
word=word.decode('utf-8')
ifwordnotininverted:
returnNone
else:
element=inverted[word].keys()
element.sort()
wordDic.append(element)
numbers=len(wordDic)
inerIndex=[0foriinrange(numbers)]
docIndex=[wordDic[i][0]foriinrange(numbers)]
flag=True
whileflag:
ifmin(docIndex)==max(docIndex):
docRight.append(min(docIndex))
inerIndex=[inerIndex[i]+1foriinrange(numbers)]
foriinrange(numbers):
ifinerIndex[i]>=len(wordDic[i]):
flag=False
returndocRight
docIndex=[wordDic[i][inerIndex[i]]foriinrange(numbers)]
else:
minIndex=min(docIndex)
minPosition=docIndex.index(minIndex)
inerIndex[minPosition]+=1
ifinerIndex[minPosition]>=len(wordDic[minPosition]):
flag=False
returndocRight
docIndex=[wordDic[i][inerIndex[i]]foriinrange(numbers)]
defsearch_phrase(inverted,phrase):
"""
searchphrase
"""
docRight={}
temp=word_split(phrase)
wordList=[temp[i][1]foriinrange(len(temp))]
docPossible=search_words(inverted,wordList)
fordocindocPossible:
wordIndex=[]
indexRight=[]
forwordinwordList:
wordIndex.append(inverted[word][doc])
numbers=len(wordList)
inerIndex=[0foriinrange(numbers)]
words=[wordIndex[i][0]foriinrange(numbers)]
flag=True
whileflag:
ifwords[-1]-words[0]==numbers-1:
indexRight.append(words[0])
inerIndex=[inerIndex[i]+1foriinrange(numbers)]
foriinrange(numbers):
ifinerIndex[i]>=len(wordIndex[i]):
flag=False
docRight[doc]=indexRight
break
ifflag:
words=[wordIndex[i][inerIndex[i]]foriinrange(numbers)]
else:
minIndex=min(words)
minPosition=words.index(minIndex)
inerIndex[minPosition]+=1
ifinerIndex[minPosition]>=len(wordIndex[minPosition]):
flag=False
break
ifflag:
words=[wordIndex[i][inerIndex[i]]foriinrange(numbers)]
returndocRight
if__name__=='__main__':
doc1="""
中文分詞指的是將一個漢字序列切分成一個一個單獨的詞。分詞就是將連續的字序列按照一定的規范
重新組合成詞序列的過程。我們知道,在英文的行文中,單詞之間是以空格作為自然分界符的,而中文
只是字、句和段能通過明顯的分界符來簡單劃界,唯獨詞沒有一個形式上的分界符,雖然英文也同樣
存在短語的劃分問題,不過在詞這一層上,中文比之英文要復雜的多、困難的多。
"""
doc2="""
存在中文分詞技術,是由於中文在基本文法上有其特殊性,具體表現在:
與英文為代表的拉丁語系語言相比,英文以空格作為天然的分隔符,而中文由於繼承自古代漢語的傳統,
詞語之間沒有分隔。古代漢語中除了連綿詞和人名地名等,詞通常就是單個漢字,所以當時沒有分詞
書寫的必要。而現代漢語中雙字或多字詞居多,一個字不再等同於一個詞。
在中文裡,「詞」和「片語」邊界模糊
現代漢語的基本表達單元雖然為「詞」,且以雙字或者多字詞居多,但由於人們認識水平的不同,對詞和
短語的邊界很難去區分。
例如:「對隨地吐痰者給予處罰」,「隨地吐痰者」本身是一個詞還是一個短語,不同的人會有不同的標准,
同樣的「海上」「酒廠」等等,即使是同一個人也可能做出不同判斷,如果漢語真的要分詞書寫,必然會出現
混亂,難度很大。
中文分詞的方法其實不局限於中文應用,也被應用到英文處理,如手寫識別,單詞之間的空格就不很清楚,
中文分詞方法可以幫助判別英文單詞的邊界。
"""
doc3="""
作用
中文分詞是文本挖掘的基礎,對於輸入的一段中文,成功的進行中文分詞,可以達到電腦自動識別語句含義的效果。
中文分詞技術屬於自然語言處理技術范疇,對於一句話,人可以通過自己的知識來明白哪些是詞,哪些不是詞,
但如何讓計算機也能理解?其處理過程就是分詞演算法。
影響
中文分詞對於搜索引擎來說,最重要的並不是找到所有結果,因為在上百億的網頁中找到所有結果沒有太多的意義,
沒有人能看得完,最重要的是把最相關的結果排在最前面,這也稱為相關度排序。中文分詞的准確與否,常常直接
影響到對搜索結果的相關度排序。從定性分析來說,搜索引擎的分詞演算法不同,詞庫的不同都會影響頁面的返回結果
"""
doc4="""
這種方法又叫做機械分詞方法,它是按照一定的策略將待分析的漢字串與一個「充分大的」機器詞典中的詞條進行配,
若在詞典中找到某個字元串,則匹配成功(識別出一個詞)。按照掃描方向的不同,串匹配分詞方法可以分為正向
匹配和逆向匹配;按照不同長度優先匹配的情況,可以分為最大(最長)匹配和最小(最短)匹配;常用的幾種
機械分詞方法如下:
正向最大匹配法(由左到右的方向);
逆向最大匹配法(由右到左的方向);
最少切分(使每一句中切出的詞數最小);
雙向最大匹配法(進行由左到右、由右到左兩次掃描)
還可以將上述各種方法相互組合,例如,可以將正向最大匹配方法和逆向最大匹配方法結合起來構成雙向匹配法。
由於漢語單字成詞的特點,正向最小匹配和逆向最小匹配一般很少使用。一般說來,逆向匹配的切分精度略高於
正向匹配,遇到的歧義現象也較少。統計結果表明,單純使用正向最大匹配的錯誤率為,單純使用逆向
最大匹配的錯誤率為。但這種精度還遠遠不能滿足實際的需要。實際使用的分詞系統,都是把機械分詞
作為一種初分手段,還需通過利用各種其它的語言信息來進一步提高切分的准確率。
一種方法是改進掃描方式,稱為特徵掃描或標志切分,優先在待分析字元串中識別和切分出一些帶有明顯特徵
的詞,以這些詞作為斷點,可將原字元串分為較小的串再來進機械分詞,從而減少匹配的錯誤率。另一種方法
是將分詞和詞類標注結合起來,利用豐富的詞類信息對分詞決策提供幫助,並且在標注過程中又反過來對分詞
結果進行檢驗、調整,從而極大地提高切分的准確率。
對於機械分詞方法,可以建立一個一般的模型,在這方面有專業的學術論文,這里不做詳細論述。
"""
doc5="""
從形式上看,詞是穩定的字的組合,因此在上下文中,相鄰的字同時出現的次數越多,就越有可能構成一個詞。
因此字與字相鄰共現的頻率或概率能夠較好的反映成詞的可信度。可以對語料中相鄰共現的各個字的組合的頻度
進行統計,計算它們的互現信息。定義兩個字的互現信息,計算兩個漢字的相鄰共現概率。互現信息體現了
漢字之間結合關系的緊密程度。當緊密程度高於某一個閾值時,便可認為此字組可能構成了一個詞。這種方法
只需對語料中的字組頻度進行統計,不需要切分詞典,因而又叫做無詞典分詞法或統計取詞方法。但這種方法
也有一定的局限性,會經常抽出一些共現頻度高、但並不是詞的常用字組,例如「這一」、「之一」、「有的」、
「我的」、「許多的」等,並且對常用詞的識別精度差,時空開銷大。實際應用的統計分詞系統都要使用一部基本
的分詞詞典(常用詞詞典)進行串匹配分詞,同時使用統計方法識別一些新的詞,即將串頻統計和串匹配結合起來,
既發揮匹配分詞切分速度快、效率高的特點,又利用了無詞典分詞結合上下文識別生詞、自動消除歧義的優點。
另外一類是基於統計機器學習的方法。首先給出大量已經分詞的文本,利用統計機器學習模型學習詞語切分的規律
(稱為訓練),從而實現對未知文本的切分。我們知道,漢語中各個字單獨作詞語的能力是不同的,此外有的字常
常作為前綴出現,有的字卻常常作為後綴(「者」「性」),結合兩個字相臨時是否成詞的信息,這樣就得到了許多
與分詞有關的知識。這種方法就是充分利用漢語組詞的規律來分詞。這種方法的最大缺點是需要有大量預先分好詞
的語料作支撐,而且訓練過程中時空開銷極大。
到底哪種分詞演算法的准確度更高,目前並無定論。對於任何一個成熟的分詞系統來說,不可能單獨依靠某一種演算法
來實現,都需要綜合不同的演算法。例如,海量科技的分詞演算法就採用「復方分詞法」,所謂復方,就是像中西醫結合
般綜合運用機械方法和知識方法。對於成熟的中文分詞系統,需要多種演算法綜合處理問題。
"""
#BuildInverted-Indexfordocuments
inverted={}
documents={'doc1':doc1,'doc2':doc2,'doc3':doc3,'doc4':doc4,'doc5':doc5}
fordoc_id,textindocuments.iteritems():
doc_index=inverted_index(text)
inverted_index_add(inverted,doc_id,doc_index)
#Searchoneword
aWord="分詞"
result_a_word=search_a_word(inverted,aWord)
ifresult_a_word:
result_a_word_docs=result_a_word.keys()
print"'%s'isappearedat"%(aWord)
forresult_a_word_docinresult_a_word_docs:
result_a_word_index=result_a_word[result_a_word_doc]
forindexinresult_a_word_index:
print(str(index)+''),
print"of"+result_a_word_doc
print""
else:
print"Nomatches! "
#Searchmorethanoneword
words=["漢語","切分"]
result_words=search_words(inverted,words)
ifresult_words:
print("["),
foriinrange(len(words)):
print("%s"%(words[i])),
print("]areappearedatthe"),
forresult_words_docinresult_words:
print(result_words_doc+''),
print" "
else:
print"Nomatches! "
#Searchphrase
phrase="中文分詞"
result_phrase=search_phrase(inverted,phrase)
ifresult_phrase:
result_phrase_docs=result_phrase.keys()
print"'%s'isappearedatthe"%(phrase)
forresult_phrase_docinresult_phrase_docs:
result_phrase_index=result_phrase[result_phrase_doc]
forindexinresult_phrase_index:
print(str(index)+''),
print"of"+result_phrase_doc
print""
else:
print"Nomatches! "
G. 誰會用ICTCLAS這個分詞程序
ICTCLAS分詞系統是個NB的系統,這幾天找到了仔細試了試,效率奇高,比自己搞字典,分詞演算法效率不知高了很多倍,用起來也是非常簡單的,BOSS需要導出自定義詞庫,然後用文章訓練詞庫,不管了,反正可以使用了。DT地用hash做了兩個星期,進度很慢,分析一本《天龍八部》,統計出現的詞語頻率(詞語只是僅僅基於頻率,在並沒有字典的情況下無法實現智能分詞!)大概要花費十幾分鍾,可見效率底下,而且內存200M左右。使用ICTCLAS分詞系統可以高效地實現分詞。下面把過程貼出來。
使用方法,首先到網上下載ICTCLAS,因為我是windows下的C++實現, 下載ICTCLAS2011_Windows_32_c,解壓,裡面有很好的Demo,Doc, API目錄下的所有文件(夾)到你所在的工程,在你的源文件加上
#include "ICTCLAS50.h"
#pragma comment(lib, "ICTCLAS50.lib") //ICTCLAS50.lib庫加入到工程中
//
//your code here,可參考Demo裡面的代碼
//
即可。
大概的函數C++函數介面都在Doc文件下的文檔中:
bool ICTCLAS_Init(const char* pszInitDir=NULL);初始化函數
返回值
如果初始化成功返回true, 否則返回false. 如初始化不成功,請查看ictclas.log文件了解詳細錯誤原因.
參數
pszInitDir:初始化路徑,應包含配置文件(Configure.xml)和詞典目錄(Data目錄)以及授權文件(user.lic). 如果這些文件及目錄在系統運行當前目錄下,此參數可以為null。
bool ICTCLAS_Exit( );退出,釋放內存
返回值
成功返回true;否則返回false。
unsigned int ICTCLAS_ImportUserDict(const char *sFilename,eCodeType eCT)
//導入用戶自定義詞典
返回值
導入成功的詞的個數
參數
sFilename: 用戶定義詞典文件
eCT:編碼格式
int ICTCLAS_ParagraphProcess(const char *sParagraph,int nPaLen,eCodeType eCt,int bPOStagged,char* sResult);//對一段文字進行分詞
返回值
返回結果緩沖區的指針(sResult)以及結果的長度R
參數
sParagraph: 原始文欄位
nPaLen: 文欄位的長度
eCodeType: 文欄位的編碼格式
bPOStagged: 需不需要根據標注集做標記 0 = 做標記 ; 1 = 不標記; 默認為1.
sResult: 輸出結果
t_pstRstVec ICTCLAS_ParagraphProcessA(const char *sParagraph,int PaLen,eCodeType eCodeType,int bPOStagged,int &nRstCnt);
//處理文欄位
返回值
結果vector的指針,系統調用,用戶無法分配以及釋放
struct stResult{
int start; //start position
int length; //length
#ifdef POS_TAGGER
int iPOS; //POS
char sPOS[POS_SIZE];//word type
#endif
int word_ID; //word_ID
int word_type; //Is the word of the user's dictionary?(0-no,1-yes)
int weight;// word weight
};
參數
sParagraph: 原始文欄位
nPaLen: 文欄位長度
eCodeType: 編碼格式
bPOStagged:
需不需要根據標注集做標記 0 = 做標記 ; 1 = 不標記; 默認為1.
nRstcnt: 處理結果的長度值。
詳細用法參見Doc文件。
bool ICTCLAS_FileProcess(const char *sSrcFilename,eCodeType eCt,const char *sDsnFilename,int bPOStagged);//處理txt文件
返回值
處理文本文件成功返回true, 否則返回false
參數
sSourceFilename: 原始處理文件
eCodeType: 原始文件編碼格式
sDsnFilename: 存儲結果的文件名T
bPOStagged: 需不需要根據標注集做標記 0 = 做標記 ; 1 = 不標記; 默認為1.
注意事項
調用此函數之前需要調用init函數成功,輸出格式可以通過ICTCLAS 配置來更改,這個需要研究下配置文件。
int ICTCLAS_SetPOSmap(int nPOSmap);//設置標注集
返回值
成功為1,其他為0
參數
nPOSmap :
ICT_POS_MAP_FIRST 計算所一級標注集
ICT_POS_MAP_SECOND 計算所二級標注集 PKU_POS_MAP_SECOND 北大二級標注集 PKU_POS_MAP_FIRST 北大一級標注集
int ICTCLAS_GetWordId(const char *sWord,int nWrdLen,eCodeType eCT);
返回值
單詞的ID(我覺得是詞典裡面的存儲位置,不清楚詞典的具體結構)
參數
sWord: 目標單詞
nWrdLen: 單詞長度
eCodeType: 編碼格式
bool ICTCLAS_ResultFree ( t_pstRstVec pRetVec)
//釋放調用ICTCLAS_ParagraphProcessAW得到的vector指針
返回值
成功為1,失敗為0
參數
t_pstRstVec: ICTCLAS_ParagraphProcessAW得到的vector指針
總結:這些函數都很好用,我需要使用處理文件函數ICTCLAS_FileProcess我出現的問題是:單獨調用這個函數沒有問題,但是在MFC界面調用兩個選擇打開文件路徑和保存結果文件路徑的CFileDialog以後就會出現ICTCLAS_Init初始化失敗!郁悶了半天,查看ICTCLAS.log文件,
Default Path : E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS
start lic check.
License succeed!Cannot open user dictionary
E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS\Data\UserDict.pdat.
Cannot open file E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS\Data\UserDict.map.
Cannot open user dictionary E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS\Data\UserDict.pos.
Load dictionary down!
並沒有異常,載入失敗是因為並沒有自定義詞典。
仔細排查,發現bool ICTCLAS_Init(const char* pszInitDir=NULL)有一個默認的工作路徑,在沒有打開CFileDialog的時候默認的路徑是exe文件執行路徑,但是打開以後若不進行設置,會改變工作路徑!這就是為什麼點擊CFileDialog路徑更改,找不到路徑下的文件,當然無法初始化了!( pszInitDir:初始化路徑,應包含配置文件(Configure.xml)和詞典目錄(Data目錄)以及授權文件(user.lic). 如果這些文件及目錄在系統運行當前目錄下,此參數可以為null)
解決方案:
方案1. 在每次調用CFileDialog打開文件後重新設置工作路徑
方案2. 在程序中使用絕對路徑
方案3. CFileDialog的構造函數有8個參數,平時為了省事一般只是指定第一個。其實解決這個問題,只要在第四個參數dwFlags中加上OFN_NOCHANGEDIR即可
H. 什麼是百度分詞百度分詞技術又是什麼
首先查詢專用詞典(人名,部分地名等),將專有名稱切出,剩下的部分採取雙向匹配分詞策略。
如果兩者切分結果相同,說明沒有歧義,直接輸出分詞結果
如果不一致,則輸出最短路徑的那個結果
如果長度相同。則選擇單字詞少的那一組切分結果。如果單字也相同,則選擇正向分詞結果。
如果說網路有優勢的話,唯一的優勢就是那個很大的專用詞典。
這個專用詞典登錄了人名(比如大長今)。稱謂(比如老太太)。部分地名(比如阿聯酋等)。
從語料庫裡面不斷識別出詞典未登錄詞。逐漸擴充這個專門詞典。Spelling Checker(網路詞典)拼寫檢查錯誤提示(以及拼音提示功能),拼寫檢查錯誤提示是搜索引擎都具備的一個功能。也就是說用戶提交查詢給搜索引擎,搜索引擎檢查看是否用戶輸入的拼寫有錯誤。
對於中文用戶來說一般造成的錯誤是輸入法造成的錯誤。
那麼我們就來分析看看網路是怎麼實現這一功能的。
我們分析拼寫檢查系統關注以下幾個問題:
(1)系統如何判斷用戶的輸入是有可能發生錯誤的查詢?
那麼網路有又是如何做到這些的?網路判斷用戶輸入是否錯誤的標准,
我覺得應該是查字典,如果發現字典裡面不包含這個詞彙,那麼很有可能是個錯誤的輸入。此時啟動錯誤提示功能,這個很好判斷,
因為如果是一個正常詞彙的話,網路一般不會有錯誤提示。而你故意輸入一個詞典不可能包含的所謂詞彙
此時網路一般會提示你正確的檢索詞彙。
網路又是怎麼提示正確詞彙的呢?
很明顯是通過拼音的方式,在網路輸入查詢「紫材」。
網路提供的提示詞彙為: 「紫菜」,
是同音字。所以網路必然維持著一個同音詞詞典。裡面保留著同音詞信息
比如可能包含著下面這條詞條: 「 zi cai 紫材」,
另外還有一個標注拼音程序,
現在能夠看到的基本流程是:用戶輸入「紫材」,查詞典。發現沒有這個詞彙,啟動標注拼音程序。將「紫材」標注為拼音「 cai」。然後查找同音詞詞典,發現同音詞「紫菜」,那麼提示用戶可能的正確拼寫。
但是還有一些遺留的小問題。比如是否將詞表裡面所有同音詞都作為用戶的提示信息?
比如某個拼音有10個同音詞,是否都輸出呢?
大家覺得網路會都輸出嗎?網路並沒有將所有同音詞都輸出,而是選擇一定篩選標准。選擇其中幾個輸出,怎麼證明這一點?
我們看看拼音「liu li」的同音詞。搜狗拼音輸入法提示同音詞彙有「六里 劉歷 琉璃 流利 劉麗」等N個。
這里是故意輸入一個詞典不包含的詞彙,這樣網路的拼寫檢查才開始工作。網路提示您要找的是不是: 「流氓」。我們改換輸入「遛邙」。
看網路的查詢呈現,
就沒有提示您要找的是不是「流氓」了。看看我兩次輸入的字有什麼區別,這說明什麼?
說明不是所有同音詞都給提示,而是選擇性的做呈現提示。那麼選擇的標準是什麼?
大家再回頭看看,第一次和第二次輸入的「遛氓與遛邙」是有絕對的區別的。
第一次輸入的「遛氓」的「氓」字是流氓的氓字,所以網路做了提示您要找的是不是「流氓」了。
去網路,就是有一點對的,一個字是對的,網路也會給你個流氓
另外一個小問題:同音詞詞典是否包含一字詞? 包含2字詞,3字詞,那麼是否包含4字詞以及更長的詞條?
這里一字詞好回答,不用測試也能知道肯定不包含,因為你輸入一個字,誰知道是否是錯誤的呢?
反正只要是漢字就能在詞表裡面找到,所以沒有判斷依據。
二字詞是包含的,上面有例子
三字詞也包含嗎?
下面我們查詢 「中城葯」網路錯誤提示:「中成葯」
修改查詢為「重城葯」。
那麼我們看看4字詞彙網路怎麼處理?網路是不是還是會給我們提示呢,
輸入:靜華煙雲
輸入 靜話煙雲
輸入 京花閻暈
那麼更長的詞彙網路是否也提示?
我們現在輸入: 「落花世界有風軍」, 這個查詢是什麼意思,估計讀過古詩的都知道。看看網路的提示
這說明什麼?
說明同音詞詞典包含不同長度的同音詞信息。
另外也說明了網路的核心中文處理技術,也就是那個詞典還真挺大的。
還有一個比較重要的問題。如果漢字是多音字那麼怎麼處理?網路比較偷懶。它根本就沒有對多音字做處理。
我們來看看網路的一個標注拼音的錯誤。在看這個錯誤前先看看對於多音字網路是怎麼提示錯誤的。
網路提示「局長」!!「俱長」的拼音有幾種拼法,大家說說?兩種「ju zhang / ju chang」
可見如果是多音字則幾種情況都提示。
現在我們來看看錯誤的情況,我們輸入查詢「距長」,看看結果
網路提示為「局長」當然好解釋,因為是同音字。
但是為什麼會被提示「局長」呢?這說明網路的同音字詞典有錯誤,
說明在「ju chang」這個詞條裡麵包含「局長」這個錯誤的同音詞。
讓我們順藤摸瓜。這個錯誤又說明什麼問題呢?
說明網路的同音詞典是自動生成的。而且沒有人工校對。還說明在自動生成同音詞典的過程中,網路不是根據對一篇文章標注拼音然後,在抽取詞彙和對應的拼音信息獲得的。而是完全按照某個詞典的詞條來標注音節的,以對於多音字造成的錯誤無法識別出來,
如果是對篇章進行拼音標注,可能就不會出現這種很容易發現的錯誤標注。當然還有另外一種解釋,就是「局長」是故意被網路提示出來可能的正確提示詞彙。
因為考慮到南方人「zh」和 「ch」等前後鼻音分不清么。
我們繼續測試到底是何種情況
是網路有錯誤還是這是網路的先進的演算法?
我們輸入查詢「懸賞」,故意將之錯誤輸入為「懸桑」。
沒有錯誤提示。說明確實沒有考慮這種情況,鼻音沒有考慮。
根據以上推導, 我們可以得出如下結論:
網路是將分詞詞典裡面每個詞條利用拼音標注程序標注成拼音,然後形成同音詞詞典。
所以兩個詞典是同樣大的而且這個詞典也隨著分詞詞典的增長而在不斷增長。
至於標注過程中多音字網路沒有考慮,如果是多音字就標注成多個發音組合,
通過這種方式形成同音詞詞典。這樣的同音詞詞典顯然包含著很多錯誤。
最後一個問題:網路對於英文進行拼寫檢查么?讓我們試試看,輸入查詢「china」,
大家告訴我,什麼情況
專注中文搜索的網路還能搜索到英文
真是意外的驚喜。變換一下查詢「chini」。
那麼拼音搜索和中文檢查錯誤是否採用同一套同音詞詞典呢,讓我們來實驗一下,搜索」rongji」,
最後讓我們總結歸納一下網路的拼寫檢查系統:
就是網路的後台作業:
(1)前面我們說過,網路分詞使用的詞典至少包含兩個詞典一個是普通詞典,另外一個是專用詞典(專名等),
最後讓我們總結歸納一下網路的拼寫檢查系統:
網路利用拼音標注程序依次掃描所有詞典中的每個詞條,
然後標注拼音,如果是多音字則把多個音都標上,比如」長大」,會被標注為」zhang da/chang da」兩個詞條.
(2)通過標注完的詞條,建立同音詞詞典,比如上面的」長大」,會有兩個詞條: zhang daà長大chang daà長大。
(3)利用用戶查詢LOG頻率信息給予每個中文詞條一個權重;LOG大家知道是什麼嗎?函數
(4)同音詞詞典建立完成了,當然隨著分詞詞典的逐步擴大,同音詞詞典也跟著同步擴大;
拼寫檢查:
(1)用戶輸入查詢,如果是多個子字元串,不作拼寫檢查;
(2)對於用戶查詢,先查分詞詞典,如果發現有這個單詞詞條,不作拼寫檢查;
(3)如果發現詞典裡面不包含用戶查詢,啟動拼寫檢查系統:
首先利用拼音標注程序對用戶輸入進行拼音標注
(4)對於標注好的拼音在同音詞詞典裡面掃描,
如果沒有發現則不作任何提示;
(5)如果發現有詞條,則按照順序輸出權重比較大的幾個提示結果;
拼音提示:
(1)對於用戶輸入的拼音在同音詞詞典裡面掃描,如果沒有發現則不作任何提示;
(2)如果發現有詞條,則按照順序輸出權重比較大的幾個提示結果。
對網路分詞演算法的進一步分析,上面說過,經過分析得出網路的分詞系統採用雙向最大匹配分詞,
但是後來發現推理過程中存在一個漏洞,而且推導出來的網路分詞演算法步驟還是過於繁瑣。所以進一步進行分析,看看是否前面的推導有錯誤。
那麼以前的分析有什麼漏洞呢?
我們推導網路分詞有反向最大匹配的依據是網路將「北京華煙雲」分詞為「北/京華煙雲」,從這里看好像採用了反向最大匹配。因為正向最大匹配的結果應該是「北京/華/煙雲」,但是由此就推論說網路採用了雙向最大匹配還是太倉促了。
前面我們也講過,網路有兩個詞典,一個普通詞典,一個專有詞典。
而且是專有詞典的詞彙先切分,然後將剩餘片斷交給普通詞典去切分。
以上面的「北京華煙雲」之所以被切分成「北/京華煙雲」,
另外一個可能是「京華煙雲」這個詞彙是在專有詞典裡面存儲的。
所以先分析,這樣得出「京華煙雲」剩下「北」,沒什麼好切分的,所以就呈現出來了。
這里只是假設,那麼是否確實「京華煙雲」在專有詞典呢?
我們再看一個例子「山東北京華煙雲」,
如果「京華煙雲」在普通詞典,如果是反向切分,那麼結果應該是,如果是正向切分應該是,無論如何都分不出。這說明什麼?說明「京華煙雲」是在那個專有詞典
所以先切分出「京華煙雲」,然後剩下的「山東北」交由普通詞典切分,明顯是正向最大匹配的結果呈現。
當然按照我們在前面講的演算法推導「山東北」的切分也會得出的結論。
但是明顯比正向最大匹配多幾個判斷步驟,既然效果一樣,另外一個更加簡潔的方法也能說得通,那當然選擇簡便的方法了。所以初步判斷網路採取的是正向最大匹配。
我們繼續測試採用何種分詞演算法,
為了減少專有詞典首先分詞造成的影響,那麼查詢裡面不能出現相對特殊的詞彙
我們查詢「天才能量級」,看看
這里應該沒有專有詞典出現過的詞彙,網路切分為天才 /能量/ 級
看來是正向最大匹配的結果。
另外,如果所有查詢詞彙都出現在專有詞典,那麼採取的是何種方法?
這樣首先就得保證詞彙都出現在專有詞典,這么保證這一點呢?我們構造查詢「山東京城」,網路切分為「山東/京城」,說明「東京」是在普通詞典的。構造查詢「陳曉東京華煙雲」,
通過前面分析可以看出兩個詞彙都在專有詞典裡面,網路切分為陳曉東 /京華煙雲 ,
說明對於專有詞典詞彙也是採取正向最大匹配或者雙向最大匹配。
那麼使用反向最大匹配了嗎?構造查詢例子「陳曉東方不敗」。
首先我們肯定「陳曉東」和「東方不敗」都是在專有詞典出現的,
如果是正向切分陳曉東 /方/ 不敗
那麼應該是或者如果是反向切分則是陳曉/東方不敗
可以看出網路的切分是或者,說明採用的是正向最大匹配。
通過分析,網路的詞典不包含「不敗」這個單詞。所以實際上網路的切分很明顯這和我們以前推導的演算法是有矛盾的,所以以前的分析演算法確實有問題,所以結論是網路採取的是正向最大匹配演算法
重新歸納一下網路的分詞系統:首先用專有詞典採用最大正向匹配分詞,切分出部分結果,剩餘沒有切分交給普通詞典,同樣採取正向最大匹配分詞,最後輸出結果。
另外,GOOGLE也是採用正向最大匹配分詞演算法,
不過好像沒有那個專用詞典,所以很多專名都被切碎了
I. 什麼是自動分詞系統搜索引擎是如何實現的
緊接著上一講,搜索引擎索引網頁庫建立之後,我們需要對索引網頁庫預處理,其中又分為兩大類:網頁分析和建立倒排文件索引。而搜索引擎的自動分詞系統就是進行網頁分析的前提。
首先,中文和英文不同的是,英文單詞之間有空格,而中文都是連貫在一起來操作的,在形式上,無法做出區分。所以中文文本在進行網頁分析之前,需要將文本切分為多個詞或者字。在目前檢索中,主要可以分為按字檢索和按詞檢索,其中按詞檢索,擁有更快的速度和較高的准確性。
自動分詞系統演算法介紹
分詞系統基本方法:基於字元串匹配的分詞方法和基於統計的分詞方法。
1)基於字元串匹配:也稱為機械分詞,按照幾個既定的策略,將等待分析的字元串和一個容量足夠大的詞典中的詞條進行匹配,若在詞典中找到同樣的一個字元串,那麼匹配成功。
字元串匹配分詞,按照掃描方向,可以分為:正向匹配和逆向匹配;按照不同長度有限匹配,可以分為:最大匹配和最小匹配;按照是否與詞性標注相結合,可以分為:單純分詞方法和分詞與標注相結合的一體化方法;
常用的機械分詞方法:正向最大匹配,逆向最大匹配,最小切分(就是在每一句中切除的詞量最少,而不是單個詞位元組最少) (鹽城SEO聯想:使用正向最大匹配,逆向最大匹配,和我們SEO中經常用到的關鍵詞靠前,則排名越有利,是否存在關聯)
同時,在機械分詞法中,存在這樣一個模型:ASM(d,a,m);
d:匹配方向,+表示正向,-表示逆向;
a:每次匹配失敗後增加或減少字串長度(字元串),「+」就是增加一個,「-」就是減少一個;
m:最大或最小匹配標志,+為最大匹配,-為最小匹配。
對於,中文漢字來說,ASM(+,=,+)是最為實用的方法。
2)基於統計的分詞方法介紹:
在表現形式上,詞是多個字的穩定組合,所以說,在文章中,相鄰的字同時出現的次數越多,那麼越有可能是一個詞,因此,字和字相鄰出現的的頻率可以大概的反應出詞的可信率。
通過公式:M(x,y)=log( P(x,y) / p(x)p(y) )來計算他們的互現信息,該互現信息體現了漢字之間結合的緊密程度,當M(x,y)的值大於某一閾值時,便可以確定這是一個詞。
因為,只需要對字組頻率進行計算,不需要使用詞典,所以叫做無詞典分詞方法,或者說統計分詞方法。
缺點:經常會抽出一些高頻,但不是詞的常用片語,如:「我們」「共同」「有的」等。
所以在正常使用中,統計分詞法,都會使用一部基本的分詞詞典(常用詞詞典),通過字元串分詞系統,識別出常用片語,同時通過統計分詞系統,識別出新詞,生詞,兩者結合,即發揮出字元串匹配分詞系統的速度快,效率高,又可以利用統計分詞系統識別生詞,自動消除歧義的優點。
J. 我需要把一些語料進行基於統計的分詞方法(無詞典),將其分詞形成一個詞庫,這種分詞演算法誰會嗎
的故事大概