Ruby 如何计算段落中特定单词的实例数?

Ruby 如何计算段落中特定单词的实例数?,ruby,text,Ruby,Text,我想计算一组单词在文本文件的每个段落中出现的次数。我能够计算一组单词在整个文本中出现的次数 有人向我建议,我的代码真的有问题,所以我只想问我想做什么,如果你愿意,你可以看看我在底部的代码 因此,考虑到“frequency_count.txt”中有“苹果梨葡萄瓜猕猴桃”这个词,我想知道“苹果”在单独文件“test_ather.txt”的每个段落中出现的频率,梨出现的频率,等等,然后将这些数字打印成一系列数字行,每行对应一个段落 例如: apple, pear, grape, melon, kiwi

我想计算一组单词在文本文件的每个段落中出现的次数。我能够计算一组单词在整个文本中出现的次数

有人向我建议,我的代码真的有问题,所以我只想问我想做什么,如果你愿意,你可以看看我在底部的代码

因此,考虑到“frequency_count.txt”中有“苹果梨葡萄瓜猕猴桃”这个词,我想知道“苹果”在单独文件“test_ather.txt”的每个段落中出现的频率,梨出现的频率,等等,然后将这些数字打印成一系列数字行,每行对应一个段落

例如:

apple, pear, grape, melon, kiwi
3,5,2,7,8
2,3,1,6,7
5,6,8,2,3
其中每行对应一段

我对Ruby非常非常陌生,所以谢谢你的耐心

output_file = '/Users/yirenlu/Quora-Personal-Analytics/weka_input6.csv'
o = File.open(output_file, "r+")

common_words = '/Users/yirenlu/Quora-Personal-Analytics/frequency_count.txt'
c = File.open(common_words, "r")

c.each_line{|$line1|
    words1 = $line1.split
    words1.each{|w1|
        the_file = '/Users/yirenlu/Quora-Personal-Analytics/test_essay.txt'
        f = File.open(the_file, "r")
        rows = File.readlines("/Users/yirenlu/Quora-Personal-Analytics/test_essay.txt")
        text = rows.join
        paragraph = text.split(/\n\n/)
        paragraph.each{|p|
            h = Hash.new
            puts "this is each paragraph"
            p.each_line{|line|
                puts "this is each line"
                words = line.split
                words.each{|w|
                    if w1 == w
                        if h.has_key?(w)
                            h[w1] = h[w1] + 1
                        else
                            h[w1] = 1
                        end
                        $x = h[w1]
                    end
                }
            }
            o.print "#{$x},"
        }
    }
    o.print "\n"
    o.print "#{$line1}"
}

要计算一个单词在文本中出现的次数,请执行以下操作:

text = "word aaa word word word bbb ccc ccc"
text.scan(/\w+/).count("word") # => 4
要计算一组单词,请执行以下操作:

text = "word aaa word word word bbb ccc ccc"
wlist = text.scan(/\w+/)
wset = ["word", "ccc"]
result = {}
wset.each {|word| result[word] = wlist.count(word) }
result # => {"word" => 4, "ccc" => 2}
result["ccc"] # => 2

如果您习惯使用PHP或Perl,您可能会觉得像
$line1
这样的变量是局部变量,但这是全局变量。非常不鼓励使用它们,并且严格要求它们的实例数量非常少。在大多数情况下,您可以省略
$
,并通过适当的范围使用变量

这个例子也有几乎无法读取的缩进,尽管这可能是剪切粘贴过程的产物

通常,计数器需要创建一个默认值为零的散列,然后根据需要添加到该散列中:

# Create a hash where the default values for each key is 0
counter = Hash.new(0)

# Add to the counters where required
counter['foo'] += 1
counter['bar'] += 2

puts counter['foo']
# => 1
puts counter['baz']
# => 0

基本上你有你需要的,但一切都很混乱,只需要更好地组织。

这里有两个一行程序来计算字符串中单词的频率

第一种方法更容易理解,但效果较差:

txt.scan(/\w+/).group_by{|word| word.downcase}.map{|k,v| [k, v.size]}
# => [['word1', 1], ['word2', 5], ...]
第二个解决方案是:

txt.scan(/\w+/).inject(Hash.new(0)) { |hash, w| hash[w.downcase] += 1; hash}
# => {'word1' => 1, 'word2' => 5, ...}
那么这个呢:

# Create an array of regexes to be used in `scan' in the loop.
# `\b' makes sure that `barfoobar' does not match `bar' or `foo'.
p word_list = File.open("frequency_count.txt"){|io| io.read.scan(/\w+/)}.map{|w| /\b#{w}\b/}
File.open("test_essay.txt") do |io|
    loop do
        # Add lines to `paragraph' as long as there is a continuous line
        paragraph = ""
        # A `l.chomp.empty?' becomes true at paragraph border
        while l = io.gets and !l.chomp.empty?
            paragraph << l
        end
        p word_list.map{|re| paragraph.scan(re).length}
        # The end of file has been reached when `l == nil'
        break unless l
    end
end
#创建一个正则表达式数组,用于循环中的“scan”。
#`\b'确保'barfoobar'与'bar'或'foo'不匹配。
p word_list=File.open(“frequency_count.txt”){io | io.read.scan(/\w+/)}.map{w |/\b{w}\b/}
File.open(“test_article.txt”)do|io|
环道
#在“段落”中添加行,只要有一行是连续的
段落=“”
#“l.chomp.empty”在段落边界处变为真
而l=io.get和!l、 空的吗?

段落如果您使用以下内容,这可能会更短,更容易阅读:

  • CSV库
  • 使用贴图和块的功能性更强的方法
  • 需要“csv”
    常用词=%w(苹果梨葡萄瓜猕猴桃)
    text=File.open(“test_article.txt”).read
    def word_频率(单词、文本)
    words.map{word | text.scan(/\b{word}\b/).length}
    结束
    CSV.open(“file.CSV”、“wb”)do | CSV|
    段落=text.split/\n\n/
    各段均为|段落|
    
    csv这里有一个备选答案,为了简洁起见对其进行了调整(尽管不像我的另一个答案那么容易阅读)

    需要“csv”
    words=%w(苹果梨葡萄瓜猕猴桃)
    text=File.open(“test_article.txt”).read
    CSV.open(“file.CSV”、“wb”)do | CSV|
    
    text.split(/\n\n/).map{| p | csv我建议使用更具描述性的变量名和一致的缩进(特别是对于块),这会使问题更容易回答。你甚至可能自己发现错误!你“基本上不存在”一点也不。我试图改进你的代码,但结果表明,问题不仅仅在于处理散列。你发布的代码中有各种各样的错误。正如帕默所指出的,你甚至不做一致的缩进,所以人们不会喜欢阅读你的代码。扔掉你的代码,问别人你想做什么更容易。好的,这是一个简单的方法恩,我已经给了你一个相当完整的答案。:)你确定
    result@sawa我是如何留下它的吗?谢谢,修复了。啊,我不知道有一个csv库。这正是我需要的。谢谢!你愿意接受这个答案吗?(并投票赞成任何有用的答案)
    
    require 'csv'
    
    words = %w(apple pear grape melon kiwi)
    text = File.open("test_essay.txt").read
    
    CSV.open("file.csv", "wb") do |csv|
      text.split(/\n\n/).map {|p| csv << words.map {|w| p.scan(/\b#{w}\b/).length}}
    end