• ベストアンサー

PHP 文字の出現回数2

前回↓ http://oshiete1.goo.ne.jp/qa29 で回答をいただいて、問題は解決したのですがまた新たに わからないことがあるので質問させてください。 作っているプログラムは ユーザーがtextareaからインプットした文章(英語)を PHPプログラムが読み取り 出現数を数えるというものです。 ここまでは前回の質問で解決したのですが、 その後 インプットした文章から 特に文章の内容に関係ないと思われる単語(例えば、I,am,you,are,and,orなど)を除外したいのです。 そこから、出現回数を数え、一番多い出現数の単語をoutputしてユーザーに返し… とプログラムがさらに続くのですが 「特定の単語の除外」で困っています。 プログラムは今、以下のような状態です。 $story = _Post["story"];     //get the story from HTML doc preg_match_all("/([a-zA-Z']+)/",$story,$match); //Get the words foreach($match[0] as $val){ $count[$val]++; // strtolower } このプログラムの途中で、特定の単語(I、you、amなど)を削除したいのです。2行目で作った配列matchから特定の単語をうまく除外するよい方法はないでしょうか? explode、split等ではうまくいきませんでした。 アドバイスをいただけないでしょうか。 よろしくお願いします。

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • gogo-tea
  • ベストアンサー率75% (25/33)
回答No.2

除外対象の単語配列 array('I','am','you',・・・) を作成してarray_diffで差分を取れないですかね。。

ilnmfay
質問者

お礼

array_diffを使ったところ成功しました! ほんとうにありがとうございます。 「文字列をformから読み取る ↓ 意味のない単語を削除 ↓ 出現回数をカウント ↓ 出現数が一番多い単語を取り出す。 ↓ ユーザーにその単語を表示。 とともに、ユーザーがインプットした文書を保存。 ↓ 今までにこのホームページの全ユーザーがインプットした文章の中で 同じ最頻出単語を返した 文書の数を表示。 ↓ さらにリンクを示して、クリックすると、同じ最頻出単語を返した文章を読める。」 という自分にとってきついプロジェクトだったのですが、 おかげさまでようやく完成しました。 単語除外がうまくいかずほんとに困っていました。 ほんとにありがとうございます。

その他の回答 (2)

  • i2719
  • ベストアンサー率35% (11/31)
回答No.3

文章1にあり文章2にはない単語の数を数える仕様にした方が 汎用性があると思います。 $pattern="/([a-zA-Z']+)/"; $story1 = 'I am a student. I am a XX university student.'; $story2 ='I,am,you,are,and,or,a'; preg_match_all($pattern,$story1,$match1); preg_match_all($pattern,$story2,$match2); foreach($match1[1] as $word){ if(!in_array($word,$match2[1])){ $array[$word]++; } }

ilnmfay
質問者

お礼

回答ありがとうございます。 NO.2さんのように 配列を比較するというアイディアで 進めるのがいいようですね。 参考になる回答をありがとうございました。

noname#39970
noname#39970
回答No.1

単語リストを保持し、走査する前に 空白などに置換する この場合は作業用としてデータを複製しておく。

ilnmfay
質問者

お礼

回答ありがとうございます。 空白等にreplaceする方法も考えたのですが、 例えば、aを空白にreplaceしようとすると abcが bcになってしまいうまく動かなかったのです。

