tesseract  4.00.00dev
tesseract::UnicharAmbigs Class Reference

#include <ambigs.h>

Public Member Functions

 UnicharAmbigs ()
 
 ~UnicharAmbigs ()
 
const UnicharAmbigsVectordang_ambigs () const
 
const UnicharAmbigsVectorreplace_ambigs () const
 
void InitUnicharAmbigs (const UNICHARSET &unicharset, bool use_ambigs_for_adaption)
 
void LoadUniversal (const UNICHARSET &encoder_set, UNICHARSET *unicharset)
 
void LoadUnicharAmbigs (const UNICHARSET &encoder_set, TFile *ambigs_file, int debug_level, bool use_ambigs_for_adaption, UNICHARSET *unicharset)
 
const UnicharIdVectorOneToOneDefiniteAmbigs (UNICHAR_ID unichar_id) const
 
const UnicharIdVectorAmbigsForAdaption (UNICHAR_ID unichar_id) const
 
const UnicharIdVectorReverseAmbigsForAdaption (UNICHAR_ID unichar_id) const
 

Detailed Description

Definition at line 145 of file ambigs.h.

Constructor & Destructor Documentation

◆ UnicharAmbigs()

tesseract::UnicharAmbigs::UnicharAmbigs ( )
inline

Definition at line 147 of file ambigs.h.

147 {}

◆ ~UnicharAmbigs()

tesseract::UnicharAmbigs::~UnicharAmbigs ( )
inline

Definition at line 148 of file ambigs.h.

148  {
149  replace_ambigs_.delete_data_pointers();
150  dang_ambigs_.delete_data_pointers();
151  one_to_one_definite_ambigs_.delete_data_pointers();
152  }
void delete_data_pointers()

Member Function Documentation

◆ AmbigsForAdaption()

const UnicharIdVector* tesseract::UnicharAmbigs::AmbigsForAdaption ( UNICHAR_ID  unichar_id) const
inline

Definition at line 192 of file ambigs.h.

193  {
194  if (ambigs_for_adaption_.empty()) return NULL;
195  return ambigs_for_adaption_[unichar_id];
196  }

◆ dang_ambigs()

const UnicharAmbigsVector& tesseract::UnicharAmbigs::dang_ambigs ( ) const
inline

Definition at line 154 of file ambigs.h.

154 { return dang_ambigs_; }

◆ InitUnicharAmbigs()

void tesseract::UnicharAmbigs::InitUnicharAmbigs ( const UNICHARSET unicharset,
bool  use_ambigs_for_adaption 
)

Definition at line 53 of file ambigs.cpp.

54  {
55  for (int i = 0; i < unicharset.size(); ++i) {
56  replace_ambigs_.push_back(NULL);
57  dang_ambigs_.push_back(NULL);
58  one_to_one_definite_ambigs_.push_back(NULL);
59  if (use_ambigs_for_adaption) {
60  ambigs_for_adaption_.push_back(NULL);
61  reverse_ambigs_for_adaption_.push_back(NULL);
62  }
63  }
64 }
int push_back(T object)
int size() const
Definition: unicharset.h:299

◆ LoadUnicharAmbigs()

void tesseract::UnicharAmbigs::LoadUnicharAmbigs ( const UNICHARSET encoder_set,
TFile ambigs_file,
int  debug_level,
bool  use_ambigs_for_adaption,
UNICHARSET unicharset 
)

Definition at line 74 of file ambigs.cpp.

