異なり語数No.04783
マボカル さん 05/07/11 23:41
 
こんにちは。マボカルと申します。

03969番に重複行の削除の方法についての投稿&回答がありましたが、
私も同じような質問をさせていただきます。

以下のようにあるファイルにある一連の単語の種類が何種類あるのか
リストアップしたいと思います。要するに異なり語数を求めようと
したいのです。

<総単語> <異なり語数>
りんご → りんご
みかん   みかん
みかん   トマト
トマト   ぶどう
ぶどう   すいか
りんご
すいか
みかん
りんご

重複行の削除をマクロで実行する方法も記されてありましたが、その
方法としては一行ずつ取り入れて、検索によって取り入れた同じ単語
が或る場合を削除するような感じと思うのですが、ファイルのサイズが
大きいとどうしても動作が遅くなってしまいますよね。

私はいつもこのようなリストアップをする際に、エクセルのピボット
テーブル機能を使ってやっていましたが、最近の作業ではエクセルの
許容範囲を超えた10万行とかそれ以上のファイルも扱うように
なってきました。いちいちファイルを分割して、エクセルで扱える
サイズで少しずつ作業をするのは面倒くさいので、秀丸でなんとか
ならないかと考えています。

マクロで異なり語数を求めるためには重複行を削除すれば結局のところ
求める結果になりますが、アルゴリズム的にはその他のもっと高速な
方法は無いのでしょうか。

ちなみに扱っているファイルがハングルと日本語が混在するファイル
だったり、コード形式がユニコードだったりするので、他のアプリケー
ションで代用するという方法も、結構制約があると思われますので、
秀丸のマクロで解決できる最適な方法というのがあるのかご教授頂き
たいと思います。


[ ]
RE:04783 異なり語数No.04784
アルビレオ さん 05/07/12 03:38
 
秀丸ユーザーのアルビレオです。

>私はいつもこのようなリストアップをする際に、エクセルのピボット
>テーブル機能を使ってやっていましたが、最近の作業ではエクセルの
>許容範囲を超えた10万行とかそれ以上のファイルも扱うように
>なってきました。いちいちファイルを分割して、エクセルで扱える
>サイズで少しずつ作業をするのは面倒くさいので、秀丸でなんとか
>ならないかと考えています。
>
>マクロで異なり語数を求めるためには重複行を削除すれば結局のところ
>求める結果になりますが、アルゴリズム的にはその他のもっと高速な
>方法は無いのでしょうか。
>
>ちなみに扱っているファイルがハングルと日本語が混在するファイル
>だったり、コード形式がユニコードだったりするので、他のアプリケー
>ションで代用するという方法も、結構制約があると思われますので、
>秀丸のマクロで解決できる最適な方法というのがあるのかご教授頂き
>たいと思います。

それぐらいの規模になると、秀丸で処理するのは厳しくなってきますね。
秀丸はあくまでテキストエディタであって、大量のテキストの加工を効率よく処
理するといった用途ではPerlなどのテキスト処理のためのツールにはかないませ
ん。
とはいっても文字コードの関係で秀丸を使わざるをえないということですよね…

一般公開されているマクロはある程度幅広い目的で使えるようになっているので、
特定の目的に絞り込めばもっと効率のよいアルゴリズムにすることは可能だと思
います。
ただしそれはほとんどマボカルさんしか使わないものになってしまうので、そこ
までやってくれる親切な人がいるかどうかということになってしまいます。
どうしても必要なら、
・自分で作る
・お金を払ってでもマクロを作ってもらう
のどちらかになるんじゃないでしょうか。
この規模になると、いくら秀丸のマクロといえども満足できる結果を手に入れる
ためなら多少のお金を払うだけの価値があるんじゃないかと個人的には思えてき
ます。
もちろん、親切な人がタダで作ってくれる可能性もありますけどね。

[ ]
RE:04784 異なり語数No.04785
ENCODINGSHIFTJIS さん 05/07/12 09:12
 
Log Parser 2.2 日本語版
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07
が、使えると思います。

LOGPARSER のヘルプより DISTINCT で検索

重複する値の削除
ログからの情報を使って作業するときは、多くの場合、元のデータ内に同じ値が何回
出現しても、一覧で同じ値を持つ要素は 1 度だけ取得したいと考えます。
DISTINCT キーワードを使用して、クエリの出力が "一意" のレコードで構成される
必要があることを示します。重複した出力レコードは破棄されます。
COUNT 集計関数内で DISTINCT キーワードを使用して、データに出現する異なる値の
 "総数" を取得することもできます。

やってみました。

ーーーーーーーー 入力 FRUIT.CSV (第1行は項目名)
FRUIT
りんご
みかん
みかん
トマト
ぶどう
りんご
すいか
みかん
りんご
ーーーーーーーーー
 9:00:09.41 C:\Program Files\Log Parser 2.2
  LogParser.exe -i:CSV "SELECT DISTINCT FRUIT FROM 'C:\Documents and Setting
