跳轉到主要內容
C# 範例僅適用於 Windows 版 FRE。
ABBYY FineReader Engine 可讓您為辨識語言附加各種類型的字典,從而大幅提升辨識品質。

字典類型

字典可分為數種類型:
這類字典已預先提供給具有內建字典支援的預定義語言 (請參閱預定義語言清單中的註解) 。此外,對於某些語言,.zmd 封存檔中還包含專業術語字典 (例如醫學和法律) 。標準字典由三個或四個檔案組成。這些檔案的名稱通常與語言的全名或簡稱相同,副檔名為 .amd、.amm、.amt 或 .ame。帶有 .amd、.amm 和 .amt 副檔名的檔案一定會存在。這些檔案儲存在下列資料夾中,且無法變更:Data/ExtendedDictionaries (Linux)、Resources/ExtendedDictionaries (macOS)、Data\ExtendedDictionaries (Windows)。ABBYY FineReader Engine 不提供任何 .ame 檔案:這是一種用於儲存字典擴充的格式,也就是使用者新增至字典中的單字。您可以在 ABBYY FineReader 中建立字典擴充;在該產品中,它稱為使用者字典。建立後,您可以將該檔案複製到上述 ABBYY FineReader Engine 資料夾下的對應資料夾中 (或者,也可以在 ILanguageDatabase::DictionaryExtensionsPath 屬性中指定其完整路徑) 。ABBYY FineReader 會將標準字典的擴充儲存在 %appdata%\ABBYY\FineReader\15\FineReaderShell\UserDictionaries。您可以使用 ABBYY FineReader Engine 中的 ILanguageDatabase::OpenDictionaryExtension 方法編輯字典擴充。這類字典由 StandardDictionaryDescription 物件描述。
可使用 Dictionary 物件建立。Dictionary 物件可讓您透過其方法新增和移除單字。在 Windows 中,Dictionary 物件也可讓您藉助 Dictionary dialog box 編輯字典。此對話方塊可讓您匯入任何採用 Windows ANSI 與 Unicode 編碼的文字檔 (唯一要求是單字必須以空格或其他非字母字元分隔) 。這類字典由 UserDictionaryDescription 物件描述。
FineReader Engine 中的使用者字典採用 .amd 檔案格式,且可為任何語言建立。對於不支援字典的語言,它可以取代標準字典。ABBYY FineReader 的使用者字典在 FineReader Engine 中稱為字典擴充;其檔案格式為 .ame,且只能針對支援字典的語言建立,作為該語言標準字典的擴充。
指定用來定義語言中哪些單字允許、哪些單字不允許的規則。這類字典由 RegExpDictionaryDescription 物件描述。
可讓您實作自己的字典類型。此字典表示為由用戶端實作的 IExternalDictionary 介面。您可以在此介面的說明中找到建立外部字典的指引。這類字典由 ExternalDictionaryDescription 物件描述。
ABBYY FineReader Engine 提供 DictionaryDescription 物件,用於描述所有類型的字典。這是不同字典類型描述所繼承的基礎物件。 所有這些字典描述都是 DictionaryDescriptions 集合的元素。

建立字典描述

若要建立字典描述,請使用 DictionaryDescriptions 物件的 AddNew 方法。此方法會傳回 DictionaryDescription 物件的參考。若要取得描述對應字典類型之物件的參考,請使用 DictionaryDescription 物件的 GetAsStandardDictionaryDescriptionGetAsUserDictionaryDescriptionGetAsRegExpDictionaryDescriptionGetAsExternalDictionaryDescription 方法。

字典屬性

對於每個字典,都必須指定該字典的識別屬性:
  • 對於標準字典 (StandardDictionaryDescription),請指定其 LanguageId 屬性,該屬性定義語言 ID。
  • 對於使用者字典 (UserDictionaryDescription),請指定其 FileName 屬性,該屬性提供使用者字典的路徑。
  • 對於以正規表示式為基礎的字典 (RegExpDictionaryDescription),請使用 SetText 方法指定正規表示式。請參閱 使用 ABBYY FineReader Engine 正規表示式
  • 對於外部字典 (ExternalDictionaryDescription),請使用 SetDictionary 方法指定字典。
