2009-05-27 13 views
2

これは、一般的なUNIX系システム(Python、Perl、awk、標準UNIX utils {sort、uniq}など)で利用できるような高水準言語にすることができます。うまくいけば、2MBのテキストファイルのユニークな用語の合計数を報告するのに十分な速さです。平文ファイルのユニークな単語を大文字と小文字の区別なくカウントするにはどうすればよいですか?

これは、迅速なサニティチェックのためにのみ必要なので、よく改造する必要はありません。

case-insensitveを覚えておいてください。

大変ありがとうございます。

サイドノート:Pythonを使用する場合は、バージョン3専用のコードを使用しないでください。私が実行しているシステムは2.4.4しかありません。 Pythonの2.4で

+1

を私は時々おびえ人々はPythonのパフォーマンスであるか疑問に思います。私はこれまで4GBのdicomイメージを取り込んでPNGに変換し、そのPNGをscipy配列に変換し、scipy配列に変換された解析済みのセグメンテーションファイルをディスクに保存したスクリプトを書いた。これは32GBの整数山。 10分以内で完了しました。 – bayer

+0

あなたの質問は何ですか?自分で問題を解決しようとしましたか?はいの場合は、どのような問題に会いましたか?そうでない場合は、どうしてですか? – innaM

+0

この問題を解決する必要がある場合、カウントは簡単です。それはすべてのトラブルが忍び寄るトークン化です。入力とは何ですか? –

答えて

4

(おそらくそれは同様以前のシステム上で動作します):Perlで

#! /usr/bin/python2.4 
import sys 
h = set() 
for line in sys.stdin.xreadlines(): 
    for term in line.split(): 
    h.add(term) 
print len(h) 

:bashの/ UNIXを使用して

$ perl -ne 'for (split(" ", $_)) { $H{$_} = 1 } END { print scalar(keys%H), "\n" }' <file.txt 
+1

line.to_lower()。split()? :) – Skurmedel

+2

大文字小文字の区別がない場合 - h.add(term.lower())が必要 – viksit

+0

大文字小文字を区別しないのですか?最後に「print h」行を追加すると、サンプルファイルとして、 がセットされます(['bar'、 'Foo'、 'Bar'、 'foo'])。 Fooとfooは同じにする必要があります。 –

5

コマンド:

だけ使用
sed -e 's/[[:space:]]\+/\n/g' $FILE | sort -fu | wc -l 
4

標準Unixユーティリティ:

< somefile tr 'A-Z[:blank:][:punct:]' 'a-z\n' | sort | uniq -c 

Gnu trのないシステムを使用している場合は、「[:blank:][:punct:]」を、単語の区切り文字とみなしたいすべての空白と句読点のリストで置き換える必要があります。たとえば「\t.,;」と入力します。

あなたは、出力周波数の降順でソートしたい場合は、このの最後に「| sort -r -n」を追加することができます。

これは、空白トークンの無関係なカウントも生成することに注意してください。あなたがこれを心配している場合は、trの後にsedを使って空行を除外することができます。

6
Perlで

:単純

my %words; 
while (<>) { 
    map { $words{lc $_} = 1 } split /\s/); 
} 
print scalar keys %words, "\n"; 
3

(52ストローク):古いperlのバージョンの

perl -nE'@w{map lc,split/\W+/}=();END{say 0+keys%w}' 

(55ストローク):

perl -lne'@w{map lc,split/\W+/}=();END{print 0+keys%w}' 
4

ここPerlのワンライナーであります:

perl -lne '$h{lc $_}++ for split /[\s.,]+/; END{print scalar keys %h}' file.txt 

、または各項目のカウントリストする:「foo」というこれは、ように句読点を処理しようとする試みを行い

perl -lne '$h{lc $_}++ for split /[\s.,]+/; END{printf "%-12s %d\n", $_, $h{$_} for sort keys %h}' file.txt 

を"foo"でカウントされますが、 "do not"は1つの単語として扱われますが、必要に応じて正規表現を調整することができます。

0

ここはawkオンライナーです。

$ gawk -v RS='[[:space:]]' 'NF&&!a[toupper($0)]++{i++}END{print i}' somefile 
  • 'NF' は 'キャラクターがあれば' という意味します。
  • '![topuuer [$ 0] ++]'は、 ' uniq wordsのみを表示する'を意味します。
3

Pythonで短いバージョン:

print len(set(w.lower() for w in open('filename.dat').read().split())) 

は、メモリにファイル全体を読み込み、空白を使用して単語に分割し、小文字する各単語を変換し、小文字の単語から(ユニークな)セットを作成しますそれらを数え、出力をプリントします。 1つのライナー使用

また

可能:

python -c "print len(set(w.lower() for w in open('filename.dat').read().split()))" 
関連する問題