英文詞頻統計很簡單,只需藉助split斷句,再統計便可。正則表達式
完整MATLAB代碼:算法
function wordcount %思路:中文詞頻統計涉及到對「詞語」的判斷,須要導入詞典或編寫判斷規則,很複雜。 %最簡單的辦法是直接統計英文詞頻,並由空格直接劃分詞語。而後再翻譯便可獲得中文詞頻。 %從官方網站上下載的pdf,轉成reportfulltext.txt,存到workspace進行操做 全文共25003個字符。 clc; clear; report=fileread('reportfulltext.txt'); %讀入全文 report=regexprep(report,'\W',' '); %不是字符的,都轉換爲空格。主要是去除標點符號 report=lower(report); %變成小寫 words=regexp(report,' ','split')'; %根據空格分隔爲單詞cell %至此每一個單詞都拿出來了 rank = tabulate(words); %rank是三列向量,包括名稱,出現次數和百分比 ans=sortrows(rank,-2); %只根據第二列進行排序 -2表示降序 xlswrite('results',ans);%輸出爲excel文件 end
中文詞頻統計相對複雜一些。關鍵在於:網站
function wordcountchinese clc; clear; report=fileread('reportchinese.txt'); %讀入中文報告,事先已放在工做區 %% dictionary.mat是一個我事先準備好的列向量 %其中dict是14636*1的字典列向量,從網上下載的官方語料庫轉換獲得的 load dictionary.mat; Maxlen=max(cellfun(@length,dict)); %最大詞長,結果是10 %% 按標點初步分詞 cut='[\,\。\、\;\:\!\?\「\」\‘\’\(\)\《\》\<\>\……\·]'; %標點符號的正則表達式 F=regexp(report,cut,'split')'; %轉置,變成3131*1的列向量 % 此時,待分析的句集F和詞典都已就緒 %% 算法原理 % 首先判斷是否爲有效句:句長是否大於0。小於0的不操做,至關於跳過 % 如果有效句,計算句長和最大詞長Maxlen的最小值maxlen。待選字串長度不能大於該長度 % 從maxlen長度開始,取出待選字串 % 匹配,成功就輸出,標記。若成功,平移maxlen個單位;若不成功,平移1個單位 % 選出下一個待選字串再匹配,重複操做,直到移動到句長之外 % 若是上一個長度匹配成功,那麼就不用再匹配了,該句跳過;若是meet==0,重複上一步操做 % 長度maxlen減到1,也要匹配,由於詞庫中有一個字的詞;maxlen==0是終止信號。 %% 最大匹配法進一步分詞 sentence=[]; %是粗分後F中的每個元素 word=[]; words={}; k=1; for i=1:length(F) %遍歷F sentence=cell2mat(F(i,1)); %把cell轉換成字符串 sentence_len=length(sentence); %求出句長 meet=0; %更新初始狀態 if(sentence_len>0) %有效句 maxlen=min(Maxlen,sentence_len); while(maxlen>0) start=1; while((start+maxlen)<=sentence_len) %索引不能移動到句子外面 word=sentence(start:start+maxlen); if(ismember(word,dict))%若是匹配成功 meet=1; words(k)=cellstr(word); k=k+1; start=start+maxlen; %移動maxlen個單位再匹配 else start=start+1; %移動一個單位再匹配 end end %已經移動到句子外面了 if(meet==0) maxlen=maxlen-1; else break; end end end %無效句,句長爲0,不處理,直接跳過 end %% 排序處理 rank = tabulate(words); %rank是三列向量,包括名稱,出現次數和百分比 ANS=sortrows(rank,-2); %只根據第二列進行排序 -2表示降序 xlswrite('resultschinese',ANS(1:50,1:3));%輸出爲excel文件 因爲詞語將近1777個,所以只輸出前100個 end
十九大中文版報告統計結果:spa