люди.
Я был бы признателен, если бы вы могли мне помочь.
Целью приложения является перевод лемм слов, присутствующих в предложении, с русского на английский. Я делаю это с помощью словаря в формате sdict, который запрашивается скриптом python, который вызывается программой c ++.
Моя цель — получить следующий вывод:
Выставка / выставка :: 1 конгресс / конгресс :: 2 организаторами / организатор :: 3 которой / которые :: 4 являются / появляются :: 5 РАО / НЕТ :: 6 ЕЭС / НЕТ :: 7 России / НЕТ :: 8 EESR /НИКТО:: 9 нефтяная / Нефть :: 10 компания / компания :: 11 ЮКОС / НЕТ :: 12 ЮКОС / НЕТ :: 13 и / и :: 14 администрация / администрация :: 15 Томской / НЕТ :: 16 область / регион :: 17 продлится / последний :: 18 четыре / четыре :: 19 дня / день :: 20
Следующий код завершился успешно для предложения, однако для второго предложения и т. Д. Я получил неправильный вывод:
Егор /НИКТО:: 1 Гайдар / НЕТ :: 2 руководителя / НЕТ :: 3 первое / руководитель :: 4 российское / первое :: 5 правительство / НЕТ :: 6 которое / правительство :: 7 называло / которое :: 8 правительства / вызов :: 9 камикадзе / правительство :: 10
Замечания: NONE
используется для слов без перевода.
Я запускаю следующий фрагмент кода C ++, который на самом деле вызывает PyRun_SimpleString
:
for (unsigned int i = 0; i < theSentenceRows->size(); i++){
stringstream ss;
ss << (i + 1);
parsedFormattedOutput << theSentenceRows->at(i)[FORMINDEX] << "/";
getline(lemmaOutFileForTranslation, lemma);
PyObject *main_module, *main_dict;
PyObject *toTranslate_obj, *translation, *emptyString;
/* Setup the __main__ module for us to use */
main_module = PyImport_ImportModule("__main__");
main_dict = PyModule_GetDict(main_module);
/* Inject a variable into __main__, in this case toTranslate */
toTranslate_obj = PyString_FromString(lemma.c_str());
PyDict_SetItemString(main_dict, "start_word", toTranslate_obj);
/* Run the code snippet above in the current environment */
PyRun_SimpleString(pycode);
**usleep(2);**
translation = PyDict_GetItemString(main_dict, "translation");
Py_XDECREF(toTranslate_obj);
/* writing results */
parsedFormattedOutput << PyString_AsString(translation) << "::" << ss.str() << " ";
Где pycode определяется как:
const char *pycode =
"import sys\n""import re\n""import sdictviewer.formats.dct.sdict as sdict\n""import sdictviewer.dictutil\n""dictionary = sdict.SDictionary( 'rus_eng_full2.dct' )\n""dictionary.load()\n""translation = \"*NONE*\"\n""p = re.compile('( )([a-z]+)(.*?)( )')\n""for item in dictionary.get_word_list_iter(start_word):\n"" try:\n"" if start_word == str(item):\n"" instance, definition = item.read_articles()[0]\n"" translation = p.findall(definition)[0][1]\n"" except:\n"" continue\n";
Я заметил некоторую задержку в выводе второго предложения, поэтому я добавил usleep (2); на C ++, думая, что это происходит потому, что вызов PyRun_SimpleString
не синхронно. Это не помогло, однако, и я не уверен, что это причина. Ошибка задержки происходит для предложений, которые следуют и увеличиваются.
Итак, это призыв к PyRun_SimpleString
синхронное? Может быть, разделение значений переменных между C ++ и Python не правильно?
Заранее спасибо.
В соответствии с документы, это синхронно.
Я бы посоветовал вам тестировать код Python отдельно от кода C ++, что значительно упростит его отладку. Один из способов сделать это — вставить код в интерактивный интерпретатор и выполнить его построчно. И при отладке я бы поддержал комментарий Уинстона Эверта, чтобы не отбрасывать исключения.
Других решений пока нет …