NLP筆記1 中文分詞(資料預處理篇)

2021-10-05 08:38:30 字數 4264 閱讀 5931

如何實現準確並且迅速的中文分詞一直是自然語言處理領域研究中的基礎。

這三類分詞技術代表了當前中文分詞的發展方向,它們有著各自的優缺點。

基於字串匹配的分詞是通過構建乙個固定的詞表,對照這個詞表,對輸入的問句進行字串擷取和字串匹配。主要原理是將問句從頭開始不斷切割成若干個子字串,當所有的子字串都能夠與詞表中的某乙個單詞匹配時,分詞即結束。這種分詞方法不需要大規模的語料庫進行訓練,複雜性相對較小,分詞速度較快,但該方法過於依賴性詞表的質量,當詞表足夠大時,該方法的優勢明顯。相反,詞表較小時,分詞效果較差,且不能識別未登入詞。目前,基於字串匹配的分詞法中有最大正向匹配法、最大逆向匹配法和最小切分法等。

理論與實現步驟

首先假設詞表中最長的詞有 p 個字元,然後對輸入的長度為 n 的字串從頭開始,擷取其前 p 個字元作為待匹配的字段,若在詞表中匹配成功,從剩下的 n-p 個字元中繼續匹配。若匹配不成功,則去除前 p 字元中最後乙個字元後,對 p-1 個字元進行匹配。如此進行下去,直至長度為 n 的字串全部匹配成功。

因為停用詞對後續文字處理可能會造成干擾,所以在用正向最大匹配演算法分詞的過程中直接去除了停用詞。具體步驟如下:

s1、匯入分詞詞典words.txt,儲存為字典形式dic、匯入停用詞詞典stop_list.txt ,儲存為字典形式dir_stop、需要分詞的文字檔案txt_to_cut.txt,儲存為字串chars

s2、遍歷分詞詞典,找出最長的詞,其長度為此演算法中的最大分詞長度max_chars(也就是上面說到的p)

s3、建立空列表word_list儲存分詞結果

s4、初始化字串chars的分詞起點n=0

s5、判斷分詞點n是否在字串chars內(即是否完成分詞),即n < len(chars) 如果成立,則進入下一步驟,否則進入s9

s6、根據分詞長度i(初始值為max_chars)擷取相應的需分詞文字chars的字串s

s7、判斷s是否存在於分詞詞典中

若存在,則分兩種情況討論:

(1)若s是停用詞,那麼直接刪除,分詞起點n後移i位,轉到步驟s5;

(2)若s不是停用詞,那麼直接新增到分詞結果words中,分詞起點n後移i位,轉到步驟s5;

若不存在,則分兩種情況討論:

(1)s是停用詞,那麼直接刪除,分詞起點後移i位,轉到步驟s5;

(2)s不是停用詞,分詞長度i>1時,分詞長度i減少1,轉到步驟s6 ,若是此時s是單字,則轉入步驟s8;

s8、將s新增到分詞結果words中,分詞起點n後移1位,轉到步驟s5

s9、將需分詞文字chars的分詞結果words輸出到文字檔案result.txt中

python實現
"""

最大正向匹配演算法實現1

codecs 模組 :codecs專門用作編碼轉換

"""import codecs

# 獲得分詞字典,儲存為字典形式

f1 = codecs.

open

('words.txt'

,'r'

, encoding=

'utf8'

)dic =

while1:

line = f1.readline()if

len(line)==0

:break

term = line.strip(

)# 去除字典兩側的換行符,避免最大分詞長度出錯

dic[term]=1

f1.close(

)# 獲得需要分詞的文字,為字串形式

f2 = codecs.

open

('txt_to_cut.txt'

,'r'

, encoding=

'utf8'

)chars = f2.read(

).strip(

)f2.close(

)# 獲得停用詞典,儲存為字典形式

f3 = codecs.

open

('stoplist.txt'

,'r'

, encoding=

'utf8'

)stoplist =

while1:

line = f3.readline()if

len(line)==0

:break

term = line.strip(

) stoplist[term]=1

f3.close(

)# 正向匹配最大分詞演算法

# 遍歷分詞詞典,獲得最大分詞長度

max_chars =

0for key in dic:

iflen

(key)

> max_chars:

max_chars =

len(key)

# 定義乙個空列表來儲存分詞結果

words =

n =0

while n <

len(chars)

: matched =

0# range([start,] stop[, step]),根據start與stop指定的範圍以及step設定的步長 step=-1表示去掉最後一位

for i in

range

(max_chars,0,

-1):

# i等於max_chars到1

s = chars[n : n + i]

# 擷取文字字串n到n+1位

# 判斷所擷取字串是否在分詞詞典和停用詞詞典內

if s in dic:

if s in stoplist:

# 判斷是否為停用詞

matched =

1 n = n + i

break

else

: matched =

1 n = n + i

break

if s in stoplist:

matched =

1 n = n + i

break

ifnot matched:

# 等於 if matched == 0

) n = n +

1# 分詞結果寫入檔案

f3 =

open

('fmmresult.txt'

,'w'

, encoding=

'utf8'

)f3.write(

' '

.join(

'%s'%id

forid

in words)

)f3.close(

)

實現原理和最大正向匹配法相同,只是匹配的順序是從字串的末端開始向前匹配,適用的詞表也是逆序的詞表。

實現原理是對於輸入字串,列舉其所有分詞情況,然後選擇分詞數量最小的情況。因此大多情況下,分詞長度越長,結果會越準確。但此種方法只適用於輸入字串較長度 n 較小的情況下。

基於統計的分詞演算法的基本原理是利用統計的方法計算字串在語料庫中的出現頻率,通過概率計算,判斷字串是否可以單獨成詞。這種方法不需要固定的詞表,核心思想是當相鄰的字元出現的次數越多時,這些字元組成乙個詞的可信度就越大,對未登入詞識別展現了很好的優越性。但需要進行大量的文字訓練,演算法計算周期長,複雜度較高。

基於理解的分詞方法是通過讓計算機模擬人對句子的理解,達到識別詞的效果。其基本思想就是在分詞的同時進行句法、語義分析,利用句法資訊和語義資訊來處理歧義現象。它通常包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統可以獲得詞、句的句法和語義資訊來對分詞歧義進行判斷,即它模擬了人對句子的理解過程[34]。對未登入詞有較強的識別能力,不需要詞表和大量語料的訓練,但需要使用大量的語言知識和資訊、完備的規則庫。演算法複雜,實現技術難度較大,處理速度較慢,目前還處於實驗測試階段。

nlp 中文資料預處理

資料載入 預設csv格式 import pandas as pd datas pd.read csv test.csv header 0,index col 0 dataframe n datas data.to numpy ndarray 轉成numpy更好處理 個人喜好 去除空行def dele...

文字蘊含日記1 中文分詞

1 什麼是分詞 分詞是指將連續的字序列按照一定的規範重新組合成詞序列的過程。簡而言之,就是將乙個句子中的字重新劃分組合成詞。2 為什麼要強調中文分詞技術 之所以特地強調中文分詞,是因為中文在行文上的特殊性。以英文為代表的拉丁語系語言,英文以空格作為天然的分隔符,而中文詞語之間沒有分隔。古代漢語中除了...

NLP 二 中文處理jieba模組

jieba模組 中文沒有空格 jieba.cut方法接受三個引數的 需要分詞的字串 cut all引數用來控制是否採用全模式 hmm引數用來控制是否使用hmm模型 jieba.cut for search方法接受兩個引數 需要分詞的字串 是否使用hmm模型 import jieba text 我來到...