関連するQ&A

  • PHP 文字の出現回数

    textareaからユーザーにインプットしてもらった文章(英語)を PHPを使って読み取り、 単語の出現した回数をarrayにいれるプログラムを作ります。 たとえば、 I am a student. I am a XX university student. という文章をユーザーがインプットしたら、 I:2 am:2 a:2 studemt:2 XX:1 university :1 と値を返します。 Perlでは 読み取った文章(ここでは文字列)を $storyとすると、 foreach( split(/\s+/,$story) ) { $m{$_}++; } でその後、 連想配列のキーと値を順に表示していけばよいとわかります。 PHPではこれをどう表現すればよいでしょうか? foreach( explode(" ", $story ) ) { ... } というところから悩んでいます。 どなたかアドバイスをいただけないでしょうか。 お願いします。

    • ベストアンサー
    • PHP
  • textareaの内容をPerlプログラムに送る

    現在、次のようなプログラム(Perl)を作っています。 「ユーザがホームページ上のtextareaになんらかの短いストーリーを書き込む(英語)。submitボタンを押すとその文章の中から一番多い単語をPerlプログラムが読み取って、その後ホームページ上に  "Your story is about ..." (...にはその読み取った英単語を表示)と表示。ただし、a,the などの特に文章の内容に関係内単語は削除するようにプログラムを組む。 その後、We have the "n" stories talking about "..." If you want to see them, please click here. と表示。(読み取った英単語に関するストーリーを私たちはすでにn個持っています。もしそれを見たかったらここをクリックしてください) nは今までユーザからもらったストーリーの数をプログラムにより表示。 おおまかにこんな感じのプログラムを作っています。 Perlのプログラム(出現回数の多い英単語を探し出す)はできました。、 (1)HTMLのtextareaとそのプログラムを以下にしてつなげるか。 textarea のタグ内に name ="story"として、プログラムに$storyとすればtextarea 内の文字をgetできるのでしょうか? (2)データを保存  データベースに storyを保存する方法がわからず困っています。 post やgetを使えばよいのでしょうか? 長文すみません。 アドバイスしていただけるかたがいらっしゃれば、よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • 一番多い文字の検索

    Perlのスクリプトを用いて次のようなCGIプログラムを作ろうとしています。 「ユーザがインプットした文章(何かしらのストーリー)をsubmitして もらい、Perlプログラムを用いて、その文章の中にでてくる最頻出の単語を読み取る。(ここで文章は英語であり、最頻出の単語はa,the など文章の内容に関係のない言葉は排除する。)Perlプログラムで読み取った最頻出の単語を ユーザに表示。」 最頻出の単語を読み取る という部分で 苦戦しているのですが 何がアドバイスをいただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • 単語の出現頻度を求めるプログラム

    book.eng(英文がいっぱい)に現れている, 単語の出現頻度を求めるプログラムを作りたいのですが、大まかにまとめると次のような作業をしたいのです。 1.ファイルから一行読み出す 2.読み出した行を単語に分解 3.単語をキーとして、連想配列を用いたカウンターの増加 4.全部読み終わったら、キーを用いて出力 while( $input = <> ) { #読み出した一行を単語に分解(splitを使った方がいいのかな) #単語の数だけ繰り返し #単語をキーとして連想配列に } #全部終わったので、出力 という感じになりそうなのですが。。。。 ちなみにAND, And, andはすべて同じ単語だから、一行をすべて小文字に変換しておいた方がよさそうですよね。 $input =~ tr/[A-Z]/[a-z]/; を使えばいいとおもうのですがイマイチよく分かりません。そして出力もきれいにしたいし、一般性を持たせるなら、単語を切り分ける正規表現を引数として渡せるようにしておきたいです。どなたか教えてくださいませんか。

    • ベストアンサー
    • Perl
  • テキストファイルの出現回数を出力するプログラムについて

    こんにちは or こんばんは 学校の授業でRubyを習っています。 授業の課題でこんな問題がでました。 「英文の文章が入っているテキストファイルがあたえられると、そのファイルに置ける各語の出現回数を出力するプログラムをつくれ」 テキストファイルの中身は 「Show your flowcharts and conceal your tables and I will be mystified. Show your tables and your flowcharts will be obvious.」というファイルで 出力結果としては 「show 2 your 4 flowcharts 2 and 3 conceal 1 ...」 の用に出現する単語の数を表示するプログラムなのですが 単語ごとに区切る方法がわかりません。 何度かプログラムを組んでみたのですが全く違う結果でした。 $KCODE = 'e' str = [] #文字列 cnt = {} #回数 cp_str = [] ARGF.each do |l| /([A-Za-z]+)/ =~l for i in 0..(str.size) if str[i] == $1 cnt[$1] += 1 else str << $1 cnt[$1] = 1 end end end str.each do |m| puts "#{m} #{cnt[m]}" end 授業の課題の答えを教えて欲しいとは望みませんができればわかりやすいヒントをどなたかわかる方お願いします。 環境は Vine Linux 4.2 emacs で作成しています またテキストファイルはopenなどのメソッドは習っておらず ARGFで作成したいのでよろしくお願いします。

    • ベストアンサー
    • Ruby
  • PHPのmimeDecode.php について

    Redhat Linux4 で、メールを受信した際、添付ファイルがあれば 特定のフォルダに添付ファイルを保存するPHPを作っています。 以下のメール受信時にPHPプログラムを起動すると、 添付ファイル付きメールなのに、 $structure->ctype_primary = 'multipart' となってくれず 途方にくれています。 どなたかご教授いただきたくよろしくお願いいたします。 require_once("Mail/mimeDecode.php"); $input = file_get_contents("php://stdin"); $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $decoder = new Mail_mimeDecode($input, "\r\n"); $structure = $decoder->decode($params); $GB['sMailBody']=$structure->ctype_primary; この結果、$GB['sMailBody']は、text となってしまいます。

    • 締切済み
    • PHP
  • 和訳してください

    Nice babe, I am thinking about all the things were going to do when you get here. この文章をお願いします。

  • ファイル入出力 ~perl~

    以下のようなプログラムを作っています。(CGI,perlプログラム使用) 1.HTML文章中に textareaを設置。 2.ユーザがtextareaに文章を入力(英語)。 3.submitボタンを押すと、Perlプログラムが最頻出単語を読み取り、「This story is about "その最頻出単語を表示 " We have n stories about the topic. If you wish to see it, please click here.」 この際、a,the,I,youなど、topic内容に関係の内単語を排除。 文章の最後のhereをクリックすると、今までユーザが保存した同じtopicに関するデータを見れる仕組みになっています。 さて、質問なんですが、 今、submitボタンによって提出された文章をサーバ上に保存するところで困っています。 以下のような、ファイル入力のプログラムを書きました。 $fileName = $word . ".dat"; #word は読み込んだ最頻出語 open FH, "< $fileName" or die; $numberOfStory++; print $stored; #stored はtextareaから読み込んだ文章。 print "\n\n\n"; close (FH); この記述で、 ファイルを読み込むまたは、作ってサーバ上のデータベースに保存しようと試みましたが、プログラムが動きません。 また、$numberOfStoryという整数型の変数を利用することによって、保存された文章の数も数えたいのですが、やり方がわかりません。 どなたかアドバイスをいただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • 一人称の否定疑問文

    このような文章なんですが・・ Am i not much taller than A. 私はAよりずっと背が高くないですか?ですか? 答えが、NO you aren'tだと、 はい。あなたの方がずっと背が高くないです。ですか? でもこれだと全体のストーリーからして反対になっちゃって おかしいんです(><)やっぱり間違えていますか?

  • ブラウザを使用しないでプログラムから変数を送る方法

    通常、 ・GETの場合 <a href=http://www.xxx.co.jp?a=1>submit</a> ・POSTの場合 <form method=post action="xxx.cgi"> <input type=hidden name=a value=1> <input type=submit value=submit> </form> のなどのHTMLでクリックまたはSUBMITボタンを押すとその特定のURLのWWWサーバーに変数が送られますよね。 これをブラウザを使用せず、サーバーのプログラム(perl)を使用して、そのプログラムを実行すると プログラムで指定した特定のURLのwwwサーバー(port 80)に変数を送る方法書き方を教えて下さい。 GETの場合、POSTの場合それぞれ教えてください。 通常、ブラウザがしていることを、プログラムでしたいと思っています。 よろしくお願いします

    • ベストアンサー
    • CGI

専門家に質問してみよう