78  {
79  int i, j;
80  UnicharIdVector *adaption_ambigs_entry;
81  if (debug_level) tprintf("Reading ambiguities\n");
82 
83  int test_ambig_part_size;
84  int replacement_ambig_part_size;
85  // The space for buffer is allocated on the heap to avoid
86  // GCC frame size warning.
87  const int kBufferSize = 10 + 2 * kMaxAmbigStringSize;
88  char *buffer = new char[kBufferSize];
89  char replacement_string[kMaxAmbigStringSize];
90  UNICHAR_ID test_unichar_ids[MAX_AMBIG_SIZE + 1];
91  int line_num = 0;
92  int type = NOT_AMBIG;
93 
94  // Determine the version of the ambigs file.
95  int version = 0;
96  ASSERT_HOST(ambig_file->FGets(buffer, kBufferSize) != NULL &&
97  strlen(buffer) > 0);
98  if (*buffer == 'v') {
99  version = static_cast<int>(strtol(buffer+1, NULL, 10));
100  ++line_num;
101  } else {
102  ambig_file->Rewind();
103  }
104  while (ambig_file->FGets(buffer, kBufferSize) != NULL) {
105  chomp_string(buffer);
106  if (debug_level > 2) tprintf("read line %s\n", buffer);
107  ++line_num;
108  if (!ParseAmbiguityLine(line_num, version, debug_level, encoder_set,
109  buffer, &test_ambig_part_size, test_unichar_ids,
110  &replacement_ambig_part_size,
111  replacement_string, &type)) continue;
112  // Construct AmbigSpec and add it to the appropriate AmbigSpec_LIST.
113  AmbigSpec *ambig_spec = new AmbigSpec();
114  if (!InsertIntoTable((type == REPLACE_AMBIG) ? replace_ambigs_
115  : dang_ambigs_,
116  test_ambig_part_size, test_unichar_ids,
117  replacement_ambig_part_size, replacement_string, type,
118  ambig_spec, unicharset))
119  continue;
120 
121  // Update one_to_one_definite_ambigs_.
122  if (test_ambig_part_size == 1 &&
123  replacement_ambig_part_size == 1 && type == DEFINITE_AMBIG) {
124  if (one_to_one_definite_ambigs_[test_unichar_ids[0]] == NULL) {
125  one_to_one_definite_ambigs_[test_unichar_ids[0]] = new UnicharIdVector();
126  }
127  one_to_one_definite_ambigs_[test_unichar_ids[0]]->push_back(
128  ambig_spec->correct_ngram_id);
129  }
130  // Update ambigs_for_adaption_.
131  if (use_ambigs_for_adaption) {
132  GenericVector<UNICHAR_ID> encoding;
133  // Silently ignore invalid strings, as before, so it is safe to use a
134  // universal ambigs file.
135  if (unicharset->encode_string(replacement_string, true, &encoding,
136  NULL, NULL)) {
137  for (i = 0; i < test_ambig_part_size; ++i) {
138  if (ambigs_for_adaption_[test_unichar_ids[i]] == NULL) {
139  ambigs_for_adaption_[test_unichar_ids[i]] = new UnicharIdVector();
140  }
141  adaption_ambigs_entry = ambigs_for_adaption_[test_unichar_ids[i]];
142  for (int r = 0; r < encoding.size(); ++r) {
143  UNICHAR_ID id_to_insert = encoding[r];
144  ASSERT_HOST(id_to_insert != INVALID_UNICHAR_ID);
145  // Add the new unichar id to adaption_ambigs_entry (only if the
146  // vector does not already contain it) keeping it in sorted order.
147  for (j = 0; j < adaption_ambigs_entry->size() &&
148  (*adaption_ambigs_entry)[j] > id_to_insert; ++j);
149  if (j < adaption_ambigs_entry->size()) {
150  if ((*adaption_ambigs_entry)[j] != id_to_insert) {
151  adaption_ambigs_entry->insert(id_to_insert, j);
152  }
153  } else {
154  adaption_ambigs_entry->push_back(id_to_insert);
155  }
156  }
157  }
158  }
159  }
160  }
161  delete[] buffer;
162 
163  // Fill in reverse_ambigs_for_adaption from ambigs_for_adaption vector.
164  if (use_ambigs_for_adaption) {
165  for (i = 0; i < ambigs_for_adaption_.size(); ++i) {
166  adaption_ambigs_entry = ambigs_for_adaption_[i];
167  if (adaption_ambigs_entry == NULL) continue;
168  for (j = 0; j < adaption_ambigs_entry->size(); ++j) {
169  UNICHAR_ID ambig_id = (*adaption_ambigs_entry)[j];
170  if (reverse_ambigs_for_adaption_[ambig_id] == NULL) {
171  reverse_ambigs_for_adaption_[ambig_id] = new UnicharIdVector();
172  }
173  reverse_ambigs_for_adaption_[ambig_id]->push_back(i);
174  }
175  }
176  }
177 
178  // Print what was read from the input file.
179  if (debug_level > 1) {
180  for (int tbl = 0; tbl < 2; ++tbl) {
181  const UnicharAmbigsVector &print_table =
182  (tbl == 0) ? replace_ambigs_ : dang_ambigs_;
183  for (i = 0; i < print_table.size(); ++i) {
184  AmbigSpec_LIST *lst = print_table[i];
185  if (lst == NULL) continue;
186  if (!lst->empty()) {
187  tprintf("%s Ambiguities for %s:\n",
188  (tbl == 0) ? "Replaceable" : "Dangerous",
189  unicharset->debug_str(i).string());
190  }
191  AmbigSpec_IT lst_it(lst);
192  for (lst_it.mark_cycle_pt(); !lst_it.cycled_list(); lst_it.forward()) {
193  AmbigSpec *ambig_spec = lst_it.data();
194  tprintf("wrong_ngram:");
195  UnicharIdArrayUtils::print(ambig_spec->wrong_ngram, *unicharset);
196  tprintf("correct_fragments:");
197  UnicharIdArrayUtils::print(ambig_spec->correct_fragments, *unicharset);
198  }
199  }
200  }
201  if (use_ambigs_for_adaption) {
202  for (int vec_id = 0; vec_id < 2; ++vec_id) {
203  const GenericVector<UnicharIdVector *> &vec = (vec_id == 0) ?
204  ambigs_for_adaption_ : reverse_ambigs_for_adaption_;
205  for (i = 0; i < vec.size(); ++i) {
206  adaption_ambigs_entry = vec[i];
207  if (adaption_ambigs_entry != NULL) {
208  tprintf("%sAmbigs for adaption for %s:\n",
209  (vec_id == 0) ? "" : "Reverse ",
210  unicharset->debug_str(i).string());
211  for (j = 0; j < adaption_ambigs_entry->size(); ++j) {
212  tprintf("%s ", unicharset->debug_str(
213  (*adaption_ambigs_entry)[j]).string());
214  }
215  tprintf("\n");
216  }
217  }
218  }
219  }
220  }
221 }
int UNICHAR_ID
Definition: unichar.h:33
#define MAX_AMBIG_SIZE
Definition: ambigs.h:30
voidpf void uLong size
Definition: ioapi.h:39
#define tprintf(...)
Definition: tprintf.h:31
const char * string() const
Definition: strngs.cpp:198
int size() const
Definition: genericvector.h:72
#define ASSERT_HOST(x)
Definition: errcode.h:84
void chomp_string(char *str)
Definition: helpers.h:82
bool encode_string(const char *str, bool give_up_on_failure, GenericVector< UNICHAR_ID > *encoding, GenericVector< char > *lengths, int *encoded_length) const
Definition: unicharset.cpp:234
GenericVector< AmbigSpec_LIST * > UnicharAmbigsVector
Definition: ambigs.h:143
GenericVector< UNICHAR_ID > UnicharIdVector
Definition: ambigs.h:34
const int kMaxAmbigStringSize
Definition: ambigs.cpp:40
static void print(const UNICHAR_ID array[], const UNICHARSET &unicharset)
Definition: ambigs.h:98
STRING debug_str(UNICHAR_ID id) const
Definition: unicharset.cpp:318

