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 这个三个函数去测 ...
随机推荐
- Hadoop的安装与配置说明
安装hadoop是一件非常容易的事情,读者可以在官网上下载到最近的几个hadoop版本.网址为http://apache.etoak.com//hadoop/core/. 目前,hadoop可以运 ...
- 1055: [HAOI2008]玩具取名 - BZOJ
Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使 ...
- Subset leetcode java
题目: Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset mus ...
- GridBagLayout:网格包布局管理器
GridBagLayout:网格包布局管理器 GridBagLayout可以说是布局管理器Layout中最复杂的一个,其中涉及到的参数也比较得多,比如说: GridBagConstraints g ...
- binary 和 varbinary
固定长度或可变长度的 Binary 数据类型. binary [ ( n ) ] 长度为 n 字节的固定长度二进制数据,其中 n 是从 1 到 8,000 的值.存储大小为 n 字节. varbina ...
- Apache James搭建内网邮件服务器
Apache James搭建内网邮件服务器 极客521 | 极客521 2014-08-21 148 阅读 java 大概之前两个礼拜的日子,讨论会介绍了关于了.net内网邮件服务器的搭建.所以自己也 ...
- CodeIgniter类库之Benchmarking Class ,计算代码的执行时间
CodeIgniter中有个Benchmarking类库,它是被系统自动被加载的,不需要手工加载.Benchmarking类库能够计算出任意两个被标记点之间的代码执行时间.通过这个数值,可以评估程序员 ...
- http_build_query函数(学习)
http_build_query函数 http_build_query -- 生成 url-encoded 之后的请求字符串 描述 string http_build_query ( array ...
- Extension Method[上篇]
在C#3.0中,引入了一些列新的特性,比如: Implicitly typed local variable, Extension method,Lambda expression, Object i ...
- ubuntu12.04升级后找不到共享目录
备注:采用VMware-workstation 10 更新命令:sudo apt-get update 今天开始搭建Android开发环境,先升级系统,升级后发现windows和ubuntu共享的目录 ...