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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

6回答

2455閲覧

重複した文字列の排除

hfhff

総合スコア8

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2015/05/13 10:58

編集2015/05/13 11:29

重複した文字列を排除したいです
たとえば以下のtextを処理して"あいうえお"のみ出力したいです

lang

1text = "あいうえおあいうえおあいうえお"

言語はRubyでお願いします

追記です
説明不足ですみませんでした
いま以下のようなプログラムを書いています

lang

1require 'natto' 2 3s = File.read("./bocchan.txt") 4 5natto = Natto::MeCab.new 6natto.parse(s) do |n| 7 parts = n.feature.split(',')[0] 8 particle = n.surface 9 10 11 if parts == "助詞" 12 puts particle 13 else 14 15 end 16end

これはbocchan.txtという夏目漱石の『ぼっちゃん』のデータが入っているファイルから助詞だけを抜き出すプログラムです
このままだと、重複した助詞がそのまま出力されてしまいます
そこで下から5行目のputs particleの前後で何らかの処理を施して、重複を取り除きたいと考えています
お手数ですがもしお分かりになれば回答のほどよろしくお願いします

以下はbocchan.txtの冒頭です

lang

1親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事がある。なぜそんな無闇をしたと聞く人があるかも知れぬ。別段深い理由でもない。新築の二階から首を出していたら、同級生の一人が冗談に、いくら威張っても、そこから飛び降りる事は出来まい。弱虫やーい。と囃したからである。小使に負ぶさって帰って来た時、おやじが大きな眼をして二階ぐらいから飛び降りて腰を抜かす奴があるかと云ったから、この次は抜かさずに飛んで見せますと答えた。
DrqYuto👍を押しています

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

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

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

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

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

guest

回答6

0

ベストアンサー

こんにちは。

以下のように、出現する助詞を入れていく配列を用意して、
重複チェックに使うというのはいかがでしょうか?

[ykt68@sakura-vps] date
2015年 5月 13日 水曜日 21:01:01 JST
[ykt68@sakura-vps] cat question9794.rb

lang

1require 'natto' 2 3s = File.read("./bocchan.txt") 4 5josiArray = Array.new 6 7natto = Natto::MeCab.new 8natto.parse(s) do |n| 9 parts = n.feature.split(',')[0] 10 particle = n.surface 11 12 if parts == "助詞" 13 if !josiArray.include?(particle) 14 josiArray << particle 15 puts particle 16 end 17 else 18 19 end 20end

[ykt68@sakura-vps] ruby question9794.rb


から
ばかり


ほど



かも



ぐらい

[ykt68@sakura-vps]

ご参考になりましたら幸いです。

投稿2015/05/13 12:03

jun68ykt

総合スコア9058

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

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

hfhff

2015/05/14 05:58

ykt68さんの回答を実行したところうまくできました 今回は私の意図した通りの動作をする回答の中で、もっとも早く回答をくださったykt68さんをベストアンサーにさせていただきました ありがとうございました 他の方も回答くださりありがとうございます(こちらにまとめて回答させていただきます) Hashでのかき方参考になりました 出現回数も出力してくださりありがとうございます
guest

0

ベストアンサーの Array をつかったコードを Hash で書き直してみました。
(各 助詞の出現回数も出力してみました)

lang

1# coding: utf-8 2require 'natto' 3 4s = File.read("./bocchan.txt") 5josiHash = Hash.new(0) 6 7natto = Natto::MeCab.new 8natto.parse(s) do |n| 9 parts = n.feature.split(',')[0] 10 particle = n.surface 11 12 josiHash[particle] += 1 if parts == '助詞' 13end 14 15puts josiHash.keys.sort 16puts '-----------' 17josiHash.each do |k, v| 18 puts "#{k}:\t#{v}" 19end

実行結果:

か かも から が ぐらい て で と に の は ばかり ほど も や を ----------- の: 5 で: 3 から: 7 ばかり: 1 て: 8 に: 4 ほど: 1 を: 5 が: 5 と: 4 かも: 1 も: 2 は: 2 や: 1 ぐらい: 1 か: 1

投稿2015/05/13 21:21

katoy

総合スコア22324

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

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

0

Hashでもできますよ.出現数を数えてみました.

if parts == "助詞" if josiHash.include?(particle) josiHash[particle] += 1; else josiHash[particle] = 0; puts particle end else end

投稿2015/05/13 13:11

編集2015/05/13 13:16
katzC4ISR

総合スコア66

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

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

0

何をやりたいのかよく分かりませんが、「1文字単位で重複を排除」でいいなら、

lang

1text = "あいうえおあいうえおあいうえお" 2 3result = text.each_char.to_a.uniq.join 4p result #=> "あいうえお"

追記:
textが非常に大きくて、登場する文字の種類が少なければこっちがいいかも。

lang

1text = "あいうえおあいうえおあいうえお" 2 3result = text.each_char.with_object({}){|x,o|o[x]=true}.keys.join 4p result #=> "あいうえお"

投稿2015/05/13 12:14

編集2015/05/13 12:23
otn

総合スコア84555

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

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

0

lang

1puts "あいうえおあいうえおあいうえお".split('').uniq.join

お求めの回答になっていなかったとしたら申し訳ありません。

投稿2015/05/13 12:02

htsign

総合スコア870

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

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

0

とりあえず繰り返されている "あいうえお" を出力するだけなら下記のようにすれば出来ますが、「重複した文字列を排除」というのが具体的にどういうことなのかわからなければ、これで良いのかどうかはなんとも言えません。

lang

1text = "あいうえおあいうえおあいうえお" 2text.match(/^(.*?)\1*$/)[1]

投稿2015/05/13 11:06

ngyuki

総合スコア4514

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

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

hfhff

2015/05/13 11:31

説明不足ですみませんでした 追記したのでよろしければお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問