ChineseCounter.cs 统计中文文本中常用字占比
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 统计中文文本中常用字占比的更多相关文章
- python统计一个文本中重复行数的方法
python统计一个文本中重复行数的方法 这篇文章主要介绍了python统计一个文本中重复行数的方法,涉及针对Python中dict对象的使用及相关本文的操作,具有一定的借鉴价值,需要的朋友可以参考下 ...
- python统计英文文本中的回文单词数
1. 要求: 给定一篇纯英文的文本,统计其中回文单词的比列,并输出其中的回文单词,文本数据如下: This is Everyday Grammar. I am Madam Lucija And I a ...
- Pig + Ansj 统计中文文本词频
最近特别喜欢用Pig,拥有能满足大部分需求的内置函数(built-in functions),支持自定义函数(user defined functions, UDF),能load 纯文本.avro等格 ...
- C#统计英文文本中的单词数并排序
思路如下:1.使用的Hashtable(高效)集合,记录每个单词出现的次数2.采用ArrayList对Hashtable中的Keys按字母序排列3.排序使用插入排序(稳定) public void S ...
- HDU_2030——统计文本中汉字的个数
Problem Description 统计给定文本文件中汉字的个数. Input 输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本. Output 对于每一段文本,输出其中的汉 ...
- IOS 正则表达式匹配文本中URL位置并获取URL所在位置(解决连接中文问题)
需求很简单,是从一段文本中匹配出其中的超链接.基本的做法就是用正则表达式去匹配.但是有这样一个问题. 网上大部分的识别URL的正则表达式url末尾有空格的情况下可以正确识别.比如这样的情况. 我是一段 ...
- shell统计文本中单词的出现次数
Ubuntu14.04 给定一个文本,统计其中单词出现的次数 方法1 # solution 1 grep与awk配合使用,写成一个sh脚本 fre.sh sh fre.sh wordfretest.t ...
- C#统计给定的文本中字符出现的次数,使用循环和递归两种方法
前几天看了一个.net程序员面试题目,题目是”统计给定的文本中字符出现的次数,使用循环和递归两种方法“. 下面是我对这个题目的解法: 1.使用循环: /// <summary> /// 使 ...
- PHP 中如何正确统计中文字数
PHP 中如何正确统计中文字数?这个是困扰我很久的问题,PHP 中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了 strlen,mb_strlen,mb_strwidth 这个三个函数去测 ...
随机推荐
- EntityFramework.Extended
记录 Entity Framework扩展,可以实现批量更新.删除,但需要EntityFramework6.0支持,需要支持低版本的EF,可下载该扩展的低版本. https://www.nuget.o ...
- 【BZOJ 1911】 [Apio2010]特别行动队
Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT 转移方程 f[i]=max(f[j]+ ...
- myeclipse2013 for linux及其破解补丁百度网盘下载
FQ下载1.1G的东西不是开玩笑的,用GA下载了两回均失败,还是用了某某门在win下下载好的,来之不易,所以特意上传分享给大家,免得FQ.破解文件也一并附上: 注意:本人这个是在原文件基础上bzip2 ...
- 1201: [HNOI2005]数三角形 - BZOJ
Description Input 大三角形的所有短边可以看成由(n+1)*n/2个单位三角形的边界组成.如下图的灰色三角形所示.其中第1排有1个灰色三角形,第2排有2个灰色三角形,……,第n排有n个 ...
- 解决服务器断电导致mysql数据库无法启动
1.找到mysql数据库目录下的*.ini这个配置文件2.复制配置文件到桌面,当作备份3.打开配置文件,在配置文件里加上innodb_force_recovery=6这句,保存,然后重启服务器4重启完 ...
- Maven系列--"maven-compiler-plugin"的使用、Maven之Surefire插件
一."maven-compiler-plugin"的使用 http://my.oschina.net/poorzerg/blog/206856 二.Maven之Surefire插件 ...
- [Akka]发送一条消息的内部流程
本想通过了解一下Akka-actor工程中主要的类的概念,来看下Akka内部运作的机制.无奈里边的类的确太多,注释中对每个类的功能也没有足够的解释.所以还是通过debug的方式,找个入手点,看一下互相 ...
- GameAdmin
username:root e-mail :123@qq.com password:123
- Android 显示大图片
主要的代码如下: BitmapFactory.Options options = new BitmapFactory.Options(); //图片解析配置 options.inJustDecodeB ...
- http://jingyan.baidu.com/article/7908e85c74d85faf491ad260.html
http://jingyan.baidu.com/article/7908e85c74d85faf491ad260.html