设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1800|回复: 0

MATLAB小应用:中文、英文词频统计

[复制链接]

19

主题

162

金钱

253

积分

入门用户

发表于 2019-8-9 15:03:40 | 显示全部楼层 |阅读模式

一、英文词频统计
英文词频统计很简单,只需借助split断句,再统计即可。

完整MATLAB代码:
  1. function wordcount
  2. %思路:中文词频统计涉及到对“词语”的判断,需要导入词典或编写判断规则,很复杂。
  3. %最简单的办法是直接统计英文词频,并由空格直接划分词语。然后再翻译即可得到中文词频。

  4. %从官方网站上下载的pdf,转成reportfulltext.txt,存到workspace进行操作 全文共25003个字符。

  5. clc;
  6. clear;
  7. report=fileread('reportfulltext.txt'); %读入全文
  8. report=regexprep(report,'\W',' '); %不是字符的,都转换为空格。主要是去除标点符号
  9. report=lower(report); %变成小写
  10. words=regexp(report,' ','split')'; %根据空格分隔为单词cell

  11. %至此每个单词都拿出来了

  12. rank = tabulate(words); %rank是三列向量,包括名称,出现次数和百分比
  13. ans=sortrows(rank,-2); %只根据第二列进行排序 -2表示降序

  14. xlswrite('results',ans);%输出为excel文件
  15. end
复制代码



二、中文词频统计
中文词频统计相对复杂一些。关键在于:
      使用合适的语料库
      从长到短,匹配词语。比如句中出现了“计算机”三字词,我们应该将三个字视为一个词,而不能把“计算”当做一个词。

  1. function wordcountchinese
  2. clc;
  3. clear;
  4. report=fileread('reportchinese.txt'); %读入中文报告,事先已放在工作区

  5. %% dictionary.mat是一个我事先准备好的列向量
  6. %其中dict是14636*1的字典列向量,从网上下载的官方语料库转换得到的
  7. load dictionary.mat;
  8. Maxlen=max(cellfun(@length,dict)); %最大词长,结果是10

  9. %% 按标点初步分词
  10. cut='[\,\。\、\;\:\!\?\“\”\‘\’\(\)\《\》\<\>\……\·]'; %标点符号的正则表达式
  11. F=regexp(report,cut,'split')'; %转置,变成3131*1的列向量

  12. % 此时,待分析的句集F和词典都已就绪

  13. %% 算法原理
  14. % 首先判断是否为有效句:句长是否大于0。小于0的不操作,相当于跳过
  15. % 若是有效句,计算句长和最大词长Maxlen的最小值maxlen。待选字串长度不能大于该长度
  16. % 从maxlen长度开始,取出待选字串
  17. % 匹配,成功就输出,标记。若成功,平移maxlen个单位;若不成功,平移1个单位
  18. % 选出下一个待选字串再匹配,重复操作,直到移动到句长以外
  19. % 如果上一个长度匹配成功,那么就不用再匹配了,该句跳过;如果meet==0,重复上一步操作
  20. % 长度maxlen减到1,也要匹配,因为词库中有一个字的词;maxlen==0是终止信号。

  21. %% 最大匹配法进一步分词
  22. sentence=[]; %是粗分后F中的每一个元素
  23. word=[];
  24. words={};
  25. k=1;

  26. for i=1:length(F) %遍历F
  27.     sentence=cell2mat(F(i,1)); %把cell转换成字符串
  28.     sentence_len=length(sentence); %求出句长
  29.     meet=0; %更新初始状态
  30.    
  31.     if(sentence_len>0) %有效句
  32.         maxlen=min(Maxlen,sentence_len);
  33.         while(maxlen>0)
  34.             start=1;
  35.             while((start+maxlen)<=sentence_len)  %索引不能移动到句子外面
  36.                 word=sentence(start:start+maxlen);
  37.                 if(ismember(word,dict))%如果匹配成功
  38.                     meet=1;
  39.                     words(k)=cellstr(word);
  40.                     k=k+1;
  41.                     start=start+maxlen; %移动maxlen个单位再匹配
  42.                 else
  43.                     start=start+1; %移动一个单位再匹配
  44.                 end
  45.             end
  46.             %已经移动到句子外面了
  47.             if(meet==0)
  48.                 maxlen=maxlen-1;
  49.             else
  50.                 break;
  51.             end
  52.         end
  53.     end
  54.     %无效句,句长为0,不处理,直接跳过
  55. end

  56. %% 排序处理
  57. rank = tabulate(words); %rank是三列向量,包括名称,出现次数和百分比
  58. ANS=sortrows(rank,-2); %只根据第二列进行排序 -2表示降序

  59. xlswrite('resultschinese',ANS(1:50,1:3));%输出为excel文件 由于词语将近1777个,因此只输出前100个
  60. end
复制代码


十九大中文版报告统计结果:
1.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表