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 这个三个函数去测 ...
随机推荐
- Myeclipse 2013 professional 破解,下载
昨天重装了系统,今天重新搭建开发环境,就顺便把Myeclipse升级到了2013,点击下载Myeclipse2013.惯例,需要破解Myeclipse2013,不过我发现我之前的破解Myeclipse ...
- bnuoj 4225 杨辉三角形(规律)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=4225 [题意]: 给定任意杨辉三角的行数n,请输出杨辉三角中前n行中总共有多少偶数. [题解]: 找 ...
- Delaunay三角剖分
Bowyer-Watson算法:1.假设已经生成了连接若干个顶点的Delaunay三角网格:2.加入一个新的节点,找出所有外接圆包含新加入节点的三角形,并将这些三角形删除形成一个空洞:3.空洞的节点与 ...
- Matlab划分测试集和训练集
% x是原数据集,分出训练样本和测试样本 [ndata, D] = size(X); %ndata样本数,D维数 R = randperm(ndata); %1到n这些数随机打乱得到的一个随机数字序列 ...
- c/c++强制类型转换
转自c/c++强制类型转换 Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变 ...
- C++ static、const和static const 以及它们的初始化
转自C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. s ...
- POJ 1797 Heavy Transportation(Dijkstra)
http://poj.org/problem?id=1797 题意 :给出N个城市M条边,每条边都有容量值,求一条运输路线使城市1到N的运输量最大. 思路 :用dijkstra对松弛条件进行变形.解释 ...
- 版本管理工具介绍—Git篇
前篇 如题,提起版本管理工具相信做C#开发 还是对Git比较陌生 我们可能更熟悉vss.svn 记录此文的目的 更是为以后的前段学习做基础 现在的技术比如nodeJs angularJs ==都 ...
- JixiPix 各种图像软件,很不错的说,还有affinity designer
http://jixipix.com/purchase.html https://www.board4allcz.eu/showthread.php?t=639107 https://affinity ...
- photoshop:把路径存储为形状
这个其实跟定义画笔步骤是一样的 路径存储为自定义形状 1.用路径选择工具(快捷键A),选中路径 2.菜单:编辑->定义自定形状 3.选择自定义形状工具(快捷键U),可以看到刚定义的形状 把当前形 ...