2

これは、一般的なUNIXライクなシステム(Python、Perl、awk、標準のUNIX utils {sort、uniq}など)で使用できる可能性が高い高水準言語であればどれでもかまいません。うまくいけば、2MBのテキストファイルの一意の用語の総数を報告するのに十分な速さです。

これは迅速な健全性チェックにのみ必要なので、適切に設計する必要はありません。

ケースに敏感であることを忘れないでください。

どうもありがとうございました。

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

4

8 に答える 8

6

Perlの場合:

my %words; 
while (<>) { 
    map { $words{lc $_} = 1 } split /\s/); 
} 
print scalar keys %words, "\n";
于 2009-05-27T07:38:23.917 に答える
5

bash / UNIXコマンドの使用:

sed -e 's/[[:space:]]\+/\n/g' $FILE | sort -fu | wc -l
于 2009-05-27T07:34:19.510 に答える
4

Python 2.4の場合(おそらく以前のシステムでも機能します):

#! /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)

Perlの場合:

$ perl -ne 'for (split(" ", $_)) { $H{$_} = 1 } END { print scalar(keys%H), "\n" }' <file.txt
于 2009-05-27T07:19:54.450 に答える
4

標準のUnixユーティリティのみを使用する:

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

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

出力を頻度の降順で並べ替える場合は| sort -r -n、この末尾に「」を追加できます。

これにより、無関係な数の空白トークンも生成されることに注意してください。これが気になるtr場合は、sedを使用して空の行を除外できます。

于 2009-05-27T07:34:47.933 に答える
4

これがPerlのワンライナーです:

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

または、各アイテムの数を一覧表示するには:

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

これにより、句読点を処理して「foo」を処理しようとします。は「foo」でカウントされ、「do n't」は単一の単語として扱われますが、必要に応じて正規表現を調整できます。

于 2009-05-27T09:55:37.293 に答える
3

単純に(52ストローク):

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

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

perl -lne'@w{map lc,split/\W+/}=();END{print 0+keys%w}'
于 2009-05-27T09:19:37.053 に答える
3

Pythonの短いバージョン:

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

ファイル全体をメモリに読み込み、空白を使用して単語に分割し、各単語を小文字に変換し、小文字の単語から(一意の)セットを作成し、それらをカウントして出力を出力します。

ワンライナーを使用することも可能です:

python -c "print len(set(w.lower() for w in open('filename.dat').read().split()))"
于 2009-05-30T17:40:52.803 に答える
0

これがawkワンライナーです。

$ gawk -v RS='[[:space:]]' 'NF&&!a[toupper($0)]++{i++}END{print i}' somefile
  • 「NF」は「文字がある場合」を意味します。
  • '!a [topuuer [$ 0] ++]'は、'一意の単語のみを表示する'を意味します。
于 2009-05-27T10:53:51.417 に答える