質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

4007閲覧

単語の種類がいくつあるか表示する方法を教えてください。

jahaa

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2019/05/24 07:12

編集2019/05/24 13:17

与えられたファイル中の必ず単語で区切ってある単語で、toLowerCaseで大文字小文字の区別をなくし、重複している単語を除いて単語の種類がいくつあるかを表示するプログラムを教えていただきたいです。よろしくお願いします。

java

1 2import java.io.BufferedReader; 3import java.io.FileReader; 4 5public class FileReadLine { 6 public static void main(String[] args) throws Exception{ 7 String str = ""; 8 BufferedReader br = new BufferedReader( new FileReader( "reya.txt" ) ); 9 while( br.ready() ){ 10 str += br.readLine() + " "; 11 } 12 br.close(); 13 14 String [] word = str.split("[\p{Blank}|\.|,]++"); 15 16 System.out.println( "単語数は:" + word.length ); 17 18 } 19}

追記:ご指摘いただいた皆様ありがとうございます。
The objective of the department is to perform basic scientific
research and education in the field of Information Science and
Engineering, whose importance as a research field is continuously
increasing in recent days. In particular, applying of mathematical
methodologies towards information processing and their systems, as
well as exploring basic mathematical disciplines in computer science,
are strongly deemed as immediate research needs.
このような英文の単語の種類を知りたいです。現在の状況では、重複した単語を削除できずにいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/05/24 07:22

対象がどういうデータなのかにもよります。 プログラムにとっては「単なる文字列」なので人間が勝手に決めた「単語」を正しく認識させるのは困難です。 日本語だとしたら「こんにちは山田さんお元気ですか」とあった場合に、どうするの?とか。 「必ず単語で区切ってある」とか、英文みたいに「Hello Mr.Yamada ! How are You ? 」のようになっていればまだやりようがありますが。
BeatStar

2019/05/24 07:43

"<コード>"の使いかた、間違っていますよ。
mather

2019/05/24 08:33

日本語を自分で読み直して、実現したいことを丁寧に説明してください。 - reya.txt の内容を(サンプルでもいいので)記載する。改行区切りの単語一覧なのか、普通の文章が入っているのかわからない。 - 現在のコードでは何が問題なのか書く。 - 期待される結果はどのようなものか書く。
sage

2019/05/24 14:06

(1) 単語の種類って、名詞、動詞、形容詞、・・・ではないですね? (2) 重複の定義は? (名詞の単複の違い、動詞の時制・活用形の違いをどう扱うか。同一と扱うのならば辞書が必要)
guest

回答2

0

重複を削除する方法として有力なのは大きく2つ。
「Setを利用する」か「Stream#distinctを使う」です。

投稿2019/05/24 08:43

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jahaa

2019/05/24 13:08

ありがとうございます!さっそく試してみます!
guest

0

swordoneさんの有力候補が望ましいのかもしれませんが、一応書いておきます。


追記読みました。

まず、jahaaさん、コードじゃなくて、普通に人間として問題文を解くとするならどうしますか?

コードを組む・アルゴリズムを考えるetc.のようなコンピュータからは離れているとして。

私なら、

The objective of the department is to perform basic scientific research and education in the field of Information Science and Engineering, whose importance as a research field is continuously increasing in recent days. In particular, applying of mathematical methodologies towards information processing and their systems, as well as exploring basic mathematical disciplines in computer science, are strongly deemed as immediate research needs.

ですので、最初に The を読む。The は今のところ1回目(だって最初だし) なので
The: 1
となります。
次のobjective も同様に +1 して
objective: 1
になりますね。

...and education in the field of Information...

の部分で二回目のthe が出てきます。
よって、the を +1 して
the: 2
とします。

これをneeds.まで行います。

これをコード化するにはどうすればいいでしょうか?

まず一つ目の疑問。

「どうやって初めてかどうかがわかるか」。

二つ目の疑問。

「どうやって+1していくのか」。

ですね。

一つ目の疑問は、リスト構造か何かに入れておいて、そこにないなら「新規」、あるなら「既存」と考えられる。
そして、個数を数えるために、カウンタを用意したい。

