當前位置:首頁 » 編程語言 » python詞法分析

python詞法分析

發布時間: 2022-07-17 10:03:23

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 等神經網路模型等。

神經網路專家系統集成式分詞法

該方法首先啟動神經網路進行分詞,當神經網路對新出現的詞不能給出准確切分時,激活專家系統進行分析判斷,依據知識庫進行推理,得出初步分析,並啟動學習機制對神經網路進行訓練。該方法可以較充分發揮神經網路與專家系統二者優勢,進一步提高分詞效率。

以上便是對分詞演算法的基本介紹。

Ⅱ 計算機python中的標注是什麼意思

  1. 標准解釋如下,希望能幫到你
    句法和詞法解析的描述採用經過改進的 BNF 語法標注。這包含以下定義樣式:
    name ::= lc_letter (lc_letter | "_")*
    lc_letter ::= "a"..."z"

  2. 第一行表示 name 是 lc_letter 之後跟零個或多個 lc_letter 和下劃線。而 lc_letter 則是任意單個 'a' 至 'z' 字元。(實際上在本文檔中始終採用此規則來定義詞法和語法規則的名稱。)

  3. 每條規則的開頭是一個名稱 (即該規則所定義的名稱) 加上 ::=。豎線 (|) 被用來分隔可選項;它是此標注中最靈活的操作符。星號 (*) 表示前一項的零次或多次重復;類似地,加號 (+) 表示一次或多次重復,而由方括弧括起的內容 ([ ]) 表示出現零次或一次 (或者說,這部分內容是可選的)。* 和 + 操作符的綁定是最緊密的;圓括弧用於分組。固定字元串包含在引號內。空格的作用僅限於分隔形符。每條規則通常為一行;有許多個可選項的規則可能會以豎線為界分為多行。

  4. 在詞法定義中 (如上述示例),還額外使用了兩個約定: 由三個點號分隔的兩個字元字面值表示在指定 (閉) 區間范圍內的任意單個 ASCII 字元。由尖括弧 (<...>) 括起來的內容是對於所定義符號的非正式描述;既可以在必要時用來說明 '控制字元' 的意圖。

  5. 它是此標注中最靈活的操作符。星號 (*) 表示前一項的零次或多次重復;類似地,加號 (+) 表示一次或多次重復,而由方括弧括起的內容 ([ ]) 表示出現零次或一次 (或者說,這部分內容是可選的)。* 和 + 操作符的綁定是最緊密的;圓括弧用於分組。固定字元串包含在引號內。空格的作用僅限於分隔形符。每條規則通常為一行;有許多個可選項的規則可能會以豎線為界分為多行

  6. 雖然所用的標注方式幾乎相同,但是詞法定義和句法定義是存在很大區別的: 詞法定義作用於輸入源中單獨的字元,而句法定義則作用於由詞法分析所生成的形符流。在下一章節 ("詞法分析") 中使用的 BNF 全部都是詞法定義;在之後的章節中使用的則是句法定義。

Ⅲ 如何利用python進行數據分析

利用python進行數據分析

鏈接: https://pan..com/s/15VdW4dcuPuIUEPrY3RehtQ

?pwd=3nfn 提取碼: 3nfn

本書也可以作為利用Python實現數據密集型應用的科學計算實踐指南。本書適合剛剛接觸Python的分析人員以及剛剛接觸科學計算的Python程序員。


Ⅳ Python怎樣使用解釋器

大學里計算機科學最吸引我的地方就是編譯器。最神奇的是,編譯器是如何讀出我寫的那些爛代碼,並且還能生成那麼復雜的程序。當我終於選了一門編譯方面的課程時,我發現這個過程比我想的要簡單得多。

在本系列的文章中,我會試著通過為一種基本命令語言IMP寫一個解釋器,來展示這種簡易性。因為IMP是一個簡單廣為人知的語言,所以打算用 Python寫這個解釋器。Python代碼看起來很像偽代碼,所以即使你不認識 Python,你也能理解它。解析可以通過一套從頭開始實現的解析器組合完成(在本系列的下一篇文章中會有解釋)。除了sys(用於I/O)、re(用於解析正則表達式)以及unittest(用於確保一切工作正常)庫,沒有使用其他額外的庫。

