К сожалению, принесенный из садика ежегодный ротавирус убивает время, поэтому выложу просто пример на питоне для
создания движка, загрузки словаря и распознавания слова под 64-битной виндовой Анакондой:
# -*- coding: utf-8 -*-
from ctypes import *
gren_dll = cdll.solarix_grammar_engine
# создаем грамматический движок в режиме ленивой подгрузки
# лексикона, так что статьи будут подгружаться по мере необходимости.
hgren = gren_dll.sol_CreateGrammarEngineW(None,1)
print( 'hgren={0}'.format(hgren) )
# подключаем словарную базу
res = gren_dll.sol_LoadDictionaryW( hgren, u'e:/MVoice/lem/bin-windows64/dictionary.xml' )
print( 'sol_LoadDictionaryW ==> res={0}'.format(res) )
res = gren_dll.sol_DictionaryVersion(hgren)
print( 'sol_DictionaryVersion={0}'.format(res) )
# выполняем распознавание слова, получаем дескриптор со списком
# вариантов распознавания.
hproj = gren_dll.sol_ProjectWord( hgren, u'тамерланов', 1 )
print( hproj )
# подготовим wchar_t-буфер для получения строк от движка, например
# для получения наименования словарной статьи или части речи.
name_buf = create_unicode_buffer(32)
# выведем результаты распознавания, их nproj штук
nproj = gren_dll.sol_CountProjections( hproj )
print( 'nproj={0}'.format(nproj) )
for iproj in range(nproj):
# для каждого варинта распознавания мы получим id словарной статьи,
# id части речи, и список тегов.
id_entry = gren_dll.sol_GetIEntry( hproj, iproj )
gren_dll.sol_GetEntryName( hgren, id_entry, name_buf );
# для несловарных токенов будут получаться имена статей u'???'
entry_name = unicode(name_buf.value)
id_class = gren_dll.sol_GetEntryClass( hgren, id_entry )
gren_dll.sol_GetClassName( hgren, id_class, name_buf )
class_name = unicode(name_buf.value)
tags = []
ntag = gren_dll.sol_GetProjCoordCount( hgren, hproj, iproj )
for itag in range(ntag):
id_coord = gren_dll.sol_GetProjCoordId( hgren, hproj, iproj, itag )
id_state = gren_dll.sol_GetProjStateId( hgren, hproj, iproj, itag )
gren_dll.sol_GetCoordName( hgren, id_coord, name_buf )
coord_name = unicode(name_buf.value)
nstate = gren_dll.sol_CountCoordStates( hgren, id_coord )
if nstate==0:
state_name = unicode(id_state)
else:
gren_dll.sol_GetCoordStateName( hgren, id_coord, id_state, name_buf )
state_name = unicode(name_buf.value)
tags.append( (coord_name,state_name) )
print( u'{0} --> {2}:{1} {3}'.format(iproj,entry_name,class_name, unicode.join( u' ', [ c+u'='+s for c,s in tags ] ) ) )
# удаляем список распознаваний слова
gren_dll.sol_DeleteProjections(hproj)
# удаляем движок
gren_dll.sol_DeleteGrammarEngine(hgren)
Результат: