NLP實戰 基於列舉實現中文分詞(python)

2021-10-07 00:01:25 字數 3416 閱讀 4776

邏輯:

例子:我們經常有意見分歧

詞典:【「我們」,「經常」,「有」,「有意見」,「意見」,「分歧」】

列舉滿足詞典的所有可能情況:

我們、 經常、有、意見、分歧

我們、經常、有意見、分歧

實現所需的資料需求:

給定詞典=[我們 學習 人工 智慧型 人工智慧 未來 是], 另外我們給定unigram概率:p(我們)=0.25, p(學習)=0.15, p(人工)=0.05, p(智慧型)=0.1, p(人工智慧)=0.2, p(未來)=0.1, p(是)=0.15

step 1: 對於給定字串:」我們學習人工智慧,人工智慧是未來「, 找出所有可能的分割方式

step 2: 我們也可以計算出每乙個切分之後句子的概率

關於為什麼用log?

如果此項在語料庫**現次數比較少,有可能出現underflow的情況,解決辦法就是加上log,log是嚴格遞增的函式,原本的關係也是仍然成立的,在比較的情況下是等同的。

import math

import xlrd

# todo: 第一步: 從dic.txt/dic.xlsx中讀取所有中文詞。

print

("reading dic..."

)# 獲取物件

workbook = xlrd.

open_workbook

("中文詞庫.xlsx"

)dic_words =

# 儲存詞典庫中讀取的單詞

# 獲取第乙個sheet的物件列表

booksheet = workbook.

sheet_by_index(0

)rows = booksheet.

get_rows()

for row in rows:

dic_words.

(row[0]

.value)

print

("len:"

+str

(len

(dic_words)))

# 以下是每乙個單詞出現的概率。為了問題的簡化,我們只列出了一小部分單詞的概率。 在這裡沒有出現的的單詞但是出現在詞典裡的,統一把概率設定成為0.00001

# 比如 p

("學院")=

p("概率")=

...0.00001

word_prob =

print

(sum

(word_prob.

values()

))# todo:計算-

log(x)

for word in word_prob.

keys()

: word_prob[word]

=round

(-math.

log(word_prob[word]),

1)print

(word_prob)

# todo:利用遞迴計算所有可行的分詞之後的結果

def word_break

(s, dic)

: def sentences

(cur)

: result =

if cur <

len(s)

:for next in range

(cur +1,

len(s)+1

):if s[cur:next] in dic: #列表切片是前閉後開的過程

result = result +

[s[cur:next]

+(tail and ','

+ tail)

for tail in sentences

(next)

]else

:return[''

]return result

list_new =

for line in sentences(0

):line = line.

split

(","

) list_new.

(line)

return list_new

def word_segment_*****

(input_str):""

" 1. 對於輸入字串做分詞,並返回所有可行的分詞之後的結果。

2. 針對於每乙個返回結果,計算句子的概率

3. 返回概率最高的最作為最後結果

input_str: 輸入字串 輸入格式:「今天天氣好」

best_segment: 最好的分詞結果 輸出格式:["今天","天氣","好"]

""" # todo: 第一步: 計算所有可能的分詞結果,要保證每個分完的詞存在於詞典裡,這個結果有可能會非常多。

segments =

word_break

(input_str, dic_words) # 儲存所有分詞的結果。如果次字串不可能被完全切分,則返回空列表(list)

# 格式為:segments =[[

"今天",「天氣」,「好」],[

"今天",「天「,」氣」,「好」],[

"今「,」天",「天氣」,「好」]

,...

] # todo: 第二步:迴圈所有的分詞結果,並計算出概率最高的分詞結果,並返回

best_segment =

best_score = math.inf # best_score初始值等於正無窮大

for seg in segments:

score =

0for w in seg:

if w in word_prob.

keys()

: score += word_prob[w]

else

: score +=

round

(-math.

log(

0.00001),

1)if score < best_score:

best_score = score

best_segment = seg

return best_segment

# todo:測試

print

(word_segment_*****

("北京的天氣真好啊"))

print

(word_segment_*****

("今天的課程內容很有意思"))

print

(word_segment_*****

("經常有意見分歧"

))

學人工智慧的猜猜

divine0

NLP系列 中文分詞(基於詞典)

詞是最小的能夠獨立活動的有意義的語言成分,一般分詞是自然語言處理的第一項核心技術。英文中每個句子都將詞用空格或標點符號分隔開來,而在中文中很難對詞的邊界進行界定,難以將詞劃分出來。在漢語中,雖然是以字為最小單位,但是一篇文章的語義表達卻仍然是以詞來劃分的。因此處理中文文字時,需要進行分詞處理,將句子...

NLP基礎實驗 中文分詞 jieba

中文分詞有很多種,常見的比如有中科院計算所 nlpir 哈工大 ltp 清華大學 thulac 斯坦福分詞器 hanlp 分詞器 jieba 分詞 ikanalyzer 等。官方 三種分詞演算法 支援三種分詞模式 import jieba content 現如今,機器學習和深度學習帶動人工智慧飛速的...

基於規則的中文分詞

正向最大匹配 maximum match method,mm法 的基本思想為 假定分詞詞典中的最長詞有i個漢字字元,則用被處理文件的當前字串中的前i個字作為匹配字段,查詢字典。若字典中存在這樣的乙個i字詞,則匹配成功,匹配欄位被作為乙個詞切分出來。如果詞典中找不到這樣的乙個i字詞,則匹配失敗,將匹配...