IMP 語言

在開始寫之前,我們先來討論一下將要解釋的語言。IMP是擁有下面結構的最小命令語言:

賦值語句(所有變數都是全局的,而且只能存儲整數):

Python

1

x := 1

條件語句:

Python

1

2

3

4

5

if x = 1 then

y := 2

else

y := 3

end

while循環:

Python

1

2

3

while x < 10 do

x := x + 1

end

復合語句(分號分隔):

Python

1

2

x := 1;

y := 2

OK,所以它只是一門工具語言,但你可以很容易就把它擴展成比Lua或python更有用的語言。我希望能把這份教程能保持盡量簡單。

下面這個例子是計算階乘的程序:

Python

1

2

3

4

5

6

n := 5;

p := 1;

while n > 0 do

p := p * n;

n := n - 1

end

IMP沒有讀取輸入的方式,所以初始狀態必須是在程序最開始寫一系列的賦值語句。也沒有列印結果的方式,所以解釋器必須在程序的結尾列印所有變數的值。

解釋器的結構

解釋器的核心是「中間表示」(Intermediate representation,IR)。這就是如何在內存中表示IMP程序。因為IMP是一個很簡單的語言,中間表示將直接對應於語言的語法;每一種表達和語句都有對應的類。在一種更復雜的語言中,你不僅需要一個「語法表示」,還需要一個更容易分析或運行的「語義表示」。

