strateg писал(а):В итоге если вызвать функцию MorphologyAnalysis один раз, то в rez3 пятизначное число, если вызвать повторно, то там цифра 2, тогда как должно быть 3. 3 Узла.
Явно что-то идет не так. А у Вас работает эта функция?
В первом параметре GetNodeIEntry вероятно должен передаваться указатель на поисковую машину sol_CreateSearchEngine, а не на граматическую, но всё равно непонятно почему в rez3 такая пляска с цифрами. И в декларации всё верно и указатель на строку передал.
int sol_GetEntryCoordState( HGREN hEngine, int EntryIndex, int CoordId )
Private Declare Function GetEntryCoordState Lib "solarix_grammar_engine.dll" Alias "sol_GetEntryCoordState" (ByVal hBuilder As Long, ByVal EntryIndex As Long, ByVal CoordId As Integer) As Long
rez = SeekWord(rezgr, StrPtr("КОШКА"), 1)
rez2 = GetEntryClass(rezgr, rez) - получаем класс - 7 существительное
rez3 = GetEntryCoordState(rezgr, rez, 20) передаем индекс слова, читсло 20-ть означает падеж. Должны получить номер падежа 1- именительный. Получаем -1 - ошибка.
strateg писал(а):Чудеса
strateg писал(а):пользоваться функциями из библиотеки С++ средствами Visual Basic 6.0
, а такжеGetClassName
SyntaxAnalysis
strateg писал(а):rez2 = GetEntryClass(rezgr, rez) - получаем класс - 7 существительное
rez3 = GetEntryCoordState(rezgr, rez, 20) передаем индекс слова, читсло 20-ть означает падеж. Должны получить номер падежа 1- именительный. Получаем -1 - ошибка.
Чудеса
GeneratePhrase3
Paraphrase
SeekThesaurus
strateg писал(а):Остались функции GeneratePhrase3 Paraphrase SeekThesaurus
Эти функции выдают или - 1 или вообще ничего не возвращают. А у Вас эти функции работают? Если вы еще занимаетесь этим вопросом.
strateg писал(а):Остались функции GeneratePhrase3 Paraphrase SeekThesaurus
Эти функции выдают или - 1 или вообще ничего не возвращают. А у Вас эти функции работают?
For Each s In Array("простыни", "роем", "кошками", "шлемом", "пьет", "высоко")
nEntryIndex = .SeekWord(hEngine, UCASE(s), True) ' для VB будет StrPtr(UCASE(s))
sEntryName = Space(nLexemLen)
Call .GetEntryName(hEngine, nEntryIndex, sEntryName) ' для VB будет StrPtr(sEntryName)
sEntryName = Left(sEntryName, InStr(sEntryName & vbNullChar, vbNullChar) - 1)
nClass = .GetEntryClass(hEngine, nEntryIndex)
hArray = .SeekThesaurus(hEngine, nEntryIndex, False, False, False, False, 0)
If hArray <> 0 Then
nArray = .CountInts(hArray)
nArrayMax = nArray
If nArrayMax > 15 Then nArrayMax = 15
t = ""
For iArray=0 To nArrayMax-1
nEntryArray = .GetInt(hArray, iArray)
sEntryArrayName = Space(nLexemLen)
Call .GetEntryName(hEngine, nEntryArray, sEntryArrayName) ' для VB будет StrPtr(sEntryArrayName)
sEntryArrayName = Left(sEntryArrayName, InStr(sEntryArrayName & vbNullChar, vbNullChar) - 1)
t = t & " " & nEntryArray & " " & sEntryArrayName
Next
WScript.Echo s & " nEntryIndex=" & nEntryIndex & " " & sEntryName & " nClass=" & nClass & " nArray=" & nArray & " t=" & t
rez1 = .DeleteInts(hArray)
End If
Next
SeekThesaurus писал(а):простыни.nEntryIndex=31297..простынуть.nClass=13.nArray=5 t= 59368 озябнуть 56835 остыть 31300 простывать 31296 простынуть...
роем.......nEntryIndex=23569..рой............nClass=7..nArray=1 t= 23638 роение
кошками..nEntryIndex=77787..кошка.........nClass=7..nArray=14 t= 77795 кошачий 77786 кошкин 77785 кошкоподобный 47751 по-кошачьи...
шлемом...nEntryIndex=1952...шлем..........nClass=7..nArray=5 t= 59924 одежда 176498 casque 158727 helmet 158728 helm...
пьет........nEntryIndex=48600..пить...........nClass=13.nArray=26 t= 85906 зашибать 40529 посасывать 10944 трескать 36339 прикладываться...
высоко....nEntryIndex=101500.высокий......nClass=10.nArray=23 t= 95931 длинный 11645 тонкий 63914 низкий 66923 невысокий...
OrgPhrase = "пила лежит на столе"
NewPhrase = Space(1024)
iBuffer = .Paraphrase(hBuilder, 0, 0, 0, 0, 0, 0, 1, OrgPhrase, NewPhrase, 1024, 60000)
NewPhrase = Left(NewPhrase, InStr(NewPhrase & vbNullChar, vbNullChar) - 1)
WScript.Echo OrgPhrase & " == " & NewPhrase
hTemplate = .CreateFGTemplate(hBuilder, OrgPhrase, 1)
If hTemplate <> 0 Then
NewGenPhrase = Space(1024)
iGenBuffer = .GeneratePhrase3(hBuilder, hTemplate, 0, NewGenPhrase, 1024)
NewGenPhrase = Left(NewGenPhrase, InStr(NewGenPhrase & vbNullChar, vbNullChar) - 1)
WScript.Echo OrgPhrase & " == " & NewPhrase & " == " & NewGenPhrase
rez1 = .DeleteFGTemplate(hTemplate)
End If
Paraphrase писал(а):пила лежит на столе == пила лежит на столе ==
Private Declare Function GeneratePhrase3 Lib "synonymizer.dll" Alias "sol_GeneratePhrase3" (ByVal hBuilder As Long, hBuilderTem As Long, ByVal Typefrase As Integer, ByVal str2 As long, ByVal maxlen As Long) As Long
rezPhraseGenerator = CreatePhraseGenerator(rezgr, 1)
reztemp = CreateFGTemplate(rezPhraseGenerator, StrPtr("Кошка пьет молоко"), 1)
str2 = Space(1000)
rezfr = GeneratePhrase3(rezPhraseGenerator, reztemp, 0, StrPtr(str2), 1000)
DLL_ENTRY void sol_GeneratePhrase3(
HGREN_PHRASOMAT hBuilder,
HGREN_FGTEMPLATE hTemplate,
int PhraseType,
wchar_t *NewPhrase,
int maxlen
)
{
LEM_CHECKIT_Z( hBuilder!=NULL );
LEM_CHECKIT_Z( hTemplate!=NULL );
LEM_CHECKIT_Z( NewPhrase!=NULL );
if( hBuilder==NULL || hTemplate==NULL )
{
*NewPhrase=0;
return;
}
UFString s; s.reserve(256);
hTemplate->GeneratePhrase( hBuilder, PhraseType, s );
lem_strncpy( NewPhrase, s.c_str(), maxlen-1 );
NewPhrase[ maxlen-1 ] = 0;
#else
return;
}
strateg писал(а):У меня вроде всё также
- Код: Выделить всё
Private Declare Function GeneratePhrase3 Lib "synonymizer.dll" Alias "sol_GeneratePhrase3" (ByVal hBuilder As Long, hBuilderTem As Long, ByVal Typefrase As Integer, ByVal str2 As long, ByVal maxlen As Long) As Long
Темплейт создается без проблем получаем указатель на него. А вот в rezfr всегда -1. Ну и ничего не возвращается.
const int FG_LOGICS = 0x00000001;
const int FG_GERUND1 = 0x00000002;
const int FG_GERUND2 = 0x00000004;
const int FG_QUEST = 0x00000008; // генерировать вопросительные
const int FG_EXCLAM = 0x00000010; // генерировать восклицательные
const int FG_INTRO = 0x00000020;
const int FG_COMPLEX = 0x00000040;
const int FG_MULTISENT = 0x00000080;
const int FG_SUBSTWORDS = 0x00000100;
const int FG_PARAFRASE = 0x00000200;
const int FG_COMSENT = 0x00000400; // генерировать повествовательные предложения
const int FG_USE_LEX_WHEN_EXHAUSTED = 0x00010000; // если фильтрованные слова закончились,
// то использовать полный лексикон, а не
// исходный фильтрованный список
const int FG_EXTRACT_FIRST = 0x00020000; // извекать не рандомно из фильтрованного
// списка, а один за одним
const int FG_DONT_REMOVE_USED = 0x00040000; // не удалять из фильтрованного списка использованные.
const int FG_SYNONYMIZE_NOUNS = 0x00080000; // выполнять синонимизацию существительных в sol_Paraphrase
const int FG_SYNONYMIZE_OTHERS = 0x00100000; // выполнять синонимизацию не-существительных
strateg писал(а):Подскажите как правильно передать такую битовую комбинацию в функцию GeneratePhrase3 например.
Vi писал(а):Можно использовать
Хакер писал(а):Но не нужно, потому что семантически неверно.
const FG_LOGICS = 0x00000001
perem = FG_QUEST or 0 ?
Поскольку константы битовые, то с помощью "OR": FG_LOGICS OR FG_GERUND1 и т.д. сколько нужно.
strateg писал(а):А пример можно?
Допустим надо преобразовать одну константу FG_QUEST, а не две perem = FG_QUEST or 0 ?
const FG_LOGICS = &h00000001 ' шестнадцатеричная запись
const FG_LOGICS = 1 ' десятичная запись
const FG_EXCLAM = &h00000010 ' шестнадцатеричная
const FG_EXCLAM = 16 ' десятичная
rezfr = GeneratePhrase3(rezPhraseGenerator, reztemp, FG_SUBSTWORDS, StrPtr(str2), 1000)
rezfr = GeneratePhrase2(rezPhraseGenerator, FG_QUEST Or FG_EXCLAM Or FG_COMSENT, StrPtr(str2), 1000)
cond = FG_QUEST Or FG_EXCLAM Or FG_COMSENT
rezfr = GeneratePhrase2(rezPhraseGenerator, cond, StrPtr(str2), 1000)
rezfr = GeneratePhrase2(rezPhraseGenerator, cond Or FG_INTRO, StrPtr(str2), 1000)
Private Declare Function CreateFGTemplate Lib "synonymizer.dll" Alias "sol_CreateFGTemplate" (ByVal hBuilder As Long, ByVal Word As Long, ByVal lang As Long) As Long
Private Declare Function CountFGTemplateQuantors Lib "synonymizer.dll" Alias "sol_CountFGTemplateQuantors" (ByVal hBuilder As Long) As Long
Private Declare Function CountFGTemplateRoots Lib "synonymizer.dll" Alias "sol_CountFGTemplateRoots" (ByVal hBuilder As Long) As Long
Private Declare Function GeneratePhrase3 Lib "synonymizer.dll" Alias "sol_GeneratePhrase3" (ByVal hBuilder As Long, ByVal hBuilderTem As Long, ByVal Typefrase As Long, ByVal str2 As Long, ByVal maxlen As Long) As Long
rez6 = CreateFGTemplate(rezPhraseGenerator, StrPtr("Еще можно выделить медицинскую науку, которая, говоря кратко, представляет из себя следующее"), 1)
rez61 = CountFGTemplateQuantors(rez6)
rez62 = CountFGTemplateRoots(rez6)
str2 = Space(1000)
rez7 = GeneratePhrase3(rezPhraseGenerator, rez6, FG_SUBSTWORDS, StrPtr(str2), 10000)
Сейчас этот форум просматривают: Yandex-бот и гости: 60