In Files
Namespace
Information
Infinitive
Functions for deriving the infinitive forms of conjugated English words.
Constants
- IRREGULAR
 Irregular word => infinitive form
- RULES
 Suffix Rules
- RULE_ORDER
 List of rule suffixes in processing order.
- IRREGULAR_RULE
 
Public Class Methods
        
          ditto_rule(suffix, suffix1, suffix2, order, number)
          click to toggle source
        
        
        Use the original string. (-4)
     # File lib/english/infinitive.rb, line 631
631:     def self.ditto_rule(suffix, suffix1, suffix2, order, number)
632:       RULES[suffix] = Rule.new(:ditto, suffix, suffix1, suffix2, order, number)
633:     end
          
        
          infinitives(word)
          click to toggle source
        
        
        Returns the infinative and any acceptable alternatives.
     # File lib/english/infinitive.rb, line 712
712:     def self.infinitives(word)
713:       information(word)[1..1]
714:     end
          
        
          information(word)
          click to toggle source
        
        
        Return the rule applies and all viable infinitive forms of the given word.
     # File lib/english/infinitive.rb, line 719
719:     def self.information(word)
720:       word  = word.to_s
721:       word1 = word2 = suffix = rule = newword = ''
722: 
723:       if IRREGULAR.key?(word)
724:         word1 = IRREGULAR[word]
725:         word2 = nil
726:         rule  = IRREGULAR_RULE
727:       else
728:         prefixes = prefixes(word)
729:         rule = rule(word, prefixes)
730: 
731:         $stderr.puts "prefixes: %p" % prefixes if $DEBUG
732: 
733:         if rule
734:           suffix = rule.suffix
735: 
736:           $stderr.puts "Using rule %p (%p) for suffix %p" % 
737:               [rule.number, rule.type, rule.suffix] if $DEBUG
738: 
739:           case rule.type #shortest_prefix
740:           when :long
741:             word1 = prefixes[suffix][0]
742:             word2 = prefixes[suffix][1]
743:           when :short
744:             word1 = prefixes[suffix].last + rule.suffix1
745:             word2 = ''
746:           when :letter
747:             word1 = prefixes[suffix].last + rule.suffix1
748:             word2 = prefixes[suffix].last
749:           when :special
750:             word1 = prefixes[suffix].last + rule.suffix1
751:             word2 = prefixes[suffix].last + rule.suffix2
752:           when :ditto
753:             word1 = word
754:             word2 = ''
755:           else
756:             raise IndexError, "Couldn't find rule for shortest prefix %p" %  rule.type #shortest_prefix
757:           end
758: 
759:           $stderr.puts "For %p: word1: %p, word2: %p" % [rule.type, word1, word2] if $DEBUG
760: 
761:           # Rules 12b and 15: Strip off 'ed' or 'ing'.
762:           if rule.number == '12b' or rule.number == '15'
763:             # Do we have a monosyllable of this form:
764:             # o 0+ Consonants
765:             # o 1+ Vowel
766:             # o    2 Non-wx
767:             # Eg: tipped => tipp?
768:             # Then return tip and tipp.
769:             # Eg: swimming => swimm?
770:             # Then return tipswim and swimm.
771:             if /^([^aeiou]*[aeiou]+)([^wx])\22$$/ =~ word2
772:               word1 = $1 + $2
773:               word2 = $1 + $2 + $2
774:             end
775:           end
776:         else
777:           word1 = word
778:           word2 = nil
779:           rule  = IRREGULAR_RULE
780:         end
781:       end
782: 
783:       return rule, word1, word2
784:     end
          
        
          inifinitive(word)
          click to toggle source
        
        
        Returns the affinative and any acceptable alternatives.
     # File lib/english/infinitive.rb, line 707
707:     def self.inifinitive(word)
708:       information(word)[1]
709:     end
          
        
          letter_rule(suffix, suffix1, suffix2, order, number)
          click to toggle source
        
        
        Letter rule. (-2)
     # File lib/english/infinitive.rb, line 621
621:     def self.letter_rule(suffix, suffix1, suffix2, order, number)
622:       RULES[suffix] = Rule.new(:letter, suffix, suffix1, suffix2, order, number)
623:     end
          
        
          long_rule(suffix, suffix1, suffix2, order, number)
          click to toggle source
        
        
        Long rule (longest prefix). (0)
     # File lib/english/infinitive.rb, line 606
606:     def self.long_rule(suffix, suffix1, suffix2, order, number)
607:       RULES[suffix] = Rule.new(:long, suffix, suffix1, suffix2, order, number)
608:     end
          
        
          prefixes(word)
          click to toggle source
        
        
        Calculate the prefixes for a given word.
     # File lib/english/infinitive.rb, line 817
817:     def self.prefixes(word)
818:       # Build up prefix[suffix] as an array of prefixes, from longest to shortest.
819:       prefix, suffix = nil, nil
820:       prefixes = Hash.new{ |h,k| h[k] = [] }
821:       # Build the hash of prefixes for the word
822:       1.upto(word.length) do |i|
823:         prefix = word[0, i]
824:         suffix = word[i..1]
825:         (suffix.length - 1).downto(0) do |j|
826:           newword = prefix + suffix[0,j]
827:           prefixes[suffix].push(newword)
828:         end
829:       end
830:       return prefixes
831:     end
          
        
          rule(word, prefixes=nil)
          click to toggle source
        
        
        Lookup the rule that applies to a given word.
     # File lib/english/infinitive.rb, line 787
787:     def self.rule(word, prefixes=nil)
788:       prefixes = prefixes(word) unless prefixes
789: 
790:       if IRREGULAR.key?(word)
791:         IRREGULAR_RULE
792:       else
793:         # Build up prefix[suffix] as an array of prefixes, from longest to shortest.
794:         prefix, suffix = nil, nil
795:         prefixes = Hash.new{ |h,k| h[k] = [] }
796:         # Build the hash of prefixes for the word
797:         1.upto(word.length) do |i|
798:           prefix = word[0, i]
799:           suffix = word[i..1]
800:           (suffix.length - 1).downto(0) do |j|
801:             newword = prefix + suffix[0,j]
802:             prefixes[suffix].push(newword)
803:           end
804:         end
805:         # Now check for rules covering the prefixes for this word, picking
806:         # the first one if one was found.
807:         suffix = (RULE_ORDER & prefixes.keys).first
808:         if suffix
809:           RULES[suffix]
810:         else
811:           IRREGULAR_RULE
812:         end
813:       end
814:     end
          
        
          second_rule(suffix, suffix1, suffix2, order, number)
          click to toggle source
        
        
        Longer Rule (2nd longest prefix). (1)
     # File lib/english/infinitive.rb, line 611
611:     def self.second_rule(suffix, suffix1, suffix2, order, number)
612:       RULES[suffix] = Rule.new(:second, suffix, suffix1, suffix2, order, number)
613:     end
          
        
          short_rule(suffix, suffix1, suffix2, order, number)
          click to toggle source
        
        
        Short Rule. (-1)
     # File lib/english/infinitive.rb, line 616
616:     def self.short_rule(suffix, suffix1, suffix2, order, number)
617:       RULES[suffix] = Rule.new(:short, suffix, suffix1, suffix2, order, number)
618:     end
          Disabled; run with --debug to generate this.