http://www.tuicool.com/articles/qmMba2  
1 using System;
2 using System.IO;
3 using System.Collections.Generic;
4
5 namespace Skyiv.Utils
6 {
7 // 对中文文本进行统计分析,主要统计其中常用字和次常用字的占比。
8 sealed class ChineseCounter
9 {
10 static readonly string Skiped =
11 "" +
12 " 、,。.·?!:;…-─~—_|丨Ⅰ∶※★●℃°“”‘’《》[]〔〕()<>〈〉【】〖〗□" +
13 "㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩①②③④⑤⑥⑦⑧⑨⑩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇" +
14 "ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒚⒛" +
15 "1234567890=+-×÷/%ⅢⅡ≈⊥′āáǎàéěèōóǒü" + // ○
16 " 1234567890=+-*/%{}[]()<>?!@#$^&_:;',.`~|\"\\" +
17 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
18 "abcdefghijklmnopqrstuvwxyz" +
19 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
20 static readonly string Group = "ABCT"; // A:常用字 B:次常用字 C:其他 T:合计
21 static readonly HashSet<char> A, B; // A:常用字(2500字) B:次常用字(1000字)
22
23 Dictionary<char, int> charCount = new Dictionary<char, int>();
24
25 static ChineseCounter()
26 {
27 A = new HashSet<char>(new RandomChinese(RandomChinese.Source.From2500).GetSource());
28 B = new HashSet<char>(new RandomChinese(RandomChinese.Source.From3500).GetSource());
29 B.ExceptWith(A); // 次常用字(1000字) = 现代汉语常用字(3500字) - 常用字(2500字)
30 }
31
32 // 读取中文文本的内容,计算每个汉字出现的次数
33 void Read(string fileName)
34 {
35 foreach (var line in File.ReadLines(fileName))
36 foreach (var c in line)
37 {
38 int count;
39 charCount.TryGetValue(c, out count);
40 charCount[c] = count + 1;
41 }
42 }
43
44 // 计算统计资料中常用字和次常用字出现的次数
45 int[,] GetGroups()
46 {
47 var groups = new int[4, 2]; // 0:常用字 1:次常用字 2:其他 3:合计, 0:Distinct 1:Count
48 foreach (var kvp in charCount)
49 {
50 var k = GetGroupIndex(kvp.Key);
51 groups[k, 0]++;
52 groups[3, 0]++;
53 groups[k, 1] += kvp.Value;
54 groups[3, 1] += kvp.Value;
55 }
56 return groups;
57 }
58
59 // 将统计资料中的汉字按其出现的次数降序排序
60 Tuple<int, char>[] GetItems()
61 {
62 var items = new Tuple<int, char>[charCount.Count]; // Item1:count Item2:char
63 var i = 0;
64 foreach (var kvp in charCount) items[i++] = Tuple.Create(-kvp.Value, kvp.Key);
65 Array.Sort(items);
66 return items;
67 }
68
69 // 报告统计资料中常用字和次常用字的占比等分析数据
70 void Report(int[,] groups)
71 {
72 for (var i = 0; i < groups.GetLength(0); i++)
73 Console.WriteLine("{5}: {0,10:N0} {1,7:P} | {2,5:N0} {3,7:P} | {4,7:F2}",
74 groups[i, 1], groups[i, 1] / (double)groups[3, 1],
75 groups[i, 0], groups[i, 0] / (double)groups[3, 0],
76 groups[i, 1] / (double)groups[i, 0], Group[i]);
77 Console.WriteLine();
78 }
79
80 // 报告没有在统计资料中出现的常用字和次常用字
81 void Report(HashSet<char> set, int idx)
82 {
83 var set2 = new HashSet<char>(set);
84 set2.ExceptWith(charCount.Keys);
85 Console.Write("({0}:{1}) ", Group[idx], set2.Count);
86 foreach (var c in set2) Console.Write(c);
87 Console.WriteLine();
88 }
89
90 // 报告统计资料中每个的汉字的出现次数(降序)及占比
91 void Report(Tuple<int, char>[] items, double total)
92 {
93 Console.WriteLine();
94 for (int sum = 0, i = 0; i < items.Length; i++)
95 Console.WriteLine("{0}: {1,7:N0} [{2}] {3,6:P} {4,7:P} {5,5:N0}",
96 Group[GetGroupIndex(items[i].Item2)], -items[i].Item1, items[i].Item2,
97 -items[i].Item1 / total, (sum += -items[i].Item1) / total, i + 1);
98 Console.WriteLine("End");
99 }
100
101 // 将汉字分配到以下三组中: 0:常用字 1:次常用字 2:其他汉字
102 int GetGroupIndex(char c)
103 {
104 return (A.Contains(c)) ? 0 : (B.Contains(c)) ? 1 : 2;
105 }
106
107 void Run(string[] fileNames)
108 {
109 foreach (var fileName in fileNames) Read(fileName);
110 foreach (var c in Skiped) charCount.Remove(c);
111 var groups = GetGroups();
112 Report(groups); // 报告统计资料中常用字和次常用字的占比
113 Report(A, 0); // 报告没有在统计资料中出现的常用字
114 Report(B, 1); // 报告没有在统计资料中出现的次常用字
115 Report(GetItems(), groups[3, 1]); // groups[3, 1]: 总字数
116 }
117
118 static void Main(string[] args)
119 {
120 new ChineseCounter().Run(args);
121 }
122 }
123 }