◆ LoadUniversal()

void tesseract::UnicharAmbigs::LoadUniversal ( const UNICHARSET encoder_set,
UNICHARSET unicharset 
)

Definition at line 67 of file ambigs.cpp.

68  {
69  TFile file;
70  if (!file.Open(kUniversalAmbigsFile, ksizeofUniversalAmbigsFile)) return;
71  LoadUnicharAmbigs(encoder_set, &file, 0, false, unicharset);
72 }
const int ksizeofUniversalAmbigsFile
const char kUniversalAmbigsFile[]
void LoadUnicharAmbigs(const UNICHARSET &encoder_set, TFile *ambigs_file, int debug_level, bool use_ambigs_for_adaption, UNICHARSET *unicharset)
Definition: ambigs.cpp:74

◆ OneToOneDefiniteAmbigs()

const UnicharIdVector* tesseract::UnicharAmbigs::OneToOneDefiniteAmbigs ( UNICHAR_ID  unichar_id) const
inline

Definition at line 181 of file ambigs.h.

182  {
183  if (one_to_one_definite_ambigs_.empty()) return NULL;
184  return one_to_one_definite_ambigs_[unichar_id];
185  }

◆ replace_ambigs()

const UnicharAmbigsVector& tesseract::UnicharAmbigs::replace_ambigs ( ) const
inline

Definition at line 155 of file ambigs.h.

155 { return replace_ambigs_; }

◆ ReverseAmbigsForAdaption()

const UnicharIdVector* tesseract::UnicharAmbigs::ReverseAmbigsForAdaption ( UNICHAR_ID  unichar_id) const
inline

Definition at line 201 of file ambigs.h.

202  {
203  if (reverse_ambigs_for_adaption_.empty()) return NULL;
204  return reverse_ambigs_for_adaption_[unichar_id];
205  }

The documentation for this class was generated from the following files: