MATLAB小應用:中文、英文詞頻統計

1、英文詞頻統計

英文詞頻統計很簡單,只需藉助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

2、中文詞頻統計

中文詞頻統計相對複雜一些。關鍵在於:網站

  • 使用合適的語料庫
  • 從長到短,匹配詞語。好比句中出現了「計算機」三字詞,咱們應該將三個字視爲一個詞,而不能把「計算」當作一個詞。
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

詞頻統計結果

相關文章
相關標籤/搜索