Go to the documentation of this file.00001
00002
00003
00004
00005 #ifndef AhoKorasickMorph_h
00006 #define AhoKorasickMorph_h
00007
00008
00009 #include "MorphAutomat.h"
00010 #include "../MorphWizardLib/FormInfo.h"
00011
00012
00013
00014 struct CLemmaInfoAndLemma
00015 {
00016 int m_LemmaStrNo;
00017 CLemmaInfo m_LemmaInfo;
00018
00019 bool operator < (const CLemmaInfoAndLemma& X) const
00020 {
00021 if (m_LemmaInfo.m_FlexiaModelNo != X.m_LemmaInfo.m_FlexiaModelNo)
00022 return m_LemmaInfo.m_FlexiaModelNo < X.m_LemmaInfo.m_FlexiaModelNo;
00023
00024 return m_LemmaStrNo < X.m_LemmaStrNo;
00025 };
00026
00027 };
00028
00029
00030
00031
00032 class CMorphDict
00033 {
00034
00035 protected:
00036
00037 CMorphAutomat* m_pFormAutomat;
00038
00039 vector<int> m_ModelsIndex;
00040
00041
00042
00043 struct IsLessMorphInterp
00044 {
00045 const CShortStringHolder& m_SearchInfos;
00046
00047 IsLessMorphInterp(const CShortStringHolder& SearchInfos) : m_SearchInfos(SearchInfos) {};
00048
00049 bool operator () (const CLemmaInfoAndLemma& _X1, const char* _X2) const
00050 {
00051 const char* base1 = m_SearchInfos[_X1.m_LemmaStrNo].GetString();
00052
00053 return strcmp(base1, _X2) < 0;
00054 };
00055 bool operator () (const char* _X1, const CLemmaInfoAndLemma& _X2) const
00056 {
00057 const char* base2 = m_SearchInfos[_X2.m_LemmaStrNo].GetString();
00058
00059 return strcmp(_X1, base2) < 0;
00060 };
00061 bool operator () (const CLemmaInfoAndLemma& _X1, const CLemmaInfoAndLemma& _X2) const
00062 {
00063 const char* base1 = m_SearchInfos[_X1.m_LemmaStrNo].GetString();
00064 const char* base2 = m_SearchInfos[_X2.m_LemmaStrNo].GetString();
00065
00066 return strcmp(base1, base2) < 0;
00067 };
00068
00069
00070 };
00071 IsLessMorphInterp m_SearchInfoLess;
00072 void GetLemmaInfos (const string& Text, size_t TextPos, vector<CAutomAnnotationInner>& Infos) const;
00073 void CreateModelsIndex();
00074
00075 public:
00076 vector<CFlexiaModel> m_FlexiaModels;
00077 vector<CAccentModel> m_AccentModels;
00078 CShortStringHolder m_Bases;
00079 vector<CLemmaInfoAndLemma> m_LemmaInfos;
00080 StringVector m_Prefixes;
00081 vector<BYTE> m_NPSs;
00082
00083 CMorphDict(MorphLanguageEnum Language);
00084 virtual ~CMorphDict();
00085 void InitAutomat(CMorphAutomat* pFormAutomat);
00086
00087
00088 bool Load(string GrammarFileName);
00089 bool Save(string GrammarFileName) const;
00090
00091
00092 void PredictBySuffix (const string& Text, size_t& TextOffset, size_t MinimalPredictSuffixlen, vector<CAutomAnnotationInner>& Infos) const;
00093 string GetAllMorphInterpsStr (const string& Text,const size_t TextPos, bool bFullInterp) const;
00094 };
00095
00096
00097
00098 #endif