在上一篇文章介紹了文本表示《NLP之文本表示》https://blog.csdn.net/Prepare...python
可是沒有代碼。在這篇博客中,咱們在實踐一下!git
中文分詞經常使用模型:Jieba
模型、百度的LAC模型,這裏使用 Jieba
模型進行中文分詞。github
數據集使用:人民日報1946年05月的數據。數據集地址:https://github.com/fangj/rmrb/tree/master/example/1946年05月數組
Jieba
模型:搜索引擎
Jieba
基本上目前最好的 Python 中文分詞組件,它主要有如下 3 種特性:spa
支持 3 種分詞模式:.net
第一步:讀取全部文件,造成數據集corpus
code
def getCorpus(self, rootDir): corpus = [] r1 = u'[a-zA-Z0-9’!"#$%&\'()*+,-./::;<=>?@,。?★、…【】《》?「」‘’![\\]^_`{|}~]+' # 用戶也能夠在此進行自定義過濾字符 for file in os.listdir(rootDir): path = os.path.join(rootDir, file) if os.path.isfile(path): # 打印文件地址 #print(os.path.abspath(path)) # 獲取文章內容,fromfile主要用來處理數組 pass # filecontext = np.fromfile(os.path.abspath(path)) with open(os.path.abspath(path), "r", encoding='utf-8') as file: filecontext = file.read(); #print(filecontext) # 分詞 去掉符號 filecontext = re.sub(r1, '', filecontext) filecontext = filecontext.replace("\n", '') filecontext = filecontext.replace(" ", '') seg_list = jieba.lcut_for_search(filecontext) corpus += seg_list #print(seg_list) #print("[精確模式]:" + "/".join(seg_list)) elif os.path.isdir(path): TraversalFun.AllFiles(self, path) return corpus
一、循環讀取文件夾下的文件;blog
二、使用numpy
讀取文件獲取文件內容;排序
三、去掉特殊符號,獲取中文內容;
四、使用Jieba
分詞進行分詞,你們能夠嘗試各類方式。
第二步:計算信息熵
信息熵的公式:
#構造詞典,統計每一個詞的頻率,並計算信息熵 def calc_tf(corpus): # 統計每一個詞出現的頻率 word_freq_dict = dict() for word in corpus: if word not in word_freq_dict: word_freq_dict[word] = 1 word_freq_dict[word] += 1 # 將這個詞典中的詞,按照出現次數排序,出現次數越高,排序越靠前 word_freq_dict = sorted(word_freq_dict.items(), key=lambda x:x[1], reverse=True) # 計算TF機率 word_tf = dict() # 信息熵 shannoEnt = 0.0 # 按照頻率,從高到低,開始遍歷,並未每一個詞構造一個id for word, freq in word_freq_dict: # 計算p(xi) prob = freq / len(corpus) word_tf[word] = prob shannoEnt -= prob*log(prob, 2) return word_tf, shannoEnt
思路:
一、循環,計算每一個詞的頻率,循環一個詞,若是有則加1,沒有則等於1
二、計算信息熵:按照公式循環計算信息熵。
結果:
數據集大小,size: 163039信息熵:14.047837802885464
你們快動手嘗試一下吧
前路遙遙,你們加油~ 公衆號【prepared】
Jieba
模型:https://github.com/fxsjy/jieba