そこで、私なら、C言語でいう構造体か、クラスを用意します。

少なくとも「データ自体」と「カウンタ」を持つクラスだとします。

一応JavaなのでできるだけOOPでやりたいなぁってことで、

私なら

Java

1public class Word{ 2 // コンストラクタ 3 public Word( String key ){ 4 key_ = key; 5 counter_ = 0; // 0で初期化しておく 6 } 7 private String key_; 8 private int counter_; 9}

みたいにします。
でもこれではprivateなメンバは操作できないので、カウンタを操作するメンバを追加します。

(今回は) -1したり、+3 したりとかはないので、単に +1 するメソッドを追加します。

Java

1public class Word{ 2 // コンストラクタ 3 public Word( String key ){ 4 key_ = key; 5 counter_ = 0; // 0で初期化しておく 6 } 7 // カウンタ操作系 8 public void up(){ counter_++; } 9 10 private String key_; 11 private int counter_; 12}

このままだとカウントだけして、結果がわからないので、結果を表示するメソッドか、get系を追加します。
(できればオブジェクト自身ができればいいんですがねぇ。)

(追記2: swordoneさんからご指摘を受けました。すみません、勘違いしていました。問題文では、「単語数を調べる」ですが、私は「それぞれの単語の出現回数を調べる」だと思っていたので... 単語数のほうなら「upメソッドとかそういうの」は不要になりますね。一応、考え方としての意味でそのままにしておきますね。)

(追記2.1: 単に単語数を数えたいならクラスや構造体にする必要は...ないですね。大雑把なロジックは一緒ですが、単純に Stringのリストか配列を用意すればいいだけですし。)

Java

1public class Word{ 2 // コンストラクタ 3 public Word( String key ){ 4 key_ = key; 5 counter_ = 0; // 0で初期化しておく 6 } 7 // カウンタ操作系 8 public void up(){ counter_++; } 9 10 // keyと tokenが一致するかどうか 11 public bool isMatch( String token ){ 12 return ...; // todo: ここの処理はご自分で! 13 } 14     15 // 文字列にして返す 16 public String toResultString(){ 17 return (key_ + ":" + counter_); 18 } 19 20 private String key_; 21 private int counter_; 22}

としておけば、

Java

1// 文字列を分解してList<String> tokensに入れているとして。 2// そして、仮に the だけを数えていくとするなら。( Word the だとして ) 3for( int i = 0; i < tokens.length(); i++ ){ 4 if( the.isMatch( tokens[i] ) ){ 5 the.up(); 6 } 7} 8... // ほかの処理 9 10System.out.println( the.toResultString() );

みたいにできます。

例では"the"だけですが、List<Word> words とかに入れてやっていくとか。

これはあくまで、私が何となく思いついたものです。

なので、おかしな部分もあると思います。

そこは修正してください。

投稿2019/05/26 02:12

編集2019/05/26 04:52
BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2019/05/26 03:37

細かいですが、種類数だけカウントするなら「+1」の操作はいらないと思います。 重複があったら無視するだけで十分かと。 もちろん、「各単語が出てきた回数」まで必要なら必要ですが。
BeatStar

2019/05/26 04:43

swordoneさん。 ああ! 確かに! っていうか、私、勘違いしていました... ( マジで「それぞれの単語の出現回数」を調べると今まで思っていました... ) ちょっと修正しますね。
jahaa

2019/05/26 12:42

ご丁寧にありがとうございます。 早速試してみます。
BeatStar

2019/05/28 01:55

質問者さんへ。 あと、活用はどうするかっていう問題もありますね。 例えばmake - made - made (そして making) は一つとみなすのか、 それぞれ別のものとみなすのか... 別物とするのなら、私が書いた方法でも普通にできます。 しかし、ひとつとみなす場合は工夫が必要だと思います。 例えば「定義ファイル」なるものを用意し、 makeグループ: make, made, making と書いていく。 そのグループ内にあるなら +1 的なチェック。 という具合に。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問