Task2.特征提取
參考:https://blog.csdn.net/u012052268/article/details/77825981/
利用jieba分詞工具去除停用詞:
? ? 停用詞:1.在SEO中為節(jié)省空間和提高搜索效率,搜索引擎會(huì)在索引頁面或處理搜索請(qǐng)求時(shí)自動(dòng)忽略某些字或詞。使用廣泛,甚至是用的過于頻繁的詞,如英文中的‘i’,'is','what',中文中的‘我’,'就'等等幾乎在每篇文章中都會(huì)出現(xiàn),但是如果使用了太多的停用詞,也同樣可能無法得到較為精確的結(jié)果。2.在文章中出現(xiàn)頻率很高,但是實(shí)際意義不大,主要包括語氣助詞、副詞、介詞、連詞等,例如‘的’,‘在’,‘與’,‘雖然’等等。
1 import jieba 2 3 #創(chuàng)建停用詞表 4 def stopwordslist(): 5 stopwords = [line.strip() for line in open('stopwords.txt',encoding='utf-8').readlines()] 6 return stopwords 7 8 #對(duì)句子今進(jìn)行分詞 9 def seg_depart(sentence): 10 sentence_depart = jieba.cut(sentence.strip()) 11 stopwords = stopwordslist() 12 #print(''.join(sentence_depart)) 13 outstr = '' 14 for word in sentence_depart: 15 if word not in stopwords: 16 if word != '\t': 17 outstr += word 18 outstr += " " 19 return outstr 20 21 filename = 'NBA.txt' 22 outfilename = 'outputs.txt' 23 inputs = open(filename,'r',encoding='utf8') 24 outputs = open(outfilename,'w',encoding='utf8') 25 26 #將結(jié)果寫入output.txt中 27 for line in inputs: 28 line_seg = seg_depart(line) 29 outputs.write(line_seg +'\n') 30 31 outputs.close() 32 inputs.close() 33 print("success")結(jié)果如下:
北京 時(shí)間 月 20 日 2017 年 NBA 全明星 正賽 之前 訓(xùn)練 中 出現(xiàn) 有趣 一幕 起初 威少 脫離 西部 全明星 球員 獨(dú)自 練習(xí) 投籃 全隊(duì) 跑 籃 過程 中 威少 加入 西部 全 明星隊(duì) 凱文 - 杜蘭特 出現(xiàn) 互動(dòng) 推特上 媒體 拍 照片 來看 西部 全明星 球員 賽前 投籃 熱身 中 威少 一個(gè) 一個(gè) 半場(chǎng) 投籃 西部 全明星 球員 一個(gè) 半場(chǎng) 投籃 看來 杜蘭特 威少 拒絕 外界 看來 威少 刻意 避開 杜蘭特 也許 威少 一個(gè) 投籃 太 孤獨(dú) 詹姆斯 - 哈登 加入 威少 之后 全隊(duì) 跑 籃中 威少 加入 西部 全 明星隊(duì) 杜蘭特 出現(xiàn) 期待 互動(dòng) 互相 傳球 了解 杜蘭特 威少 送出 上籃 助攻 勇士 記者 安東尼 - 斯萊特 推特上 表示 威少 杜蘭特 沒有 變得 友好 沒有 忽視 KD 威少 互相 傳球 搶 籃板 天吶 天吶 看見 沒 杜蘭特 更衣柜 剛好 韋 斯布魯克 更衣柜 對(duì)面 梅 拉斯 寫道 發(fā)布 一段 小視頻 清楚 看出 韋 斯布魯克 杜蘭特 之間 相隔 名 球員 韋 斯布魯克 身旁 身披 15 號(hào) 考辛斯 杜蘭特 位于 對(duì)角 位置 左側(cè) 位置 湯普森 庫里 格林 勇士 四人組 更衣柜 位置 挨 一塊兒 昔日 雷霆 效力 杜 韋二少 如今 關(guān)系 非常 惡劣 勇士 客場(chǎng) 擊敗 雷霆 賽后 兩人 先后 進(jìn)入 一家 牛排館 吃飯 相隔 五米 全程 毫無 交流 全明星 周末 期間 韋 斯布魯克 杜蘭特 迎面 碰到 兩人 裝作 沒有 看見 宛若 空氣 破裂 感情 修復(fù) 或許 只能 依靠 時(shí)間 有趣 昨天 三分球 大賽 現(xiàn)場(chǎng) 主持人 介紹 到場(chǎng) 嘉賓 時(shí) 出現(xiàn) 口誤 端坐 場(chǎng)邊 杜蘭特 稱為 俄克拉荷馬 杜蘭特 顯得 一臉 不爽 本屆 全明星 正賽 最大 看點(diǎn) 杜韋二少 重逢 會(huì) 擦 出 火花 掌握 勇士 主帥 史蒂夫 - 科爾 手里 韋少 完成 全明星 MVP 三連莊 成為 正賽 一個(gè) 噱頭 張衛(wèi)平 指導(dǎo) 本次 正賽 看法 看看 說 張衛(wèi)平 預(yù)測(cè) 全明星 正賽 因素 助 韋少 MVP 三連莊 張衛(wèi)平 指導(dǎo) 預(yù)測(cè) 全明星 正賽 全明星賽 MVP 歸屬 張 指導(dǎo) 認(rèn)為 韋少 當(dāng)選 機(jī)會(huì) 很大 韋少 已經(jīng) 連續(xù) 兩年 成為 全明星 MVP 歸屬 ( 2015 年 全明星賽 韋少 轟下 41 分 奪得 全明星賽 MVP 2016 年 全明星賽 砍 31 分 蟬聯(lián) 全明星賽 MVP 韋少 成為 繼 佩蒂特 之后 NBA 歷史 第二位 蟬聯(lián) 全明星賽 MVP 球員 ) 韋少 今年 再奪 全明星賽 MVP 成為 NBA 史上 第一位 完成 全明星賽 MVP 三連莊 球員 目標(biāo) 全力 沖擊 說 前 凱爾特人 隊(duì) 現(xiàn) 快船隊(duì) 主教練 道 格 - 里 弗斯 科爾 提 建議 死敵 全明星賽 瘋狂 發(fā)揮 免得 將來 見面 玩命 現(xiàn)在 勇士 西部 死敵 韋少 帶領(lǐng) 雷霆 究其原因 杜蘭特 韋少 之間 冗長(zhǎng) 肥皂劇 科爾 一定 會(huì) 韋少 全明星賽 打個(gè) 痛快 張 指導(dǎo) 認(rèn)為 勇士 四 巨頭 不會(huì) 科爾 全明星賽 控制 出場(chǎng) 時(shí)間 埋怨 主教練 對(duì)手 會(huì) 怠慢 記下 仇來 科爾 不出意外 應(yīng)該 會(huì) 聽從 里 弗斯 建議 韋少 玩命 第三點(diǎn) 韋少 性格 來看 全明星賽 娛樂 性質(zhì) 比賽 沒有 特別 認(rèn)真 地去 韋少 不會(huì) 在意 特點(diǎn) 上場(chǎng) 干 性格 兩次 全明星 MVP 最好 佐證 大伙 心照不宣 韋少 目前 保持 著場(chǎng) 均 三雙 全明星 先發(fā) 心里 一直 憋著 一口氣 證明 看來 科爾 選擇 韋少 戰(zhàn)個(gè) 痛快 加上 韋少 性格 第三座 全明星 MVP 應(yīng)該 穩(wěn)穩(wěn)地 收下 張 指導(dǎo) 說 不能 說 韋少 一定 MVP 預(yù)測(cè) 具體 臨場(chǎng) 發(fā)揮 ( 栗旬 )統(tǒng)計(jì)詞頻:
1 import jieba 2 #encoding=utf8 3 #創(chuàng)建停用詞表 4 def stopwordslist(): 5 stopwords = [line.strip() for line in open('stopwords.txt',encoding='utf-8').readlines()] 6 return stopwords 7 8 #對(duì)句子今進(jìn)行分詞 9 def seg_depart(sentence): 10 sentence_depart = jieba.cut(sentence.strip()) 11 stopwords = stopwordslist() 12 #print(''.join(sentence_depart)) 13 word_list=[] 14 for word in sentence_depart: 15 if word not in stopwords: 16 if word != '\t': 17 word_list.append(word) 18 19 return word_list 20 21 filename = 'NBA.txt' 22 outfilename = 'outputs.txt' 23 inputs = open(filename,'r',encoding='utf-8-sig')#讀取開頭避免把\ufeff讀進(jìn)去 24 25 dic_count={}#統(tǒng)計(jì)詞頻的字典 26 27 for line in inputs: 28 line_seg = seg_depart(line) 29 for word in line_seg: 30 if word not in dic_count: 31 dic_count[word] = 1 32 else: 33 dic_count[word] += 1 34 35 inputs.close() 36 print("success") 37 print(dic_count) {'周末': 1, '第三座': 1, '完成': 2, '孤獨(dú)': 1, '推特上': 2, '佩蒂特': 1, '打個(gè)': 1, '心里': 1, '不出意外': 1, '最大': 1, '砍': 1, '出現(xiàn)': 4, '拍': 1, '剛好': 1, '進(jìn)入': 1, 'MVP': 12, '不能': 1, '只能': 1, '很大': 1, '出': 1, '北京': 1, '忽視': 1, '左側(cè)': 1, '發(fā)揮': 2, '第二位': 1, '一口氣': 1, '到場(chǎng)': 1, '目前': 1, '身旁': 1, '里': 2, '兩人': 2, '籃': 1, '湯普森': 1, '稱為': 1, '佐證': 1, '年': 3, ')': 2, '雷霆': 3, 'NBA': 3, '前': 1, '瘋狂': 1, '破裂': 1, '會(huì)': 4, '助': 1, '掌握': 1, '蟬聯(lián)': 2, '沒': 1, '2017': 1, '心照不宣': 1, '傳球': 2, '證明': 1, '三雙': 1, '選擇': 1, '安東尼': 1, '關(guān)系': 1, '西部': 6, '五米': 1, '說': 4, '全隊(duì)': 2, '巨頭': 1, '杜蘭特': 13, '之后': 2, '梅': 1, '預(yù)測(cè)': 3, '有趣': 2, '噱頭': 1, '毫無': 1, '勇士': 6, '脫離': 1, '跑': 2, '宛若': 1, '現(xiàn)場(chǎng)': 1, '了解': 1, '凱爾特人': 1, '性格': 3, '主教練': 2, '清楚': 1, '全明星賽': 12, '明星隊(duì)': 2, '一塊兒': 1, '兩年': 1, '出場(chǎng)': 1, '-': 5, '隊(duì)': 1, '地去': 1, '也許': 1, '埋怨': 1, '全': 2, '再奪': 1, '主持人': 1, '沒有': 4, '一直': 1, '本次': 1, '嘉賓': 1, '格': 1, '日': 1, '最好': 1, '科爾': 6, '先后': 1, '詹姆斯': 1, '避開': 1, '大賽': 1, '位于': 1, '正賽': 6, '第一位': 1, '加入': 3, '性質(zhì)': 1, '助攻': 1, '不爽': 1, '比賽': 1, '加上': 1, '四人組': 1, '保持': 1, '拒絕': 1, '15': 1, '史蒂夫': 1, '杜韋二少': 1, '韋二少': 1, '指導(dǎo)': 5, '提': 1, '獨(dú)自': 1, '道': 1, '位置': 3, '栗旬': 1, '互相': 2, '期待': 1, '格林': 1, '昨天': 1, '41': 1, '球員': 6, '連續(xù)': 1, '之間': 2, '表示': 1, '看出': 1, '全力': 1, '第三點(diǎn)': 1, '更衣柜': 3, '相隔': 2, '裝作': 1, '痛快': 2, '分': 2, '著場(chǎng)': 1, '媒體': 1, '三分球': 1, '憋著': 1, '庫里': 1, '特別': 1, '挨': 1, '帶領(lǐng)': 1, '杜': 1, '昔日': 1, '寫道': 1, '一幕': 1, '小視頻': 1, '韋少': 17, '認(rèn)為': 2, '娛樂': 1, '轟下': 1, '發(fā)布': 1, '快船隊(duì)': 1, '口誤': 1, '特點(diǎn)': 1, '張': 3, '(': 2, '31': 1, '對(duì)面': 1, '看看': 1, '碰到': 1, '天吶': 2, '效力': 1, '送出': 1, '一個(gè)': 5, '四': 1, '凱文': 1, '擊敗': 1, '對(duì)角': 1, '變得': 1, '擦': 1, '看見': 2, '看來': 3, '惡劣': 1, '聽從': 1, '現(xiàn)': 1, 'KD': 1, '俄克拉荷馬': 1, '半場(chǎng)': 2, '非常': 1, '三連莊': 3, '手里': 1, '建議': 2, '穩(wěn)穩(wěn)地': 1, '2016': 1, '起初': 1, '空氣': 1, '本屆': 1, '時(shí)': 1, '過程': 1, '感情': 1, '先發(fā)': 1, '端坐': 1, '免得': 1, '玩命': 2, '身披': 1, '冗長(zhǎng)': 1, '交流': 1, '認(rèn)真': 1, '一定': 2, '看點(diǎn)': 1, '之前': 1, '見面': 1, '火花': 1, '一家': 1, '搶': 1, '顯得': 1, '奪得': 1, '不會(huì)': 2, '名': 1, '考辛斯': 1, '應(yīng)該': 2, '均': 1, '籃板': 1, '主帥': 1, '記下': 1, '來看': 2, '仇來': 1, '月': 1, '或許': 1, '究其原因': 1, '戰(zhàn)個(gè)': 1, '成為': 4, '韋': 4, '目標(biāo)': 1, '依靠': 1, '肥皂劇': 1, '牛排館': 1, '客場(chǎng)': 1, '機(jī)會(huì)': 1, '中': 3, '上籃': 1, '看法': 1, '張衛(wèi)平': 3, '20': 1, '斯布魯克': 4, '將來': 1, '哈登': 1, '介紹': 1, '弗斯': 2, '全明星': 13, '一臉': 1, '繼': 1, '全程': 1, '威少': 11, '期間': 1, '熱身': 1, '投籃': 5, '2015': 1, '記者': 1, '號(hào)': 1, '因素': 1, '外界': 1, '怠慢': 1, '賽后': 1, '拉斯': 1, '時(shí)間': 3, '史上': 1, '籃中': 1, '干': 1, '友好': 1, '當(dāng)選': 1, '對(duì)手': 1, '迎面': 1, '臨場(chǎng)': 1, '死敵': 2, '賽前': 1, '如今': 1, '今年': 1, '訓(xùn)練': 1, '場(chǎng)邊': 1, '收下': 1, '大伙': 1, '歷史': 1, '練習(xí)': 1, '現(xiàn)在': 1, '沖擊': 1, '控制': 1, '一段': 1, '上場(chǎng)': 1, '刻意': 1, '互動(dòng)': 2, '兩次': 1, '在意': 1, '太': 1, '吃飯': 1, '照片': 1, '斯萊特': 1, '修復(fù)': 1, '重逢': 1, '具體': 1, '歸屬': 2, '已經(jīng)': 1}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?語言模型
統(tǒng)計(jì)語言模型是一個(gè)單詞序列上的概率分布,比如給定長(zhǎng)度為m的序列,它可以為整個(gè)序列產(chǎn)生一個(gè)概率P(w1,w2...wm),其實(shí)就是想辦法找到一個(gè)概率分布,它可以表示任意一個(gè)句子或者序列出現(xiàn)的概率。
目前在自然語言處理相關(guān)應(yīng)用非常廣泛,如語音識(shí)別(speech recognition) , 機(jī)器翻譯(machine translation), 詞性標(biāo)注(part-of-speech tagging), 句法分析(parsing)等。傳統(tǒng)方法主要是基于統(tǒng)計(jì)學(xué)模型,最近幾年基于神經(jīng)網(wǎng)絡(luò)的語言模型也越來越成熟。
n-gram:
為了解決自由參數(shù)數(shù)目過多的問題,引入了馬爾科夫假設(shè):隨意一個(gè)詞出現(xiàn)的概率只與它前面出現(xiàn)的有限的n-1個(gè)詞有關(guān)?;谏鲜黾僭O(shè)的統(tǒng)計(jì)語言模型被稱為N-gram語言模型。一階markov說的就是只與前面1個(gè)詞有關(guān))
從模型的效果來看,理論上n的取值越大,效果越好。但隨著n取值的增加,效果提升的幅度是在下降的。同時(shí)還涉及到一個(gè)可靠性和可區(qū)別性的問題,參數(shù)越多,可區(qū)別性越好,但同時(shí)單個(gè)參數(shù)的實(shí)例變少?gòu)亩档土丝煽啃?。?jīng)驗(yàn)上,trigram用的最多,盡管如此,原則上,能用bigram解決,絕不使用trigram
通常,通過計(jì)算最大似然估計(jì)(Maximum Likelihood Estimate)構(gòu)造語言模型,這是對(duì)訓(xùn)練數(shù)據(jù)的最佳估計(jì),公式如下:
p(w1|wi-1) = count(wi1-, wi) / count(wi-1)
如給定句子集“<s> I am Sam </s>
? ? ? ? ? ? ? ? ?<s> Sam I am </s>
? ? ? ? ? ? ? ? ?<s> I do not like green eggs and ham </s>”
部分bigram語言模型如下所示:
則 I am Sam出現(xiàn)的概率為p = 0.67 * 0.67 * 0.5 * 0.5 = 0.112225
count(wi)如下:
count(wi-1,wi)如下:
則bigram為:
bigram
那么,句子“<s> I want english food </s>”的概率為:
p(<s> I want english food </s>)=p(I|<s>) ?×? P(want|I) ?×? P(english|want)?×? P(food|english)?×? P(</s>|food)?= ?0.000031? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
為了避免數(shù)據(jù)溢出、提高性能,通常會(huì)使用取log后使用加法運(yùn)算替代乘法運(yùn)算。
log(p1*p2*p3*p4) = log(p1) + log(p2) + log(p3) + log(p4)
語言模型的評(píng)價(jià):
1.在實(shí)際應(yīng)用中的表現(xiàn)
2.困惑度(perplexity)
迷惑度越小,句子概率越大,語言模型越好。使用《華爾街日?qǐng)?bào)》訓(xùn)練數(shù)據(jù)規(guī)模為38million words構(gòu)造n-gram語言模型,測(cè)試集規(guī)模為1.5million words,迷惑度如下表所示:
為了避免出現(xiàn)0概率,還引入了數(shù)據(jù)平滑技術(shù)。
?n_gram分詞:
參考:https://baike.baidu.com/item/unigram/8675709
unigram,bigram,trigram,是自然語言處理(NLP)中的問題。父詞條:n-gram. unigram: 單個(gè)word?[1]? bigram: 雙word trigram:3 word 比如: 西安交通大學(xué): unigram 形式為:西/安/交/通/大/學(xué) bigram形式為: 西安/安交/交通/通大/大學(xué) trigram形式為:西安交/安交通/交通大/通大學(xué) 1 import re 2 pattern = re.compile(u'[^a-zA-Z\u4E00-\u9FA5]')#去除非漢字和字母的字符或數(shù)字 3 4 def generate_ngram(sentence,n=3): 5 if len(sentence) < n: 6 n = len(sentence) 7 list =[] 8 for i in range(n,len(sentence)+1): 9 if len(''.join(sentence[i-n:i]).strip()) > 1 and len(pattern.findall(''.join(sentence[i-n:i]).strip())) == 0: 10 11 list.append(sentence[i-n:i]) 12 return list sentence="438&*^%^&*我愛北京天安門" g =generate_ngram(sentence) g ['我愛北', '愛北京', '北京天', '京天安', '天安門']進(jìn)行詞頻統(tǒng)計(jì) 1 dic_ngram={} 2 for word in g: 3 if word in dic_ngram: 4 dic_ngram[word] += 1 5 else: 6 dic_ngram[word] = 1 7 print(dic_ngram) {'京天安': 1, '愛北京': 1, '我愛北': 1, '天安門': 1, '北京天': 1}
將文本NBA.txt進(jìn)行trigram分詞,并進(jìn)行詞頻統(tǒng)計(jì) 1 import re 2 pattern = re.compile(u'[^a-zA-Z\u4E00-\u9FA5]') 3 4 def generate_ngram(sentence,n=3,m=3): 5 if len(sentence) < n: 6 n = len(sentence) 7 list =[] 8 for i in range(n,len(sentence)+1): 9 if len(''.join(sentence[i-n:i]).strip()) > 1 and len(pattern.findall(''.join(sentence[i-n:i]).strip())) == 0: 10 11 list.append(sentence[i-n:i]) 12 return list 13 filename = 'NBA.txt' 14 #outfilename = 'outputs.txt' 15 inputs = open(filename,'r',encoding='utf8') 16 #outputs = open(outfilename,'w',encoding='utf8') 17 18 #將結(jié)果寫入output.txt中 19 res = [] 20 dict_ngram={} 21 for line in inputs: 22 line_seg = generate_ngram(line) 23 res.append(' '.join(line_seg)) 24 for word in line_seg: 25 if word in dict_ngram: 26 dict_ngram[word] += 1 27 else: 28 dict_ngram[word] = 1 29 30 inputs.close() 31 print(res) 32 33 #[dict_ngram[word] +=1 if word in dict_ngram else dict_ngram[word] = 1 for line in inputs for word in generate_ngram(line)] 34 35 print(dict_ngram)
?
轉(zhuǎn)載于:https://www.cnblogs.com/NPC-assange/p/10855225.html
總結(jié)
以上是生活随笔為你收集整理的Task2.特征提取的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSON.stringify() 格式化
- 下一篇: maven package自己主动部署包