解釋器將會執行三個階段:

  • 源碼中的字元分割成標記符(token)

  • 將標記符組織成一棵抽象語法樹(AST)。抽象語法樹就是中間表示。

  • 評估這棵抽象語法樹,並在最後列印這棵樹的狀態

  • 將字元串分割成標記符的過程叫做「詞法分析」,通過一個詞法分析器完成。關鍵字是很短,易於理解的字元串,包含程序中最基本的部分,如數字、標識符、關鍵字和操作符。詞法分析器會除去空格和注釋,因為它們都會被解釋器忽略。

    實際執行這個解析過的抽象語法樹的過程稱為評估。這實際上是這個解析器中最簡單的部分了。

    本文會把重點放在詞法分析器上。我們將編寫一個通用的詞彙庫,然後用它來為IMP創建一個詞法分析器。下一篇文章將會重點打造一個語法分析器和評估計算器。

    詞彙庫

    詞法分析器的操作相當簡單。它是基於正則表達式的,所以如果你不熟悉它們,你可能需要讀一些資料。簡單來說,正則表達式就是一種能描述其他字元串的特殊的格式化的字元串。你可以使用它們去匹配電話號碼或是郵箱地址,或者是像我們遇到在這種情況,不同類型的標記符。

    詞法分析器的輸入可能只是一個字元串。簡單起見,我們將整個輸入文件都讀到內存中。輸出是一個標記符列表。每個標記符包括一個值(它代表的字元串)和一個標記(表示它是一個什麼類型的標記符)。語法分析器會使用這兩個數據來決定如何構建一棵抽象語法樹。

    由於不論何種語言的詞法分析器,其操作都大同小異,我們將創建一個通用的詞法分析器,包括一個正則表達式列表和對應的標簽(tag)。對每一個表達式,它都會檢查是否和當前位置的輸入文本匹配。如果匹配,匹配文本就會作為一個標記符被提取出來,並且被加上該正則表達式的標簽。如果該正則表達式沒有標簽,那麼這段文本將會被丟棄。這樣免得我們被諸如注釋和空格之類的垃圾字元干擾。如果沒有匹配的正則表達式,程序就要報錯並終止。這個過程會不斷循環直到沒有字元可匹配。

    下面是一段來自詞彙庫的代碼:

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

  • import sys

    import re

    def lex(characters, token_exprs):

    pos = 0

    tokens = []

    while pos < len(characters):

    match = None

    for token_expr in token_exprs:

    pattern, tag = token_expr

    regex = re.compile(pattern)

    match = regex.match(characters, pos)

    if match:

    text = match.group(0)

    if tag:

    token = (text, tag)

    tokens.append(token)

    break

    if not match:

    sys.stderr.write('Illegal character: %sn' % characters[pos])

    sys.exit(1)

    else:

    pos = match.end(0)

    return tokens

  • 注意,我們遍歷正則表達式的順序很重要。lex會遍歷所有的表達式,然後接受第一個匹配成功的表達式。這也就意味著,當使用詞法分析器時,我們應當首先考慮最具體的表達式(像那些匹配運算元(matching operator)和關鍵詞),其次才是比較一般的表達式(像標識符和數字)。

    詞法分析器

    給定上面的lex函數,為IMP定義一個詞法分析器就非常簡單了。首先我們要做的就是為標記符定義一系列的標簽。IMP只需要三個標簽。RESERVED表示一個保留字或操作符。INT表示一個文字整數。ID代表標識符。

    Python

    1

    2

    3

    4

    5

  • import lexer

    RESERVED = 'RESERVED'

    INT= 'INT'

    ID = 'ID'

  • 接下來定義詞法分析器將會用到的標記符表達式。前兩個表達式匹配空格和注釋。它們沒有標簽,所以 lex 會丟棄它們匹配到的所有字元。

    Python

    1

    2

    3

  • token_exprs = [

    (r'[ nt]+',None),

    (r'#[^n]*', None),

  • 然後,只剩下所有的操作符和保留字了。記住,每個正則表達式前面的「r」表示這個字元串是「raw」;Python不會處理任何轉義字元。這使我們可以在字元串中包含進反斜線,正則表達式正是利用這一點來轉義操作符比如「+」和「*」。

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

  • (r':=', RESERVED),

    (r'(',RESERVED),

    (r')',RESERVED),

    (r';', RESERVED),

    (r'+',RESERVED),

    (r'-', RESERVED),

    (r'*',RESERVED),

    (r'/', RESERVED),

    (r'<=',RESERVED),

    (r'<', RESERVED),

    (r'>=',RESERVED),

    (r'>', RESERVED),

    (r'=', RESERVED),

    (r'!=',RESERVED),

    (r'and', RESERVED),

    (r'or',RESERVED),

    (r'not', RESERVED),

    (r'if',RESERVED),

    (r'then',RESERVED),

    (r'else',RESERVED),

    (r'while', RESERVED),

    (r'do',RESERVED),

    (r'end', RESERVED),

  • 最後,輪到整數和標識符的表達式。要注意的是,標識符的正則表達式會匹配上面的所有的保留字,所以它一定要留到最後。

    Python

    1

    2

    3

  • (r'[0-9]+',INT),

    (r'[A-Za-z][A-Za-z0-9_]*', ID),

    ]

  • 既然正則表達式已經定義好了,我們還需要創建一個實際的lexer函數。

    Python

    1

    2

  • def imp_lex(characters):

    return lexer.lex(characters, token_exprs)

  • 如果你對這部分感興趣,這里有一些驅動代碼可以測試輸出:

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

  • import sys

    from imp_lexer import *

    if __name__ == '__main__':

    filename = sys.argv[1]

    file = open(filename)

    characters = file.read()

    file.close()

    tokens = imp_lex(characters)

    for token in tokens:

    print token

  • 繼續……

    在本系列的下一篇文章中,我會討論解析器組合,然後描述如何使用他們從lexer中生成的標記符列表建立抽象語法樹。

    如果你對於實現IMP解釋器很感興趣,你可以從這里下載全部的源碼。

    在源碼包含的示例文件中運行解釋器:

    Python

    1

  • python imp.py hello.imp

  • 運行單元測試:

    Python

    1

  • python test.py

Ⅳ 如何用bison和flex寫python的語法分析器和詞法分析