s\JanGaJanGa\デスクトップ\FRUIT.CSV'"
FRUIT
-----
りんご
みかん
トマト
ぶどう
すいか

統計情報:
---------
処理された要素: 9
出力された要素: 5
実行時間:       0.04 秒
-------------------------------
大量なログの解析に使われているので、実績はあります。

[ ]
RE:04784 異なり語数No.04787
マボカル さん 05/07/12 13:53
 
アルビレオさん

コメントありがとうございます。

>それぐらいの規模になると、秀丸で処理するのは厳しくなってきま
>すね。秀丸はあくまでテキストエディタであって、大量のテキストの
>加工を効率よく処理するといった用途ではPerlなどのテキスト処理の
>ためのツールにはかないません。

私も最近大量のテキストを扱うようになってきてから、その辺りの
事情がよく理解できてきました。

>とはいっても文字コードの関係で秀丸を使わざるをえないということ
>ですよね…

文字コードの関係もありますが、私一人で作業をしているのではなく、
共同で作業をしているもので、もし別のアプリケーションを使うことに
なると、またその使い方なり注意点なり教えるのも大変でして・・・。
秀丸のマクロだと画面を見ながら視覚的にどういう動作をしているのか
分かりやすく、とっつきやすいので全ての作業を出来るだけ秀丸で
やりたいと思っていました。全て一人で作業をするのであれば、色々な
アプリケーションをじゃんじゃん試してみようと思います。それが
最も効率的な方法でしょうからね。

>一般公開されているマクロはある程度幅広い目的で使えるように
>なっているので、特定の目的に絞り込めばもっと効率のよいアルゴリ
>ズムにすることは可能だと思います。

私が使っているマクロは特定の目的に絞り込んだものなので、公開
されているマクロを使うにしろ、必要の無い部分を取り除いたり、
どうしても必要な部分を追加したりと、ほとんど手を加えて使って
います。何かいいアイディアはないかということでご質問させて
いただきました。

>どうしても必要なら、
>・自分で作る
>・お金を払ってでもマクロを作ってもらう
>のどちらかになるんじゃないでしょうか。

どうしても必要であれば、自分で作るでしょうね。というか、自分で
アイディアを出して、こうすれば目的の結果を得られるのではないか
というものは、全てそうやって作ってきました(勿論私の理解できる
範囲ではありますが・・・)。これは結局アイディア(アルゴリズム)の問題でしょ
うが、プログラミングの世界では、アイディアを提供する
こと自体がソースを提供することと同じぐらいのレベルで捕らえられて
いると考えてもよろしいのでしょうか。

とりあえずエディタで出来る限界が理解できました。ありがとうござい
ました。

[ ]
RE:04787 異なり語数No.04788
アルビレオ さん 05/07/12 15:37
 
アルビレオです。

>どうしても必要であれば、自分で作るでしょうね。というか、自分で
>アイディアを出して、こうすれば目的の結果を得られるのではないか
>というものは、全てそうやって作ってきました(勿論私の理解できる
>範囲ではありますが・・・)。これは結局アイディア(アルゴリズム)の問題でしょ
>うが、プログラミングの世界では、アイディアを提供する
>こと自体がソースを提供することと同じぐらいのレベルで捕らえられて
>いると考えてもよろしいのでしょうか。

「異なり語数」とかいう部分がさっぱり理解できなかったので漠然とした書き方
になりますが、Perlにはハッシュという機能があって単語ごとに統計を取るとい
ったことが非常に高速に行えます。

たとえば「秀丸でファイルを読み込んで不要な部分を削除するなどの加工をして
UTF-8で作業ファイルに保存、Perlを実行して作業ファイルから統計を取り>con
で秀丸に出力」までの一連の流れを秀丸のマクロとして組んでしまえば外部ツー
ルを使っていることをあまり意識せずに済むんじゃないかと思います。
あらかじめPerlをインストールしておく手間が必要ですけどね。

[ ]
RE:04788 異なり語数No.04789
マボカル さん 05/07/12 15:56
 
アルビレオさん

ありがとうございます。

>Perlにはハッシュという機能があって単語ごとに統計を取るとい
>ったことが非常に高速に行えます。

ご教授ありがとうございます。やっぱりそういった仕事はPerlとかが
強いですね。本格的に勉強しようと思います。

>たとえば「秀丸でファイルを読み込んで不要な部分を削除するなどの加工をして
>UTF-8で作業ファイルに保存、Perlを実行して作業ファイルから統計を取り>con
>で秀丸に出力」までの一連の流れを秀丸のマクロとして組んでしまえば外部ツー
>ルを使っていることをあまり意識せずに済むんじゃないかと思います。

なるほど。そうすると擬似的(変な言い方ですが)に秀丸操作している
ようにできますね。私はこういった使い方好きです。この作業は秀丸に
向いていないからということであきらめるよりは、何とかしてでも
秀丸を使うように工夫する瞬間って結構快感です。アイディアによって
はそういった柔軟な使い方ができるのが秀丸魅力の一つでもあります。

