コード中の文字の頻度分析
出題者です。 こちらで用意していた回答は awk を使ったものでした。一応解説すると、組み込み変数FSを空にし、1行単位の文字毎に連想配列に格納しています。
1 2 3 4 5 6 7 8 9 | # 1文字版
BEGIN { FS="" }
{ for (i=1; i<=NF; i++) ht[$i]++}
END { for (c in ht) print ht[c],c }
# 3文字版
BEGIN { FS="" }
{ for (i=1; i<=NF-2; i++) { ht[$i$(i+1)$(i+2)]++}}
END { for (c in ht) print ht[c],c }
|
Posted feedbacks - Java
自身の文字頻度の上位10個は以下のようになりました。 ソース中に英単語が多く現れているため、英文の文字頻度と近い気がします。 e 75 t 59 SPACE 54 r 54 TAB 52 a 48 n 34 i 32 u 28 CR 27 p 24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.TreeMap;
public class Frequency {
public static void main(String[] aArguments) throws IOException {
Map<Character, Integer> tFrequencies = new TreeMap<Character, Integer>();
InputStreamReader tReader = new InputStreamReader(new BufferedInputStream(new FileInputStream(aArguments[0])));
try {
int tChar;
while ((tChar = tReader.read()) >= 0) {
Integer tFrequency = tFrequencies.get((char) tChar);
if (tFrequency == null) {
tFrequencies.put((char) tChar, 1);
} else {
tFrequencies.put((char) tChar, tFrequency + 1);
}
}
} finally {
tReader.close();
}
System.out.println(tFrequencies);
}
}
|
Javaはすでに出ていますが,以下のように改良してあります。
・コメント内の文字は集計に含めるとおかしくなりそうなので含めない
・JavaのソースコードはZIPファイルで提供されることが多いので,指定されたZIPファイル内のすべてのJavaソースファイルに対して集計を行う
JDK 1.6に付属のsrc.zipを集計してみました。
' ' 9328666
'e' 2074804
't' 1744299
'n' 1284657
'i' 1246055
'r' 1217281
'a' 1167409
'o' 1041531
'l' 873609
's' 851094
'c' 728897
'u' 631196
'p' 571200
'(' 514249
')' 514079
'.' 493002
'd' 466367
'm' 422504
';' 418324
'g' 417286
\u0009 403663
'f' 339805
'b' 311888
'h' 272053
'S' 271704
'=' 271260
'E' 267436
',' 224844
'C' 214651
'I' 210502
・コメント内の文字は集計に含めるとおかしくなりそうなので含めない
・JavaのソースコードはZIPファイルで提供されることが多いので,指定されたZIPファイル内のすべてのJavaソースファイルに対して集計を行う
JDK 1.6に付属のsrc.zipを集計してみました。
' ' 9328666
'e' 2074804
't' 1744299
'n' 1284657
'i' 1246055
'r' 1217281
'a' 1167409
'o' 1041531
'l' 873609
's' 851094
'c' 728897
'u' 631196
'p' 571200
'(' 514249
')' 514079
'.' 493002
'd' 466367
'm' 422504
';' 418324
'g' 417286
\u0009 403663
'f' 339805
'b' 311888
'h' 272053
'S' 271704
'=' 271260
'E' 267436
',' 224844
'C' 214651
'I' 210502
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StreamTokenizer;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class CharCounter {
public static void main(String[] args) throws Exception {
Hashtable<Character, Count> counts = new Hashtable<Character, Count>();
ZipFile file = new ZipFile(args[0]);
Enumeration<? extends ZipEntry> entries = file.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
if (!entry.getName().endsWith(".java")) continue;
Reader src = new InputStreamReader(file.getInputStream(entry));
StreamTokenizer tokenizer = new StreamTokenizer(src);
tokenizer.resetSyntax();
tokenizer.slashSlashComments(true);
tokenizer.slashStarComments(true);
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_EOL) continue;
char c = (char)tokenizer.ttype;
Count count = counts.get(c);
if (count == null) {
count = new Count(c);
counts.put(c, count);
}
count.n++;
}
}
Vector<Count> ranking = new Vector<Count>();
ranking.addAll(counts.values());
Collections.sort(ranking);
for (int i = 0; i < ranking.size(); i++) {
System.out.println(ranking.get(i));
}
}
static class Count implements Comparable<Count> {
char c;
int n = 0;
Count(char c) {
this.c = c;
}
public int compareTo(Count o) {
return (o.n == this.n)? 0 : (o.n < this.n)? -1 : 1;
}
public String toString() {
if (c < ' ') {
return String.format("\\u%04x", (int)c) + "\t" + n;
}
return "'" + c + "'\t" + n;
}
}
}
|





crane
#6382()
Rating0/0=0.00
プログラムコード中の文字の頻度は言語によって相当にばらつきがあると思います。ある言語はピリオドが頻出するとか、別の言語はカッコの頻出頻度が高い、とか。そこで、
(その言語で書かれた「典型的な」プログラムコード、といえるようなものがあると良いのですが・・)
簡単すぎるという方は、複数文字にしてみたり単語の頻度にしてみてください。
参考;Wikipedia 頻度分析
http://ja.wikipedia.org/wiki/%E9%A0%BB%E5%BA%A6%E5%88%86%E6%9E%90
1 reply [ reply ]