- ベストアンサー
Perlによる自動処理について
前回の質問ではお世話になりました。 おかげで上手く動作させることが出来ました、ありがとうございます。 今回は自動処理について質問したいと思います。 ハッシュに入っている複数の文字列 (あい、あいう、あいうえ、あいうえお) を”あい”としてまとめ、カウントしたいです。 アルゴリズムとしては、前文”あい”が共通しているので、”あい”を含むものを検索してカウントすれば出来ると思うのですが、正規表現など開発の際に単語を指定せずに出来るものなのでしょうか? 少々伝わりにくいと思うので以下に要点をまとめます。 (1)ハッシュに入っている類似文字列について、ひとまとめにカウントしたい。 (2)その際、開発の段階で文字列を指定しない(正規表現のようにパターンを設けない)で、(1)の処理が出来るかどうか。 どのような形でも良いので、複数ある単語をひとつにまとめ、尚且つキーワードを設けないようなものと言われたので、私としても(2)をどうして良いのか分かりません。 実現可能か不可能かだけでも、ご意見頂ければ嬉しいです。 宜しくお願い致します。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>外部ファイルの使用については大丈夫だと思います. >そこで,外部ファイルというのは具体的にどのようなファイルでしょうか? 複数の単語を1つにまとめるための情報を定義したものです。(辞書ファイルのようなものと考えて下さい) 記述の方法は、これから自分で決めることになります。1つの例として、(これが実用に耐えることを意味しませんが)以下のような記述があげられます。三毛猫、ドラ猫のように最後の1文字が猫であるものを、1つのグループにししたい場合、*猫のように定義します。 ここで、*とは何でも良い文字(ワイルドカード)という意味です。 従って、 *猫 *犬 とすれは、最後が猫、犬で終わるものに関する定義をおこなったことになります。尚、*はひとつの例で、この文字をかならず使う必要はありません。また、この場合、野良猫と海猫も*猫にマッチしますが、海猫は除きたいと言う場合は、そのような情報も必要になります。
その他の回答 (6)
- zxcv0000
- ベストアンサー率56% (111/196)
ははは。 「黒豚と河豚は似てない。」 「野良猫と海猫は似てない。」 が要求事項なら、 「シェパードとダックスフンドは似てる」も必要ですね。 実現のためには単語辞書が必要です。 仮に目的にかなった単語辞書が入手できたとして、それを使うためには単語分解も必要かも知れません。 エキスパート・プログラマでも、ちょっと手間のかかる仕事になるでしょう。
補足
度々回答ありがとうございます. Perl自体で自動処理するにしても,別のところで様々な定義付しなくてはならないんですね. そうすると自動化自体にメリットが殆どなくなってしまいますよね. 時間がかかるとしたら,やっぱり要求者にそれを分かっていただいたほうが無難かもしれませんね. ありがとうございます.
- Tacosan
- ベストアンサー率23% (3656/15482)
確かに, 「何らかの知識」を与えないと無理ですね>#4. 「ドラ猫、野良猫、海猫」とか「黒豚, 河豚, 海豚」を「似ている」としていいかどうかってかなり微妙だし. 最悪「知識を外部ファイルとして与えて require」とかいう大技に発展するかもしれん.
補足
回答ありがとうございます. 文字列を羅列するにも,正規表現などで単語をひっかけるにも何らかの言葉は必要ですよね. 外部ファイルを使うこと自体については,形式的な意味で問題ないと思われます. この場合結構な時間が必要とされますよねー….
- tatsu99
- ベストアンサー率52% (391/751)
>どのような形でも良いので、複数ある単語をひとつにまとめ、尚且つキーワードを設けないようなものと言われたので、私としても(2)をどうして良いのか分かりません。 「複数ある単語をひとつにまとめ、尚且つキーワードを設けないようなもの」 この部分をハードコーディング(プログラムで直接記述すること)でなく、外部ファイルに定義してよいならばできるかも知れません。それでよいか、質問者様に要求を出した人に、確認されてみてはいかがでしょうか。とにかく、単語をまとめるための情報なしに、プログラムで処理をするのはできないと思いますよ。 (ドラ猫、野良猫、海猫も同じ猫にまとめて良いかどうかは人間しか判断できないと思います)
補足
回答ありがとうございます. >外部ファイルに定義してよいならばできるかも知れません。 外部ファイルの使用については大丈夫だと思います. そこで,外部ファイルというのは具体的にどのようなファイルでしょうか? 度々お手数おかけします. 宜しくお願いします.
- zxcv0000
- ベストアンサー率56% (111/196)
人間が自然と感じるグループ分けを何の基準も与えずに Perl に全自動でやらせたいのなら、まず不可能でしょう。 > 例として%zooの中に犬、柴犬、警察犬、猫、野良猫、ドラ猫があるとします。 これを「犬」と「猫」に振り分けるなら、以下のいずれかの規則が必要です。 1 末尾 1文字をグループ分け基準にする。 2 「犬」と「猫」をあらかじめ「グループ候補」として登録しておく。 実際、(柴犬、警察犬、警察官) は、どの様にグループ化しますか? 結論では無く根拠・判断基準を教えてください。 ソフトウェア作りをする場合、起こり得る可能性を全て事前に把握して対応を決めておかにゃなりません。 それが不充分な時、バグという名の汚点が生まれます。
補足
回答ありがとうございます. やはりある程度のキーワードを設けなければ実現は不可能ですね. >1 末尾 1文字をグループ分け基準にする。 については,文字列の一番最後が合致していれば同じグループとして見なすということでしょうか?
- zxcv0000
- ベストアンサー率56% (111/196)
> 前文”あい”が共通しているので 先頭 2文字が一致するものをまとめるなら、先頭 2文字をキーにしたハッシュを作れば良いです。 その方向で、OKですか? NGなら、どういう規則でまとめたいかを詳しく書いてください。 例示された (あい、あいう、あいうえ、あいうえお)のまとめ方が以下でなぜ悪いのかが判らないと何とも答え様がありません。 1 「あ」組のみ 2 「あい」組 + 「あいう」組
補足
回答ありがとうございます。 ハッシュの中には1万件ほどの単語が入っております。 「キーやパターンを設けて処理するのは大変なので自動でそれらを処理できないか」との話で、どのような形式で処理を行うのか迷っているところです。 例として%zooの中に犬、柴犬、警察犬、猫、野良猫、ドラ猫があるとします。 これを犬はひとまとめに犬、猫はひとまとめに猫としたいです。 犬 3件 猫 3件 このような処理を自動で行うことは可能でしょうか。 何故自動かというと、前述にもあるとおり、本来のハッシュの中身には1万ほどの単語が入っているからです。 説明不足にも関わらず、レスポンスしていただき感謝します。 また不明な点ございましたら、随時対応致します。 宜しくお願いします。
- _--_1l1_1_
- ベストアンサー率67% (102/152)
ちょっとよくわからないですが、 --- 「あい」 は 4 回出ました 「あいう」 は 3 回出ました 「あいうえ」 は 2 回出ました 「あいうえお」 は 1 回出ました --- という感じで出力するということでしょうか?以下のようすればできると 思います。use utf8を使用しているのでutf8で保存して下さい。encode( 'utf8'...は環境に合わせて下さい。 --- #!/usr/bin/perl use warnings; use strict; use utf8; use Encode; my %word_of = ( 'あい' => 0, 'あいう' => 0, 'あいうえ' => 0, 'あいうえお' => 0, 'かき' => 0, 'かきく' => 0, 'かきくけ' => 0, 'かきくけこ' => 0, ); foreach my $search_key ( keys %word_of ) { foreach my $word ( keys %word_of ) { if ( $word =~ /$search_key/ ) { $word_of{$search_key}++; } } } foreach my $key ( sort ( keys %word_of ) ) { # utf8, shiftjis eucjp ... print encode( 'utf8', "「$key」 は $word_of{$key} 回出ました" ), "\n"; }
補足
回答ありがとうございます。 説明不足ですみません。ハッシュを変えて説明しなおします。 %zooの中に犬、柴犬、警察犬、猫、野良猫、ドラ猫があるとします。 これらを犬は犬として3カウント、猫は猫として3カウントしたいです。 犬 3件 猫 3件 このような処理を、"犬"や"猫"という単語を指定しないで行うことは可能でしょうか。 コードまで提供していただいて、本当に申し訳アリマセン。 別のところで教えていただいたコードは活用させていただきます。 ありがとうございました。 また説明不足でしたら随時対応致します。
お礼
回答ありがとうございます. なるほどー,某多人数チャットのような定義付をすればいいんですね! とても助かります. ありがとうございましたー.