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