所有類型的字典都會指派權重。字典的權重會影響辨識期間偵測到該字典中的單字時,這些單字所套用的權重。權重參數以百分比表示,且必須為非負值。權重為 0 並不自動表示不存在這類字典。允許使用超過 100% 的權重,但使用者在使用這類參數時必須格外小心。權重是在 IDictionaryDescription::Weight 屬性中指定,預設值為 100。 標準字典還有一個 CanUseTrigrams 選項,可允許或禁止程式使用根據所選字典建立的三字母組。三字母組是由三個字母組成的組合。並非所有這些組合都會出現在真實單字中。包含非字典三字母組的單字很可能無法發音。三字母組用於排除不可靠的單字。我們建議對「一般」標準字典啟用三字母組,並對術語字典停用此選項。

辨識語言的字典

文字辨識語言 (TextLanguage 物件) 可以同時具有包含該語言詞彙的字典,以及包含禁用詞彙的字典。前者會針對文字語言的每個基礎辨識語言分別指定,並可透過 IBaseLanguage::DictionaryDescriptions 屬性存取。基礎語言不一定會附加字典。禁用字典則會透過 ITextLanguage::ProhibitingDictionaries 屬性直接附加至文字辨識語言。 如果您希望在辨識期間只允許字典中的詞彙,請將 IBaseLanguage::AllowWordsFromDictionaryOnly 屬性設為 TRUE。在這種情況下,如果在基礎語言的字典中找不到某個詞彙,則只有在 ABBYY FineReader Engine 未找到任何字典中的候選詞時,該詞彙才可能出現在辨識結果文字中。

如何將字典附加到辨識語言

  1. 使用其中一種可用的方法建立 TextLanguage 物件 (例如 LanguageDatabase 物件的 CreateTextLanguage 方法) 。
  2. 取得新文字語言的基礎語言集合 (使用 BaseLanguages 屬性) 。
  3. 建立新的 BaseLanguage 物件,並將其加入基礎語言集合。
  4. 取得新基礎語言的字典描述集合 (DictionaryDescriptions 屬性) 。
  5. 建立字典描述,並將其加入基礎語言的字典描述集合。使用 DictionaryDescriptions 集合的 AddNew 方法。
您可以建立多個不同類型的字典,並將它們加入同一個基礎辨識語言的 DictionaryDescriptions 集合。
  1. [選用] 指定所建立字典的權重。
  2. 指定字典的識別屬性:標準字典使用 LanguageId 屬性,使用者字典使用 FileName 屬性,以正規表示式為基礎的字典請呼叫 IRegExpDictionaryDescription::SetText 方法,外部字典請呼叫 IExternalDictionaryDescription::SetDictionary 方法。
  3. [選用] 指定 BaseLanguage 物件的其他屬性。
  4. [選用] 使用 TextLanguage 物件的 ProhibitingDictionaries 屬性設定禁用字典。
  5. 將建立的 TextLanguage 物件指派給 RecognizerParams 物件的 TextLanguage 屬性。
若要在 Windows 中實作這些步驟,請參閱下列程式碼範例。
// 全域 ABBYY FineReader Engine 物件
FREngine::IEnginePtr Engine;
// LanguageDatabase 物件
FREngine::ILanguageDatabasePtr languageDatabase;
...
// 建立 TextLanguage 物件並取得其基礎語言集合
FREngine::ITextLanguagePtr pTextLang = languageDatabase->CreateTextLanguage();
FREngine::IBaseLanguagesPtr pBaseLangCollection = pTextLang->BaseLanguages;
// 建立 BaseLanguage 物件並取得其字典描述集合
FREngine::IBaseLanguagePtr pBaseLang = pBaseLangCollection->AddNew();
pBaseLang->InternalName = L"SampleBaseLanguage";
pBaseLang->PutLetterSet( FREngine::BLLS_Alphabet, L"abc123" );
FREngine::IDictionaryDescriptionsPtr pDictDescCollection = pBaseLang->DictionaryDescriptions;
// 建立標準字典描述並將其加入集合
FREngine::IDictionaryDescriptionPtr pDicDescription =
 pDictDescCollection->AddNew( FREngine::DT_SystemDictionary);