貴重なアイディアどうもありがとうございました。

[ ]
RE:04785 異なり語数No.04790
マボカル さん 05/07/12 16:26
 
ENCODINGSHIFTJISさん

ありがとうございます。

Log Parser 2.2 試してみました。英語版をインストールして韓国版XP
にて動かしました。

LogParser.exe -i:CSV "SELECT DISTINCT FRUIT FROM 'C:\Documents and Settings\
JanGaJanGa\デスクトップ\FRUIT.CSV'"

上のような入力だとCSVファイルが何万行ともなると、結果が一度に
画面に表示されず、結果を確認するために何度もキーボードを打たな
ければならないので、以下のように出力ファイルを作りました。

LogParser.exe -i:CSV "SELECT DISTINCT FRUIT INTO 'C:\Documents and Settings\
JanGaJanGa\デスクトップ\RESULT.CSV' FROM 'C:\Documents and Settings\JanGaJan
Ga\デスクトップ\FRUIT.CSV'"

ちなみにOSの関係(韓国版XP)で、S-JISのファイルは文字化けして
しまいます。韓国語の文書のみのハングルコードでは文字化けなく
結果を得ることができました。UNICODEにしても結局出力ファイルが
ハングルコードになってしまうので、日本語は文字化けしてしまい
ます。この問題はLog Parser 2.2の日本語版をインストールしても
結局のところOSの関係(韓国版XP)で、多分変わらないと思います。

でも韓国語のみのハングルコードのファイルに関しては、かなり使え
そうです。ご教授ありがとうございました。

[ ]
RE:04790 異なり語数No.04791
ENCODINGSHIFTJIS さん 05/07/12 19:07
 
入出力形式を XML にすると SJIS,ハングル 【混在】は保存されるようです。

18:43:00.40 C:\Program Files\Log Parser 2.2
  LogParser.exe -i:XML -o:xml -fmode:Auto "SELECT DISTINCT f FROM 'C:\Documents
and Settings\JanGaJanGa\デスクトップ\FRUIT.CSV' "
&#63731;&#63730;&#63731;&#63730;<?xml version="1.0" encoding="ISO-10646-UCS-
2" standalone="yes" ?>
<!DOCTYPE ROOT[
 <!ATTLIST ROOT DATE_CREATED CDATA #REQUIRED>
 <!ATTLIST ROOT CREATED_BY CDATA #REQUIRED>
 <!ELEMENT f (#PCDATA)>
 <!ELEMENT ROW (f)>
 <!ELEMENT ROOT (ROW*)>
]>
<ROOT DATE_CREATED="2005-07-12 09:44:43" CREATED_BY="Microsoft Log Parser V2.
2">
 <ROW>
  <f>
  &#4352;&#4352;&#4352;
  </f>
 </ROW>
 <ROW>
  <f>
  &#4355;&#4355;&#4355;
  </f>
 </ROW>
 <ROW>
  <f>
  &#4360;&#4360;&#4360;
  </f>
 </ROW>
 <ROW>
  <f>
  りんご
  </f>
 </ROW>
 <ROW>
  <f>
  すいか
  </f>
 </ROW>
 <ROW>
  <f>
  みかん
  </f>
 </ROW>
 <ROW>
  <f>
  トマト
  </f>
 </ROW>
 <ROW>
  <f>
  ぶどう
  </f>
 </ROW>
</ROOT>
-------------------------------
XML出力は BOM付きUnicodeのようです。頭にDTDが付きますが

[ ]
RE:04791 異なり語数No.04792
ENCODINGSHIFTJIS さん 05/07/12 19:11
 
入力はUTF-8でやってます、XMLはUTF-16 もできますが

<FRUIT>
<f>&#4352;&#4352;&#4352;</f>
<f>&#4355;&#4355;&#4355;</f>
<f>&#4360;&#4360;&#4360;</f>
<f>&#4352;&#4352;&#4352;</f>
<f>&#4360;&#4360;&#4360;</f>
<f>りんご</f>
<f>すいか</f>
<f>みかん</f>
<f>りんご</f>
<f>りんご</f>
<f>みかん</f>
<f>みかん</f>
<f>トマト</f>
<f>ぶどう</f>
<f>りんご</f>
<f>すいか</f>
<f>みかん</f>
<f>りんご</f>
</FRUIT>

[ ]
RE:04792 異なり語数No.04793
マボカル さん 05/07/13 02:16
 
ENCODINGSHIFTJISさん

ご教授ありがとうございます。秀丸マクロに直接関係はありませんが、
ここでお礼を含めて報告させて頂きます。
XML形式でファイルを作成後、動作を確認しました。UNICODEが維持
された状態で結果ファイルを出すことができました。

でもXML形式に直したり、XML形式からタグを取り除く作業自体も行数
が膨大な量になると大変な時間がかかりそうでもありますね。

とにかくお付き合いありがとうございました。

[ ]