這個通用的數據結構,實際上是作為web服務層(這一層大家可以認為是類似於PHP伺服器或webpy的伺服器容器)

Ⅵ 如何利用Python對中文進行分詞處理

python做中文分詞處理主要有以下幾種:結巴分詞、NLTK、THULAC
1、fxsjy/jieba
結巴的標語是:做最好的 Python 中文分片語件,或許從現在來看它沒做到最好,但是已經做到了使用的人最多。結巴分詞網上的學習資料和使用案例比較多,上手相對比較輕松,速度也比較快。
結巴的優點:
支持三種分詞模式
支持繁體分詞
支持自定義詞典
MIT 授權協議

2、THULAC:一個高效的中文詞法分析工具包
前兩天我在做有關於共享單車的用戶反饋分類,使用jieba分詞一直太過零散,分類分不好。後來江兄給我推薦了THULAC: 由清華大學自然語言處理與社會人文計算實驗室研製推出的一套中文詞法分析工具包 。THULAC的介面文檔很詳細,簡單易上手。
THULAC分詞的優點:
能力強。利用規模最大的人工分詞和詞性標注中文語料庫(約含5800萬字)訓練而成,模型標注能力強大。
准確率高。該工具包在標准數據集Chinese Treebank(CTB5)上分詞的F1值可達97.3%,詞性標注的F1值可達到92.9%
速度較快。同時進行分詞和詞性標注速度為300KB/s,每秒可處理約15萬字。只進行分詞速度達到1.3MB/s,速度比jieba慢

Python 解決中文編碼問題基本可以用以下邏輯:
utf8(輸入) ——> unicode(處理) ——> (輸出)utf8
Python 裡面處理的字元都是都是unicode 編碼,因此解決編碼問題的方法是把輸入的文本(無論是什麼編碼)解碼為(decode)unicode編碼,然後輸出時再編碼(encode)成所需編碼。
由於處理的一般為txt 文檔,所以最簡單的方法,是把txt 文檔另存為utf-8 編碼,然後使用Python 處理的時候解碼為unicode(sometexts.decode('utf8')),輸出結果回txt 的時候再編碼成utf8(直接用str() 函數就可以了)。

Ⅶ 怎樣用 Python 進行數據分析

做數據分析,首先你要知道有哪些數據分析的方法,然後才是用Python去調用這些方法
那Python有哪些庫類是能做數據分析的,很多,pandas,sklearn等等
所以你首先要裝一個anaconda套件,它包含了幾乎所有的Python數據分析工具,
之後再學怎麼分析。

Ⅷ python 自然語言分析

你這是要做一個 能預測分類的 模型
分詞只是第一步,為了把文本結構化,也就是轉換成向量。
然後你需要先為每個向量做一個分類標注,這個標注相當於正確答案,用來讓模型學習規律的,也就是一句話對應什麼情感類型
回到正題,使用Python怎麼做?訓練用sklearn包,可以用樸素貝葉斯,或者支持向量機模型做分類。
sklearn裡面都有的,代碼怎麼寫,說不清,你得網路

熱點內容
百度雲zip怎麼解壓 發布:2025-02-01 16:31:59 瀏覽:560
pmc密碼是什麼意思 發布:2025-02-01 16:28:49 瀏覽:783
蘋果手錶和安卓手錶哪個好用 發布:2025-02-01 16:28:07 瀏覽:582
上海電信上傳 發布:2025-02-01 16:22:10 瀏覽:982
有什麼好的雙u主板配置 發布:2025-02-01 16:18:17 瀏覽:176
編程漩渦 發布:2025-02-01 16:01:51 瀏覽:327
司機會所訪問 發布:2025-02-01 15:54:11 瀏覽:780
家用電腦改成伺服器並讓外網訪問 發布:2025-02-01 15:30:23 瀏覽:354
javac工資 發布:2025-02-01 15:24:28 瀏覽:22
如何刪除伺服器登錄賬號 發布:2025-02-01 15:21:05 瀏覽:498