邏輯:
例子:我們經常有意見分歧
詞典:【「我們」,「經常」,「有」,「有意見」,「意見」,「分歧」】
列舉滿足詞典的所有可能情況:
我們、 經常、有、意見、分歧
我們、經常、有意見、分歧
實現所需的資料需求:
給定詞典=[我們 學習 人工 智慧型 人工智慧 未來 是], 另外我們給定unigram概率:p(我們)=0.25, p(學習)=0.15, p(人工)=0.05, p(智慧型)=0.1, p(人工智慧)=0.2, p(未來)=0.1, p(是)=0.15step 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字詞,則匹配失敗,將匹配...