いくつかの単純なデータを含むテキスト ファイルがあるとします。
elephant dog
elephant cat
elephant dog
cat dog
cat elephant
そして、単語がどのくらいの頻度で互いに関連付けられているかを確認して出力する必要があります (象と犬 2 回、象と猫 2 回、猫と犬 1 回)。どうすればそれを行うことができますか?
いくつかの単純なデータを含むテキスト ファイルがあるとします。
elephant dog
elephant cat
elephant dog
cat dog
cat elephant
そして、単語がどのくらいの頻度で互いに関連付けられているかを確認して出力する必要があります (象と犬 2 回、象と猫 2 回、猫と犬 1 回)。どうすればそれを行うことができますか?
コメントはさておき、この質問と回答が削除される可能性があることを理解した上で ;-)、次のことを提案します。
pairs = string.lines.collect {|l| l.chomp.split(' ').sort.join(',')} # eliminate ordering diffs
pairs.uniq.each {|p| puts "#{p} = #{pairs.count(p)}"}
http://rubyfiddle.com/riddles/a47c8を参照してください。
基準と反対票を投じるプロセスには「作業が必要」だと思うので、これを提供しています。
s = <<_
elephant dog
elephant cat
elephant dog
cat dog
cat elephant
_
s.scan(/(\w+)\s+(\w+)/).map(&:sort).inject(Hash.new(0)){|h, pair| h[pair]+= 1; h}
結果:
{
[
"dog",
"elephant"
] => 2,
[
"cat",
"elephant"
] => 2,
[
"cat",
"dog"
] => 1
}
s = <<-end
elephant dog
elephant cat
elephant dog
cat dog
cat elephant
end
ar = s.split("\n").map{|i| i.split}
# => [["elephant", "dog"],
# ["elephant", "cat"],
# ["elephant", "dog"],
# ["cat", "dog"],
# ["cat", "elephant"]]
ar.each_with_object({}){|i,h| h[i.sort] = ar.count{|j| i == j or i == j.reverse}}
# => {["dog", "elephant"]=>2, ["cat", "elephant"]=>2, ["cat", "dog"]=>1}