NLP学习笔记 01 分词、词性标注和关键词提取
目錄
- 1.1 準確分詞 level1
- 使用jieba自定義詞典 + 正則表達式準確分詞
- 1.2 準確分詞 level2
- 1.3 詞性標注
- 1.4 關鍵詞提取
1.1 準確分詞 level1
中文自動分詞的方法主要有三種:
- 規則分詞
- 統計分詞
- 混合分詞(規則 + 統計)
調包時如何提高分詞準確性:
- 加載自定義詞典
- 使用正則表達式
使用jieba自定義詞典 + 正則表達式準確分詞
在代碼的同級目錄下創建詞典(txt文件):
創建輸入文本 text.txt:
惡性腫瘤的分期越高,患者預后越差。通過對腫瘤不同惡性程度的劃分,TNM分期在預測預后方面不斷完善。 但是有國外研究發現,部分結腸癌的預后并不能完全按照一般的分期階梯進行預測。 TNM分期不太能明確地區分||期和III期結腸癌患者的預后ii期,特別是在接受輔助化療的患者中,他們的5年總生存期在50.1%-9.8%。 此外已知影響結腸癌生存的患者或疾病特征,包括年齡、性別、原發疾病位置、腫瘤分級、陽性淋巴結數目(LNs)、接受檢查的 LNs數目、淋巴管和周圍神經浸潤、腸道梗阻或穿孔、以及輔助治療(氟尿嘧啶單藥或聯合奧沙利鉑),并未直接納入TNM分期系統。 在多變量模型中,分子標記的微衛星不穩定性(MSI)和BRAF或KRAS基因突變聯合詳細的臨床病理學詮釋可以多大程度改善預后評估 目前尚不清楚。近期,發表在Annals of oncology雜志上的一項回顧性研究,在TNM分期系統基礎上聯合匯集的標志物對II期和III期 結腸癌總生存期進行預測。 研究人員將缺失隨機數據插補后,利用3期輔助化療試驗(n=3016)—N0147(NCT00079274)和PETACC3(NCT00026273)—產生的患者亞組 聚集構建了一個5年總生存期多變量Cox模型,隨后在剩余的臨床試驗樣本(n=1499)中進行內部驗證,并且還在不同人群隊列中外部分析, 包括接受化療(n=949)或者未接受化療(n=1080)的結腸癌患者,以及沒有治療注釋患者。 研究分析發現: 在根據臨床試驗隊列和觀察性研究做出的多變量模型中,TMN分期,MSI和BRAFV600E基因突變狀態仍然是獨立預后因素。 單純TNM模型的一致性指數(Concordance-indices)為0.61-0.68,而增加分子標記物、臨床病理特征和所有協變量后的 一致性指數分別增加至0.63-0.71、0.65-0.73和0.66-0.74。 在有完整注釋的驗證隊列中,單獨TNM的綜合時間依賴AUC值為0.64,納入臨床病理特征聯合或不聯合分子標記物的AUC增加為0.67。 在接受輔助化療的患者隊列中,通過TNM、臨床病理特征和分子標記物的方差(R2)相對比例平均值分別為65%、25%和10%。 因此,將MSI、BRAFV600E和KRAS基因突變狀態納入TNM分期系統的總生存期模型可以提高精確預測II期和III期結腸癌患者的能力, 而且包括臨床病理特征的多變量模型中會增加預測準確性,特別是需要接受化療的患者。代碼:
# -*- coding=utf8 -*- import jieba import rejieba.load_userdict("dict.txt")# 合并兩個list def merge_two_list(a, b):c = []len_a, len_b = len(a), len(b)minlen = min(len_a, len_b)for i in range(minlen):c.append(a[i])c.append(b[i])if len_a > len_b:for i in range(minlen, len_a):c.append(a[i])else:for i in range(minlen, len_b):c.append(b[i])return cif __name__ == "__main__":# open the input file which contains a short passage and the output file which will store the outputfp = open("text.txt", "r", encoding="utf8")fout = open("result_cut.txt", "w", encoding="utf8")# “?:”表示非獲取匹配,匹配冒號后的內容但不獲取匹配結果,不進行存儲供以后使用。# u/U:表示unicode字符串# r/R:非轉義的原始字符串regex1 = u'(?:[^\u4e00-\u9fa5()*&……%¥$,,。.@! !]){1,5}期' # 匹配“ii期”形式的字符串regex2 = r'(?:[0-9]{1,3}[.]?[0-9]{1,3})%' # 匹配“30.00%”形式的字符串; “[.]?”表示非貪婪匹配p1 = re.compile(regex1)p2 = re.compile(regex2)for line in fp.readlines():# 思路:先使用正則表達式找出目標字符串,儲存到變量result1中,然后將line中匹配的字符串# 替換為"FLAG1",使用jieba / hanlp分詞,最后將分詞結果和result1 合并在一起result1 = p1.findall(line) # 返回一個listif result1:regex_re1 = result1line = p1.sub("FLAG1", line) # 使用 "FLAG1"替換line中匹配的子串result2 = p2.findall(line)if result2:line = p2.sub("FLAG2", line)# 使用jieba分詞words = jieba.cut(line) # 返回的是一個生成器# 將jieba分詞結果串成字符串result = " ".join(words)if "FLAG1" in result:result = result.split("FLAG1") # result又變回list類型,注意這里是用FLAG1作為分隔符,所以最后能保證分詞后的順序和原文順序一樣result = merge_two_list(result, result1) # 此為自定義函數result = "".join(result)if "FLAG2" in result:result = result.split("FLAG2")result = merge_two_list(result, result2)result = "".join(result)# print(result)fout.write(result)fout.close()輸出的txt文件的內容為:
惡性腫瘤 的 分期 越高 , 患者 預后 越差 。 通過 對 腫瘤 不同 惡性 程度 的 劃分 , TNM 分期 在 預測 預后 方面 不斷完善 。 但是 有 國外 研究 發現 , 部分 結腸癌 的 預后 并 不能 完全 按照 一般 的 分期 階梯 進行 預測 。 TNM 分期 不太能 明確 地區 分 ||期 和 III期 結腸癌 患者 的 預后 ii期 , 特別 是 在 接受 輔助 化療 的 患者 中 , 他們 的 5 年 總 生存期 在 50.1% - 9.8% 。 此外 已知 影響 結腸癌 生存 的 患者 或 疾病 特征 , 包括 年齡 、 性別 、 原發 疾病 位置 、 腫瘤 分級 、 陽性 淋巴結 數目 ( LNs ) 、 接受 檢查 的 LNs 數目 、 淋巴管 和 周圍神經 浸潤 、 腸道 梗阻 或 穿孔 、 以及 輔助 治療 ( 氟尿嘧啶單藥 或 聯合 奧沙利鉑 ) , 并未 直接 納入 TNM 分期 系統 。 在 多 變量 模型 中 , 分子 標記 的 微衛星 不穩定性 ( MSI ) 和 BRAF 或 KRAS 基因突變 聯合 詳細 的 臨床 病理學 詮釋 可以 多 大程度 改善 預后 評估 目前 尚 不 清楚 。 近期 , 發表 在 Annals of oncology 雜志 上 的 一項 回顧性 研究 , 在 TNM 分期 系統 基礎 上 聯合 匯集 的 標志物 對 II期 和 III期 結腸癌 總 生存期 進行 預測 。 研究 人員 將 缺失 隨機 數據 插補后 , 利用 3期 輔助 化療 試驗 ( n = 3016 ) — N0147 ( NCT00079274 ) 和 PETACC3 ( NCT00026273 ) — 產生 的 患者 亞組 聚集 構建 了 一個 5 年 總 生存期 多 變量 Cox 模型 , 隨后 在 剩余 的 臨床試驗 樣本 ( n = 1499 ) 中 進行 內部 驗證 , 并且 還 在 不同 人群 隊列 中 外部 分析 , 包括 接受 化療 ( n = 949 ) 或者 未 接受 化療 ( n = 1080 ) 的 結腸癌 患者 , 以及 沒有 治療 注釋 患者 。 研究 分析 發現 : 在 根據 臨床試驗 隊列 和 觀察 性 研究 做出 的 多 變量 模型 中 , TMN 分期 , MSI 和 BRAFV600E 基因突變 狀態 仍然 是 獨立 預后 因素 。 單純 TNM 模型 的 一致性 指數 ( Concordance - indices ) 為 0.61 - 0.68 , 而 增加 分子 標記 物 、 臨床 病理 特征 和 所有 協 變量 后 的 一致性 指數 分別 增加 至 0.63 - 0.71 、 0.65 - 0.73 和 0.66 - 0.74 。 在 有 完整 注釋 的 驗證 隊列 中 , 單獨 TNM 的 綜合 時間 依賴 AUC 值為 0.64 , 納入 臨床 病理 特征 聯合 或 不 聯合 分子 標記 物 的 AUC 增加 為 0.67 。 在 接受 輔助 化療 的 患者 隊列 中 , 通過 TNM 、 臨床 病理 特征 和 分子 標記 物 的 方差 ( R2 ) 相對 比例 平均值 分別 為 65% 、 25% 和 10% 。 因此 , 將 MSI 、 BRAFV600E 和 KRAS 基因突變 狀態 納入 TNM 分期 系統 的 總 生存期 模型 可以 提高 精確 預測 II期 和 III期 結腸癌 患者 的 能力 , 而且 包括 臨床 病理 特征 的 多 變量 模型 中 會 增加 預測 準確性 , 特別 是 需要 接受 化療 的 患者 。1.2 準確分詞 level2
有時候,即使加載了自定義詞典,程序也不一定會按照詞典來切分,這時候就需要調整詞頻了
例子:
首先創建詞典 dict.txt:
寫代碼代碼:
import jieba import re# 對dict.txt中的每個詞都調整詞頻 [jieba.suggest_freq(line.strip(), tune=True) for line in open("dict.txt",'r',encoding='utf8')]if __name__=="__main__":string = "臺中正確應該不會被切開。"words=jieba.cut(string)result = " ".join(words)print(result)沒有第五行代碼時的輸出:
臺 中 正確 應該 不會 被 切開 。有第五行代碼:
臺中 正確 應該 不會 被 切開 。emmm 有筒子可能看不懂第五行代碼,提供一個簡單版本:
fp=open("dict.txt",'r',encoding='utf8') for line in fp:line=line.strip()jieba.suggest_freq(line, tune=True)1.3 詞性標注
hanlp的分詞結果包含詞性,每個詞性的意思請查閱:http://www.hankcs.com/nlp/part-of-speech-tagging.html#h2-8
例子:
注意第四行代碼需要換成你自己的hanlp文件夾路徑
output:
<class 'jpype._jclass.java.util.ArrayList'> <class 'jpype._jclass.com.hankcs.hanlp.seg.common.Term'> [浮世/nz, 萬千/m, ,/w, 吾愛/nz, 有/vyou, 三/m, 。/w, 日/b, ,/w, 月/n, 與/cc, 卿/ng, 。/w, 日/b, 為/p, 朝/tg, ,/w, 月/n, 為/p, 暮/tg, ,/w, 卿為/nr, 朝朝暮暮/nz, 。/w]可以用[(word_pos_item.toString().split('/')[0], word_pos_item.toString().split('/')[1]) for word_pos_item in Tokenizer.segment(sentence)]來對分詞結果進行轉化,變成一個list,每個元素為一個tuple,tuple的一個元素為單詞(字符串格式),第二個元素為詞性(字符串格式)。
有了上面的詞性標注,就可以根據詞性進行特定的篩選了
1.4 關鍵詞提取
比較常用的算法有:TF-IDF算法,Text-Rank算法,主題模型算法(包括LSA,LSI,LDA等)
可以使用jieba中的textrank函數:
def textrank(self, sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'), withFlag=False):"""Extract keywords from sentence using TextRank algorithm.Parameter:- topK: return how many top keywords. `None` for all possible words.- withWeight: if True, return a list of (word, weight);if False, return a list of words.- allowPOS: the allowed POS list eg. ['ns', 'n', 'vn', 'v'].if the POS of w is not in this list, it will be filtered.- withFlag: if True, return a list of pair(word, weight) like posseg.cutif False, return a list of words"""使用示例:
# -*- coding=utf8 -*- from jieba import analyse# 原始文本 text = '揭秘謝亞龍被帶走:總局電話騙局 復制南楊軌跡體壇周報特約記者張銳北京報道\xa0 謝亞龍已經被' \'公安部門正式宣布“立案偵查”,但謝亞龍等人是哪一天被遼寧警方帶走的?又是如何被帶走的?外界' \'有著很多種版本。但來自內部的消息顯示,謝亞龍等人被帶走,其實是與南、楊被帶走時如出一轍。' \'9月3日(周五)下午4點左右,謝亞龍在中體產業辦公室里接到了一個電話。這個電話來自于國家體育總' \'局,要求他趕往總局參加一個會議,至于會議內容并沒有說明。對下屬打了一聲招呼之后,謝亞龍便' \'出了門。到了總局之后,謝才了解到“會議的內容”——遼寧警方在等待著他。沒有任何預兆,謝亞龍被' \'警方帶到了沈陽。這樣的方式,與年初南楊二人被帶走如出一轍。當時,南楊也是接到總局領導的電' \'話,要求連夜去參加一個緊急會議,一到總局便被遼寧警方帶走。換而言之,警方帶走謝亞龍等人,' \'總局領導事先是知情的。而中體產業則并不知情,他們起初接到的信息謝亞龍僅僅只是去總局開會。' \'所以,中體產業沒有在第一時間發出謝亞龍協助調查的通告,后來在證監會的要求下才被動發出。外' \'界一直猜測謝亞龍是協查還是自己有事,直到12日上午才有了答案,公安部網站“治安新聞”中出現《' \'警方證實謝亞龍等被立案偵查》一文:“在偵辦涉嫌利用足球比賽賄賂、賭博系列案件中,公安、檢察' \'機關多渠道獲取對原中國足協副主席謝亞龍、原中國足協裁判委員會主任李冬生、原國家足球隊領隊' \'蔚少輝等人涉案的線索和舉報。在國家體育總局的配合下,專案組已依法對謝亞龍、李冬生、蔚少輝' \'立案偵查。”當天中午央視新聞頻道的新聞節目中,也報道了謝亞龍等人被立案偵查的消息。下午5點' \'左右,各門戶網站刊發了中國足協的聲明:“公安機關依法對謝亞龍、李冬生、蔚少輝立案偵查,這' \'是徹底整肅足壇、依法打擊足球假、賭、黑治理行動的繼續。足管中心堅決貫徹落實總局‘治理足球' \'假、賭、黑違法犯罪行為,堅決懲治腐敗,整頓足壇,堅決支持配合公安部門依法打擊足球假、賭、' \'黑違法犯罪行為,絕不姑息’的要求,做好自身工作。”距謝亞龍等人被警方帶走,已經有10天。根據' \'相關的法律,第14天(也就是9月16日)將會是一個“坎”,因為如果問題嚴重,在證據確鑿的情況下,' \'“立案偵查”將有可能演變為“正式逮捕”。' print("\nkeywords by textrank:") # 基于TextRank算法進行關鍵詞抽取keywords = analyse.textrank(text, topK=10, withWeight=True, allowPOS=('ns', 'n'))# 輸出抽取出的關鍵詞 words = [keyword for keyword, w in keywords if w > 0.2] print(' '.join(words) + "\n")輸出:
keywords by textrank: 總局 警方 立案偵查 依法 公安 電話 產業 遼寧 會議 中體總結
以上是生活随笔為你收集整理的NLP学习笔记 01 分词、词性标注和关键词提取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机色颜色有几种,电脑显示器怎么选?1
- 下一篇: 罗技c930e摄像头描述符