句子分割可以看作是乙個標點符號的分類任務:每當我們遇到乙個可能會結束的句子的符號,我們必須決定他是否終止了當前句子。
#首先獲得一些已被分割成句子的資料 #將他轉換成一種適合提取特徵的形式
import nltk
sents = nltk.corpus.treebank_raw.sents()
tokens =
boundaries = set()
offset = 0
for sent in nltk.corpus.treebank_raw.sents():
tokens.extend(sent)
offset+=len(sent)
boundaries.add(offset-1)
print(boundaries)
在這裡 tokens是單獨句子識別符號的合併鍊錶,boundaries 是乙個包含所有句子邊界識別符號索引的集合。
接著我們要指定用於決定標點是否表示句子邊界的資料特徵:
def punct_features(tokens, i):
return
基於這個特徵提取器,我們可以通過選擇所有的標點符號建立乙個加標籤的特徵集的鍊錶,然後標註他們是否是邊界識別符號:
featuresets = [(punct_features(tokens, i), (i in boundaries))
for i in range(1, len(tokens)-1)if tokens[i] in '.?!']
再訓練乙個標點符號分類器:
size = int(len(featuresets) * 0.1)
train_set, test_set = featuresets[size:], featuresets[:size]
classifier = nltk.*****bayesclassifier.train(train_set)
nltk.classify.accuracy(classifier, test_set)
使用該分類器進行斷句:
def segment_sentences(words):
start = 0
sents =
for i, word in enumerate(words):
if word in '.?!' and classifier.classify(punct_features(words, i)) == true:
start = i+1
if start < len(words):
return sents
在處理對話時,把話語看作說話者所做的一種行為是很有用的。這個解釋是最簡單的表述行為的(表述行為的)語句如「我原諒你」或「我打賭你不能爬那座山。」但是問候語、問題、答案、斷言和說明都可以被認為是基於言語的行為型別。識別對話言語下的對話行為是理解對話的重要的第一步。
nps語料庫中,有超過10000個來自即時訊息會話的帖子。這些帖子都已經被貼上15種對話行為型別中的一種標籤。
posts = nltk.corpus.nps_chat.xml_posts()[:10000]
定義乙個簡單的特徵提取器,檢查帖子包含了什麼詞:
def dialogue_act_features(post):
features = {}
for word in nltk.word_tokenize(post):
features['contains(%s)' % word.lower()] = true
return features
然後為每個帖子提取特徵,構造訓練和測試資料。並建立乙個新的分類器。
featuresets = [(dialogue_act_features(post.text), post.get('class'))
for post in posts]
size = int(len(featuresets) * 0.1)
train_set, test_set = featuresets[size:], featuresets[:size]
classifier = nltk.*****bayesclassifier.train(train_set)
print(nltk.classify.accuracy(classifier, test_set))
識別文字蘊含的意思是判斷文字t的乙個給定片段是否蘊含著另乙個叫做 假設 的文字。
在我們的rte特徵檢測器中,我們讓單詞(即詞型別)作為**的資訊,和我們的特性計算重疊程度的詞,並假設有單詞的程度而不是文字。並不是所有的單詞都是同樣重要的–命名實體,如人的名字,組織和地方可能會是更重要的,這促使我們為word和nes(命名實體)提取不同的資訊,此外,一些高頻虛詞作為「停止詞」被過濾掉。
構造特徵提取器:
def rte_features(rtepair):
extractor = nltk.rtefeatureextractor(rtepair)
features = {}
features['word_overlap'] = len(extractor.overlap('word'))
features['word_hyp_extra'] = len(extractor.hyp_extra('word'))
features['ne_overlap'] = len(extractor.overlap('ne'))
features['ne_hyp_extra'] = len(extractor.hyp_extra('ne'))
return features
為了表明特徵的內容,可以檢驗下前面顯示的文字/假設 的一些屬性
rtepair = nltk.corpus.rte.pairs(['rte3_dev.xml'])[33]
extractor = nltk.rtefeatureextractor(rtepair)
print(extractor.text_words)
print extractor.overlap('word')
print extractor.overlap('ne')
print extractor.hyp_extra('word')
11 分類與監督學習,樸素貝葉斯分類演算法
老師 missdu 提交作業 1.理解分類與監督學習 聚類與無監督學習。簡述分類與聚類的聯絡與區別。簡述什麼是監督學習與無監督學習。答 監督學習 根據已有的資料集,知道輸入和輸出結果之間的關係。根據這種已知的關係,訓練得到乙個最優的模型。無監督學習 我們不知道資料集中資料 特徵之間的關係,而是要根據...
11 分類與監督學習,樸素貝葉斯分類演算法
1.理解分類與監督學習 聚類與無監督學習。簡述分類與聚類的聯絡與區別。簡述什麼是監督學習與無監督學習。2.樸素貝葉斯分類演算法 例項 利用關於心臟病患者的臨床歷史資料集,建立樸素貝葉斯心臟病分類模型。有六個分類變數 分類因子 性別,年齡 killp評分 飲酒 吸菸 住院天數 目標分類變數疾病 心梗 ...
11 分類與監督學習,樸素貝葉斯分類演算法
1.理解分類與監督學習 聚類與無監督學習。簡述分類與聚類的聯絡與區別。聯絡 分類與聚類都是在資料集中尋找離自己最近的點 區別 分類是一種有監督學習,目的是為了確定點的類別,而類別是已知的 聚類是一種無監督學習,目的是將點分為成若干個類,事先是沒有類別的。簡述什麼是監督學習與無監督學習。監督學習 在監...