// [選用] 指定所建立字典的權重
pDicDescription->Weight = 100;
// 指定字典的識別屬性
FREngine::IStandardDictionaryDescriptionPtr pStandardDic = pDicDescription->GetAsStandardDictionaryDescription();
pStandardDic->LanguageId = FREngine::LI_EnglishUnitedStates;
// [選用] 指定 BaseLanguage 的其他屬性
pBaseLang->AllowWordsFromDictionaryOnly = VARIANT_TRUE;
// 建立 RecognizerParams 物件
FREngine::IRecognizerParamsPtr pParams = Engine->CreateRecognizerParams();
// 將建立的 TextLanguage 物件指派給 TextLanguage 屬性
pParams->TextLanguage = pTextLang;
...
// 全域 ABBYY FineReader Engine 物件
FREngine.IEngine engine;
// LanguageDatabase 物件
FREngine.ILanguageDatabase languageDatabase;
...
// 建立 TextLanguage 物件,並取得其基礎語言集合
FREngine.ITextLanguage TextLang = languageDatabase.CreateTextLanguage();
FREngine.IBaseLanguages BaseLangCollection = TextLang.BaseLanguages;
// 建立 BaseLanguage 物件,並取得其字典描述集合
FREngine.IBaseLanguage BaseLang = BaseLangCollection.AddNew();
BaseLang.InternalName = "SampleBaseLanguage";
BaseLang.set_LetterSet( FREngine.BaseLanguageLetterSetEnum.BLLS_Alphabet, "abc123" );
FREngine.IDictionaryDescriptions DictDescCollection = BaseLang.DictionaryDescriptions;
// 建立標準字典描述,並將其加入集合
FREngine.IDictionaryDescription DicDescription = DictDescCollection.AddNew( FREngine.DictionaryTypeEnum.DT_SystemDictionary );
// [可選] 指定所建立字典的權重
DicDescription.Weight = 100;
// 指定字典的識別屬性
FREngine.IStandardDictionaryDescription StandardDic = DicDescription.GetAsStandardDictionaryDescription();
StandardDic.LanguageId = FREngine.LanguageIdEnum.LI_EnglishUnitedStates;
// [可選] 指定 BaseLanguage 的其他屬性
BaseLang.AllowWordsFromDictionaryOnly = true;
// 建立 RecognizerParams 物件
FREngine.IRecognizerParams recParams = engine.CreateRecognizerParams();
// 將建立的 TextLanguage 物件指派給 TextLanguage 屬性
recParams.TextLanguage = TextLang;
...

快取字典

快取字典是一種小型字典 (約一百個詞彙) ,可在處理過程中輕鬆變更。當能夠更精確地選擇字典時,即可使用快取字典;例如,在處理期間發現了文件的其他資訊時。這類字典適合用於欄位層級的辨識。 例如,假設表單上有兩個需要辨識的欄位:城市名稱和街道名稱。您已辨識出城市名稱,並且有該城市的街道清單。在這種情況下,您可以載入包含街道名稱的適當快取字典,從而更快速且更準確地辨識街道名稱。 ABBYY FineReader Engine 提供 AddWordsToCacheDictionaryAddWordToCacheDictionaryCleanCacheDictionary 方法,這些都是 FRPage 物件的方法,可用於操作快取字典。
若要使用快取字典,您應將 IEngine::AutoCleanRecognizerSession 屬性設為 FALSE。AutoCleanRecognizerSession 屬性的預設值為 TRUE,這表示 FineReader Engine 會在每一頁辨識完成後清理其辨識工作階段,此時快取字典也會一併清除。為避免意外刪除使用者資料,FineReader Engine 禁止在此模式下使用快取字典。若您使用快取字典,則需由您自行在必要時呼叫 IEngine::CleanRecognizerSession 方法,手動清理辨識工作階段。請參閱該方法的說明,以了解何時需要清理辨識工作階段。

另請參閱

使用語言 辨識含有空格的單字