#include "COMSyntaxHolder.h"
#define COM_TRY try {
#define COM_CATCH(msg) } catch(...) { ErrorMessage(msg); return FALSE; }
CCOMSyntaxHolder::CCOMSyntaxHolder()
{
};
CCOMSyntaxHolder::~CCOMSyntaxHolder()
{
DeleteProcessors();
};
BOOL CCOMSyntaxHolder::LoadSyntaxModule(MorphLanguageEnum langua)
{
try
{
m_piSentCollection = 0;
HRESULT hr = m_piSentCollection.CreateInstance(__uuidof(SYNANLib::SentencesCollection));
if( FAILED(hr) )
{
ErrorMessage("SynAn has crushed, maybe \"SynAn.dll\" is not registered.");
return FALSE;
}
m_piSentCollection->SyntaxLanguage = langua;
m_piSentCollection->SetLemmatizer(m_piLemmatizer);
if (langua != morphRussian)
{
m_piSentCollection->EnableThesauri = FALSE;
};
m_piSentCollection->KillHomonymsMode = CoverageKillHomonyms;
hr = m_piSentCollection->InitializeProcesser();
if( FAILED(hr) )
{
ErrorMessage("Can not load syntax dictionaries.");
return FALSE;
}
}
catch(...)
{
ErrorMessage("SynAn has crushed, maybe \"SynAn.dll\" is not registered.");
return FALSE;
}
return TRUE;
};
BOOL CCOMSyntaxHolder::LoadSyntax(MorphLanguageEnum langua)
{
HRESULT hr;
try
{
m_piGraphan = 0;
m_piGraphan.CreateInstance(__uuidof(GRAPHANLib::GraphmatFile));
m_piGraphan->Language = langua;
m_piGraphan->LoadDicts();
m_piLemmatizer = 0;
if (langua == morphRussian)
hr = m_piLemmatizer.CreateInstance(__uuidof(LEMMATIZERLib::LemmatizerRussian));
else
if (langua == morphGerman)
hr = m_piLemmatizer.CreateInstance(__uuidof(LEMMATIZERLib::LemmatizerGerman));
else
if (langua == morphEnglish)
hr = m_piLemmatizer.CreateInstance(__uuidof(LEMMATIZERLib::LemmatizerEnglish));
if( FAILED(hr) )
{
ErrorMessage("CCOMSyntaxHolder", "MorphAn has crushed, maybe \"lemmatizer.dll\" is not registered.");
return FALSE;
}
hr = m_piLemmatizer->LoadDictionariesRegistry();
if( FAILED(hr) )
{
ErrorMessage("Can not load morphology dictionaries.");
return FALSE;
}
m_pGramTab = 0;
if (langua == morphRussian)
hr = m_pGramTab.CreateInstance(__uuidof(AGRAMTABLib::RusGramTab));
else
if (langua == morphGerman)
hr = m_pGramTab.CreateInstance(__uuidof(AGRAMTABLib::GerGramTab));
else
if (langua == morphEnglish)
hr = m_pGramTab.CreateInstance(__uuidof(AGRAMTABLib::EngGramTab));
if( FAILED(hr) )
{
ErrorMessage("MorphAn has crushed, maybe \"agramtab.dll\" is not registered.");
return FALSE;
}
hr = m_pGramTab->Load();
if( FAILED(hr) )
{
ErrorMessage("Can not load rusgramtab .");
return FALSE;
}
}
catch(...)
{
ErrorMessage("MorphAn has crushed, maybe \"lemmatizer.dll\" is not registered.");
return FALSE;
}
try
{
m_piAfterMorphPlmLines = 0;
m_piBeforeSyntaxPlmLines = 0;
if( FAILED( m_piMAPost.CreateInstance(__uuidof(MAPOSTLib::MAPost)) ) )
ErrorMessage("Mapost has crushed, maybe \"Mapost.dll\" is not registered.");
if (langua != morphEnglish)
m_piMAPost->Init(langua, m_piLemmatizer, m_pGramTab);
}
catch(...)
{
ErrorMessage("Postmorphology has crushed, maybe \"MApost.dll\" is not registered.");
return FALSE;
}
if (!LoadSyntaxModule(langua))
return FALSE;
m_CurrentLanguage = langua;
return TRUE;
};
BOOL CCOMSyntaxHolder::BuildBeforeSyntax(string str, BOOL bFile, BOOL bWriteIntermFiles, BOOL bSaveIntermResults)
{
m_piBeforeSyntaxPlmLines = 0;
m_piAfterMorphPlmLines = 0;
HRESULT hr = m_piAfterMorphPlmLines.CreateInstance(__uuidof(LEMMATIZERLib::PLMLineCollection));
m_piAfterMorphPlmLines->AttachLemmatizer(m_piLemmatizer);
m_piSentCollection->ClearSentences();
string log_path;
string FileName = "rossdev.log";
try {
log_path = GetRegistryString( "Software\\Dialing\\Logs\\Main" );
log_path += "/";
}
catch (...) {
};
if (bFile)
if (!FileExists(str.c_str()))
{
ErrorMessage (Format("file %s is not found", str.c_str()));
return FALSE;
};
COM_TRY
if( bFile )
m_piGraphan->LoadFileToGraphan(_bstr_t(str.c_str()).copy());
else
m_piGraphan->LoadStringToGraphan(_bstr_t(str.c_str()).copy());
COM_CATCH( "GraphAn has crushed.");
COM_TRY
m_piAfterMorphPlmLines->ProcessHyphenWords(m_piGraphan);
m_piAfterMorphPlmLines->ProcessPlmLines(m_piGraphan);
if (bWriteIntermFiles)
m_piAfterMorphPlmLines->SaveToFile(string(log_path+"before.lem").c_str());
if (!bSaveIntermResults)
m_piGraphan->FreeTable();
COM_CATCH( "MorphAn has crushed.");
COM_TRY
if (m_CurrentLanguage == morphEnglish)
{
m_piBeforeSyntaxPlmLines = 0;
m_piBeforeSyntaxPlmLines .CreateInstance(__uuidof(LEMMATIZERLib::PLMLineCollection));
m_piBeforeSyntaxPlmLines->AttachLemmatizer(m_piLemmatizer);
m_piBeforeSyntaxPlmLines->CopyItems(m_piAfterMorphPlmLines);
}
else
m_piBeforeSyntaxPlmLines = m_piMAPost->ProcessData(m_piAfterMorphPlmLines);
if (bWriteIntermFiles)
m_piBeforeSyntaxPlmLines->SaveToFile(string(log_path+"after.lem").c_str());
COM_CATCH( "PostMorphology has crushed.");
if (!bSaveIntermResults)
m_piAfterMorphPlmLines->Clear();
return TRUE;
};
BOOL CCOMSyntaxHolder::BuildSyntax(BOOL bSaveIntermResults)
{
COM_TRY
assert( !(m_piSentCollection == NULL) );
HRESULT hr = m_piSentCollection->raw_ProcessData(m_piBeforeSyntaxPlmLines);
if( FAILED(hr) )
{
m_piBeforeSyntaxPlmLines = 0;
ErrorMessage("SynAn has crushed.");
return FALSE;
}
if (!bSaveIntermResults)
m_piBeforeSyntaxPlmLines->Clear();
COM_CATCH( "SynAn has crushed.")
return TRUE;
};
BOOL CCOMSyntaxHolder::GetSentencesFromSynAn(string str, BOOL bFile, BOOL bWriteIntermFiles, BOOL bSaveIntermResults)
{
if (!BuildBeforeSyntax(str, bFile, bWriteIntermFiles, bSaveIntermResults))
return FALSE;
return BuildSyntax(bSaveIntermResults);
}
void CCOMSyntaxHolder::DeleteProcessors()
{
m_piLemmatizer = NULL;
m_pGramTab = NULL;
m_piSentCollection = NULL;
m_piGraphan = 0;
m_piAfterMorphPlmLines = 0;
m_piBeforeSyntaxPlmLines = 0;
m_piMAPost = 0;
};
string GetClauseTypeDescr(MorphLanguageEnum Language, const SYNANLib::IClausePtr& piClause, int ClauseRootNo)
{
if (ClauseRootNo == -1)
{
if (Language == morphRussian)
return "осяршую";
else
return "EMPTY";
}
else
{
return (const char*)piClause->ClauseRoots[ClauseRootNo]->GetDescription();
}
};