ChineseCounter.cs 统计中文文本中常用字占比的更多相关文章

  1. python统计一个文本中重复行数的方法

    python统计一个文本中重复行数的方法 这篇文章主要介绍了python统计一个文本中重复行数的方法,涉及针对Python中dict对象的使用及相关本文的操作,具有一定的借鉴价值,需要的朋友可以参考下 ...

  2. python统计英文文本中的回文单词数

    1. 要求: 给定一篇纯英文的文本,统计其中回文单词的比列,并输出其中的回文单词,文本数据如下: This is Everyday Grammar. I am Madam Lucija And I a ...

  3. Pig + Ansj 统计中文文本词频

    最近特别喜欢用Pig,拥有能满足大部分需求的内置函数(built-in functions),支持自定义函数(user defined functions, UDF),能load 纯文本.avro等格 ...

  4. C#统计英文文本中的单词数并排序

    思路如下:1.使用的Hashtable(高效)集合,记录每个单词出现的次数2.采用ArrayList对Hashtable中的Keys按字母序排列3.排序使用插入排序(稳定) public void S ...

  5. HDU_2030——统计文本中汉字的个数

    Problem Description 统计给定文本文件中汉字的个数.   Input 输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本.   Output 对于每一段文本,输出其中的汉 ...

  6. IOS 正则表达式匹配文本中URL位置并获取URL所在位置(解决连接中文问题)

    需求很简单,是从一段文本中匹配出其中的超链接.基本的做法就是用正则表达式去匹配.但是有这样一个问题. 网上大部分的识别URL的正则表达式url末尾有空格的情况下可以正确识别.比如这样的情况. 我是一段 ...

  7. shell统计文本中单词的出现次数

    Ubuntu14.04 给定一个文本,统计其中单词出现的次数 方法1 # solution 1 grep与awk配合使用,写成一个sh脚本 fre.sh sh fre.sh wordfretest.t ...

  8. C#统计给定的文本中字符出现的次数,使用循环和递归两种方法

    前几天看了一个.net程序员面试题目,题目是”统计给定的文本中字符出现的次数,使用循环和递归两种方法“. 下面是我对这个题目的解法: 1.使用循环: /// <summary> /// 使 ...

  9. PHP 中如何正确统计中文字数

    PHP 中如何正确统计中文字数?这个是困扰我很久的问题,PHP 中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了 strlen,mb_strlen,mb_strwidth 这个三个函数去测 ...

随机推荐

  1. NSString常用方法

    --实例化方法-------------- NSString *str = [[NSString alloc] init]; NSString *str = [[[NSString alloc] in ...

  2. poj 2762 Going from u to v or from v to u?(强连通分量+缩点重构图+拓扑排序)

    http://poj.org/problem?id=2762 Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit:  ...

  3. 第一好用的时间 日期插件(Adding a Timepicker to jQuery UI Datepicker)

          最近在一个项目中用到了My97DatePicker,国人写的一个挺不错的时间选择插件,简单易用,但是在调试静态时却发现此插件必须产生一个iframe标签指向其主页,试了很多种方法都不能去除 ...

  4. 【高斯消元】BZOJ 1013: [JSOI2008]球形空间产生器sphere

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁 ...

  5. Firefly 配置说明!

    原地址:http://www.9miao.com/question-15-43023.html 下图一一个典型的config.json的配置:<ignore_js_op> "db ...

  6. 如何优化 Android Studio 启动、编译和运行速度?

    作为一名 Android 程序员,选择一个好的 IDE 工具可以使开发变得非常高效,很多程序员喜欢使用 Google 的 Android Studio来进行开发,但使用起来有时会出现卡顿等问题.本文介 ...

  7. struts2 标签库 介绍

    struts2.0里的标签没有分类,只用在jsp头文件加上<%@ taglib prefix="s" uri="/struts-tags" %>就能 ...

  8. URAL 1353 Milliard Vasya's Function(DP)

    题目链接 题意 : 让你找出1到10^9中和为s的数有多少个. 思路 : 自己没想出来,看的题解,学长的题解报告 题解报告 //URAL 1353 #include <iostream> ...

  9. HDU4502吉哥系列故事——临时工计划

    http://acm.hdu.edu.cn/showproblem.php?pid=4502 题意 :这个是中文题,我就不再详述了. 思路 : 以前做过一个活动区间选择,结果就按着那个思路敲了,后来发 ...

  10. linux和window下mkdir函数

    通过WIN32宏进行判断   window下mkdir函数   #include<direct.h> int _mkdir( const char *dirname );   linux下 ...