class_docstr: Translation model that keeps track of vacant positions in the target
  sentence to decide where to place translated words
  
  >>> bitext = []
  >>> bitext.append(AlignedSent(['klein', 'ist', 'das', 'haus'], ['the', 'house', 'is', 'small']))
  >>> bitext.append(AlignedSent(['das', 'haus', 'war', 'ja', 'groß'], ['the', 'house', 'was', 'big']))
  >>> bitext.append(AlignedSent(['das', 'buch', 'ist', 'ja', 'klein'], ['the', 'book', 'is', 'small']))
  >>> bitext.append(AlignedSent(['ein', 'haus', 'ist', 'klein'], ['a', 'house', 'is', 'small']))
  >>> bitext.append(AlignedSent(['das', 'haus'], ['the', 'house']))
  >>> bitext.append(AlignedSent(['das', 'buch'], ['the', 'book']))
  >>> bitext.append(AlignedSent(['ein', 'buch'], ['a', 'book']))
  >>> bitext.append(AlignedSent(['ich', 'fasse', 'das', 'buch', 'zusammen'], ['i', 'summarize', 'the', 'book']))
  >>> bitext.append(AlignedSent(['fasse', 'zusammen'], ['summarize']))
  >>> src_classes = {'the': 0, 'a': 0, 'small': 1, 'big': 1, 'house': 2, 'book': 2, 'is': 3, 'was': 3, 'i': 4, 'summarize': 5 }
  >>> trg_classes = {'das': 0, 'ein': 0, 'haus': 1, 'buch': 1, 'klein': 2, 'groß': 2, 'ist': 3, 'war': 3, 'ja': 4, 'ich': 5, 'fasse': 6, 'zusammen': 6 }
  
  >>> ibm5 = IBMModel5(bitext, 5, src_classes, trg_classes)
  
  >>> print(round(ibm5.head_vacancy_table[1][1][1], 3))
  1.0
  >>> print(round(ibm5.head_vacancy_table[2][1][1], 3))
  0.0
  >>> print(round(ibm5.non_head_vacancy_table[3][3][6], 3))
  1.0
  
  >>> print(round(ibm5.fertility_table[2]['summarize'], 3))
  1.0
  >>> print(round(ibm5.fertility_table[1]['book'], 3))
  1.0
  
  >>> print(round(ibm5.p1, 3))
  0.033
  
  >>> test_sentence = bitext[2]
  >>> test_sentence.words
  ['das', 'buch', 'ist', 'ja', 'klein']
  >>> test_sentence.mots
  ['the', 'book', 'is', 'small']
  >>> test_sentence.alignment
  Alignment([(0, 0), (1, 1), (2, 2), (3, None), (4, 3)])
code: def reset_probabilities(self):
      super().reset_probabilities()
      self.head_vacancy_table = defaultdict(
          lambda: defaultdict(
              lambda: defaultdict(lambda: self.MIN_PROB)
          )
      )
      """
          dict[int][int][int]: float. Probability(vacancy difference |
          number of remaining valid positions,target word class).
          Values accessed as ``head_vacancy_table[dv][v_max][trg_class]``.
          """
  
      self.non_head_vacancy_table = defaultdict(
          lambda: defaultdict(
              lambda: defaultdict(lambda: self.MIN_PROB)
          )
      )
      """
          dict[int][int][int]: float. Probability(vacancy difference |
          number of remaining valid positions,target word class).
          Values accessed as ``non_head_vacancy_table[dv][v_max][trg_class]``.
          """
  
imports: import warnings
  from collections import defaultdict
  from math import factorial
  from nltk.translate import AlignedSent, Alignment, IBMModel, IBMModel4
  from nltk.translate.ibm_model import Counts, longest_target_sentence_length
label_desc: Use image node_id 2 for calling the IBMModel5 obj's underlying member method code with example usage: obj.reset_probabilities() without return types