Have you ever started answering a question and found yourself wandering, exploring interesting, but tangential issues, or concepts you didn't fully understand? That's what happened to me here. Perhaps some of the ideas might prove useful in other settings, if not for the problem at hand.
For readability, we might define some helpers in the class String, but to avoid contamination, I'll use Refinements.     
Code
module StringHelpers
  refine String do
    def count_words
      remove_punctuation.split.count { |w|
        !(w.is_number? || w.size == 1 || w.is_email_address?) }
    end
    def remove_punctuation
      gsub(/[.!?,;:)](?:\s|$)|(?:^|\s)\(|\-|\n/,' ')
    end
    def is_number?
      self =~ /\A-?\d+(?:\.\d+)?\z/
    end
    def is_email_address?
      include?('@') # for testing only
    end
  end
end
module CountWords
   using StringHelpers
   def self.count_words_in_file(fname)
     IO.foreach(fname).reduce(0) { |t,l| t+l.count_words }
   end
end
Note that using must be in a module (possibly a class). It does not work in main, presumably because that would make the methods available in the class self.class #=> Object, which would defeat the purpose of Refinements. (Readers: please correct me if I'm wrong about the reason using must be in a module.)
Example
Let's first informally check that the helpers are working correctly:
module CheckHelpers
  using StringHelpers
  s = "You can reach my dog, a 10-year-old golden, at fido@dogs.org."
  p s = s.remove_punctuation
    #=> "You can reach my dog a 10 year old golden at fido@dogs.org."
  p words = s.split
    #=> ["You", "can", "reach", "my", "dog", "a", "10",
    #    "year", "old", "golden", "at", "fido@dogs.org."]
  p '123'.is_number?  #=> 0
  p '-123'.is_number? #=> 0
  p '1.23'.is_number? #=> 0
  p '123.'.is_number? #=> nil
  p "fido@dogs.org".is_email_address?    #=> true
  p "fido(at)dogs.org".is_email_address? #=> false 
  p s.count_words     #=> 9 (`'a'`, `'10'` and "fido@dogs.org" excluded)
  s = "My cat, who has 4 lives remaining, is at abbie(at)felines.org."
  p s = s.remove_punctuation
  p s.count_words
end
All looks OK. Next, put I'll put some text in a file:
FName = "pets"
text =<<_
My cat, who has 4 lives remaining, is at abbie(at)felines.org.
You can reach my dog, a 10-year-old golden, at fido@dogs.org.
_
File.write(FName, text)
  #=> 125
and confirm the file contents:
File.read(FName)
  #=> "My cat, who has 4 lives remaining, is at  abbie(at)felines.org.\n
  #   You can reach my dog, a 10-year-old golden, at fido@dogs.org.\n" 
Now, count the words:
CountWords.count_words_in_file(FName)
  #=> 18 (9 in ech line)
Note that there is at least one problem with the removal of punctuation. It has to do with the hyphen. Any idea what that might be?