質問<1765>2004/6/28
from=英二
「Cプログラム」


こんにちは。
大学生のものですが質問させていただきます。
英文で書かれたテキストを読み込み、その中の単語数を求めよという
プログラムがわかりません。文字数ならば出来たのですが、単語数となると
さっぱりです。
お願いいたします。


お便り2004/6/29
from=juin


単語と単語の間には空白があります。空白の数を数えて1を加えれば
単語数がでます。


お便り2004/6/29
from=wakky


プログラミングは素人ですが・・・
英文ですから、一つの単語の後ろには、必ずスペースか
ピリオド(ハイフンもかな?)があるでしょう。
その数を数えれば単語に数に一致するのでは?


お便り2004/6/30
from=jjon.com


キーワード「単語数 プログラム例」でGoogle検索すると見つかるでしょう。


お便り2004/6/30
from=naoya


英文の単語数を数えるのは意外と難しいです。

単語と単語の間がスペースだけとは限らないし、スペースが連続することも
ありえるので、スペースの数だけを数えて+1なんてものはナンセンスです。

やはり純粋に単語にきっていく方法が一番です。
ANSI Cには単語を区切る関数もありますが、そういったものを使わないと、
区切り文字と単語構成文字は交互に出現すると言うことを利用して単語数を
求めることになります。

単語と単語の区切り文字には次のようなものが考えられます。
半角スペース ( ) / ; : , . ! ? 水平タブ 垂直タブ EOF

引用符は直前または直後の単語と同じものとして考えればよいです
('を区切り文字として考えると It's などの単語が2語としてカウント
されてしまうので)。

基本的な流れは、
①ストリームから一文字ずつ読み込んでそれが区切り文字であった場合には
読み飛ばす。連続する場合も読み飛ばす。
②区切り文字以外の文字が出てきたら単語数を+1
③次の区切り文字が出るまで読み飛ばす

という①→②→③の流れを繰り返して行います。

二点ほど注意点があります。
一つは数字中のコンマ。
100,000と言う数字が出てきた時、コンマはこの場合単語と単語を区切る
区切り文字ではありません。
より正確なものを求めるならばこれを考慮する必要があります。
具体的にはコンマの前後が数字の時のみそれが区切り文字でないと判定すれば
よいです。
二つ目はハイフンです。
well-knownなどは一語ですが、同格表現のハイフンの連続---つまりこういう
もの---などは前後で単語が区切れます。単一のハイフンと連続のハイフンを
分けて考えるべきです。(ただし一部例外もあるので難しいのですが)

区切り文字は一個一個判別するよりテーブルを作成して判定をしたほうが
良いです。
char delim_table[256];
delim_table[(unsigned int)' '] = 1;
delim_table[(unsigned int)'a'] = 0;
のように、区切り文字のところには1、非区切り文字のところには0を
代入したテーブルを作成しておくと、
文字cの区切り文字・非区切り文字の判別は
if (delim_table[c]) ・・・
のように簡単になります。これは文字種判定の定石ともいえるので
使いこなしてください。

このように処理する際は、常にc!=EOFを確認してください。

長々とすみませんでした。

実際、プログラムを書くのは結構面倒ですが、頑張ってみてください。


お便り2004/7/4
from=naoya


http://homepage3.nifty.com/naoyear/tips/wordcount.htm
ここに同じような解説とサンプルプログラムを書いて載せておきました。
よかったら参考にしてみてください。