• ベストアンサー

単語の頻度プログラム

英文から単語の頻度を出力するプログラムを作成しています。アルゴリズムは、英文から単語を抜き出して以前にあったものなら、その単語のカウントを1つ増やし、以前にないものなら、新しく頻度表に付け加えるというものです。 とりあえず、isspace関数を使って単語を抜き出すことを考えたのですが、これですと know know, know? のように同じ単語であるのに、カンマやピリオドが付いてしまっていると後で以前に見つかったものかを照合する際に不都合が生じてしまいます。isalnum関数で抜き出したものが、アルファベットか数字であるかを調べ、アルファベットと数字だけを抜き出せば、カンマやピリオドはうまく取り除けると思うのですが。そうすると、I'mなどのアポストロフィーも取り除かれてしまうのではないかと。。 すいません。混乱してます。。皆さんだったらどのようにしますか?答えではなく、ヒントやきっかけを頂けるとありがたいです。

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

  • ベストアンサー
noname#30727
noname#30727
回答No.4

トークンの切り出しに strtok() が使えるなら、使った方が楽です。 第一段階では、1文を空白をデリミタとして全て切り出して、I'm I've I'll I'd などの例外辞書とマッチングさせる。第二段階では、切り出したトークンを更に別のデリミタで切っていくのがいいのではないかと思います。 例えば、sun-in-law のようなものを1つの単語として認識させるなら、例外辞書はどんどん大きくなっていくので、頭の痛いところです。

noname#9262
質問者

お礼

回答ありがとうございました。 strtok()ですか。使ったことがないので、少し調べてみようと思います。

その他の回答 (5)

  • shige_70
  • ベストアンサー率17% (168/946)
回答No.6

この手のプログラムは、C言語でしたら、yacc,lexを使ってみるのも面白いかも知れませんね。

noname#9262
質問者

お礼

回答ありがとうございました。 yacc,lexですか。使ったことが無いので、少し調べてみようと思います。

noname#9262
質問者

補足

ありがとうございました。 無事完成いたしました。かなりヘンテコですが。。汗

noname#30727
noname#30727
回答No.5

#4 です。 sun-in-law → son-in-law の間違いでした。読み直して、義理の太陽でびっくりです。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

前に似たようなことをやったことがあります。 結構面倒くさいです。セパレータとしては[スペース]のほかに [?!.,;:”]などが有ると考えた方がうまくいくかも判りません。 理由は 単語,単語 や 単語;単語 が現れるからです。 [’]をアルファベット並みにするかセパレータにするかも考えどころです。 単に know  know,  know? を統一するだけなら、後ろから探して、 アルファベットが出てくるまで読み捨てる方法も使えます。 いずれにしても、このあたりの方針をきちんと整理してから プログラムを進められることをお勧めします。

noname#9262
質問者

お礼

回答ありがとうございました。 セパレータとして記号を使ってしまえば、いちいちスペースに変換する手間が省けますね。。 とりあえず、単語を抜き出す文章から記号を抜き出して、その記号かスペースが現れるまで1つの単語として認識させれば良いかもしれません。 こんな感じでしょうか? if (c = '?' || c = ',' || ....) (cはchar型) それとも、getcとかを使うことを考えると、文字コードを使ったほうが良いのかな。文字コードはいまいち苦手です。。汗 完璧に作るのは難しいようなので、妥協案を検討中です。 いま現在、アポストロフィー無視説が有力となっております。

noname#9262
質問者

補足

大事な情報が抜けていました。 C言語で作成しています。

回答No.2

単純に語末の記号は削る、他は残すじゃダメかな。

noname#9262
質問者

お礼

回答ありがとうございました。 実は単語を抜き出す文章というのに、(I know.)みたいのも含まれていまして。。語末の記号だけを削るというのは出来ないみたいなのです。

noname#9262
質問者

補足

大事な情報が抜けていました。 C言語で作成しています。

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

仮に私がやるとしたら、無精だから、I'm等のカウントは諦めます。 カウントしてmが出てきたら、「これはメートルのmと I'mのが混じってるんだな」と考えます。 でも、それもカウントしたいのなら、 (1)文を入力して(2)アポストロフィー以外の記号をスペースに変換して(3)単語を抜き出す のようにします。

noname#9262
質問者

お礼

回答ありがとうございました。 なるほど。私はプログラミングがあまり得意ではないので、完璧にこなそうとしてしまうと、結構はまって動けなくなってしまいそうですね。 とりあえず、アポストロフィー以外の記号をスペースに変換するのを試みてみようと思いましたが、そ。。それも結構難しそうですね。。汗。。,?()やらいろんな記号がありますから。。がーん。。しかも、引用符の’’はどうしましょう。。汗。。これは残ってしまったら困りますね。。うーん。難しい。。 いざとなったらアポストロフィー無視の妥協策も検討したいと思います。

noname#9262
質問者

補足

大事な情報が抜けていました。 C言語で作成しています。

関連するQ&A

専門家に質問してみよう