HMM(Hidden Markov Model,隱馬爾可夫模型) CRF(Conditional Random Field,條件隨機場),
RNN深度學習算法(Recurrent Neural Networks,循環神經網絡)。輸入條件連續 LSTM(Long Short Term Memory)則繞開了這些問題依然可以從語料中學習到長期依賴關系,輸入條件不連續是用, 核心是實現了 dL(t)dh(t)和 dL(t+1)ds(t)反向遞歸計算。
sigmoid函數,該函數輸出0到1之間的值
NLTK和jieba這兩個python的自然語言包,前者,我主要是對分詞后的數據進行分析; 而后者,我主要用於對文章進行分詞!
part.1 包的安裝
pip install nltk pip install jieba
一條文本分析的漫漫長路就此開始!
part.2 怎么使用
從這里開始,我根據着自己寫的類來對這兩個包進行一些簡單的講解。
2.1 引用
# coding=utf-8 # -*- coding: cp936 -*- import jieba import jieba.posseg as pseg import codecs import re import os import time import string from nltk.probability import FreqDist open=codecs.open
2.2 自定義詞典和停用詞的引入
自定義詞典是我們在分詞的時候避免把我們需要的詞組分成小詞而導入的,而停用詞,則是我們在分詞過程中,將對我們分詞過程中的干擾詞排除在外的詞典。
#jieba 分詞可以將我們的自定義詞典導入,格式 “詞” “詞性” “詞頻” jieba.load_userdict('data/userdict.txt')
#定義一個keyword類 class keyword(object): def Chinese_Stopwords(self): #導入停用詞庫 stopword=[] cfp=open('data/stopWord.txt','r+','utf-8') #停用詞的txt文件 for line in cfp: for word in line.split(): stopword.append(word) cfp.close() return stopword
2.3 分詞和挑選
先來講講分詞,分詞可以說是中文文章分析的第一步,中文不像英文,每個單詞之間有空格隔開,我們首先需要對文章進行分詞,也就是把長長的文本切割成單個的詞,而后才能對這些詞進行后續的操作。
def Word_cut_list(self,word_str): #利用正則表達式去掉一些一些標點符號之類的符號。 word_str = re.sub(r'\s+', ' ', word_str) # trans 多空格 to空格 word_str = re.sub(r'\n+', ' ', word_str) # trans 換行 to空格 word_str = re.sub(r'\t+', ' ', word_str) # trans Tab to空格 word_str = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——;!,”。《》,。:“?、~@#¥%……&*()1234567①②③④)]+".\ decode("utf8"), "".decode("utf8"), word_str)
wordlist = list(jieba.cut(word_str))#jieba.cut 把字符串切割成詞並添加至一個列表 wordlist_N = [] chinese_stopwords=self.Chinese_Stopwords() for word in wordlist: if word not in chinese_stopwords:#詞語的清洗:去停用詞 if word != '\r\n' and word!=' ' and word != '\u3000'.decode('unicode_escape') \ and word!='\xa0'.decode('unicode_escape'):#詞語的清洗:去全角空格 wordlist_N.append(word) return wordlist_N
什么叫挑選呢? 其實在我們進行中文文本的分析時,不是每個詞都有用的。那什么樣的詞就能表述出文章意思呢? 比如:名詞! 那怎么把名詞提取出來呢?👇👇👇👇👇
def Word_pseg(self,word_str): # 名詞提取函數 words = pseg.cut(word_str) word_list = [] for wds in words: # 篩選自定義詞典中的詞,和各類名詞,自定義詞庫的詞在沒設置詞性的情況下默認為x詞性,即詞的flag詞性為x if wds.flag == 'x' and wds.word != ' ' and wds.word != 'ns' \ or re.match(r'^n', wds.flag) != None \ and re.match(r'^nr', wds.flag) == None: word_list.append(wds.word) return word_list
2.4 排序和運行
先前,我們對分詞和分詞后的挑選進行了一定的分析了解,那么怎么把我們得到的這個此列表進行分析呢?簡單的就是先統計詞頻,這樣一分析,有詞頻,我們自然而然就想到了排序。
def sort_item(self,item):#排序函數,正序排序 vocab=[] for k,v in item: vocab.append((k,v)) List=list(sorted(vocab,key=lambda v:v[1],reverse=1)) return List
def Run(self): Apage=open(self.filename,'r+','utf-8') Word=Apage.read() #先讀取整篇文章 Wordp=self.Word_pseg(Word) #對整篇文章進行詞性的挑選 New_str=''.join(Wordp) Wordlist=self.Word_cut_list(New_str) #對挑選后的文章進行分詞 Apage.close() return Wordlist
def __init__(self, filename): self.filename = filename
2.5 main函數的讀取分析
看了那么多,我們還沒用到nltk這個包,那么在這里,我們就要開始使用這個包了! 在這里我主要是對文件夾里的一些文件進行分析,然后對每篇文件的關鍵詞進行統計了。也就是簡單的詞頻統計排序,輸出。 最初我的想法,我只輸出前10個關鍵詞,但是在我經過多次實驗后,我覺得固定數目的關鍵詞,對我們的研究很是偏頗,那么我就使用百分比來輸出關鍵詞。
if __name__=='__main__': b_path = 'data/all' a_path = 'data/Result' roots = os.listdir(b_path) alltime_s = time.time() for filename in roots: starttime = time.time() kw = keyword(b_path + '/' + filename) wl = kw.Run() fdist = FreqDist(wl) Sum = len(wl) pre = 0 fn = open(a_path + '/' + filename, 'w+', 'utf-8') fn.write('sum:' + str(Sum) + '\r\n') for (s, n) in kw.sort_item(fdist.items()): fn.write(s + str(float(n) / Sum)+" " +str(n)+ '\r\n') pre = pre + float(n) / Sum if pre > 0.5: fn.write(str(pre)) fn.close() break endtime = time.time() print filename + ' 完成時間:' + str(endtime - starttime)
print "總用時:" + str(time.time() - alltime_s)