2

アプリケーションの目的は、文に含まれる単語の見出し語をロシア語から英語に翻訳することです。私は、c ++プログラムによって呼び出されるpythonスクリプトによってクエリされるsdict形式の語彙の助けを借りてそれをやっています。

私の目的は、次の出力を取得することです。

Выставка/exhibition::1 конгресс/congress::2 организаторами/organizer::3 которой/ which::4 являются/appear::5 РАО/NONE::6 ЕЭС/NONE::7 России/NONE::8 EESR/ NONE ::9 нефтяная/oil::10 компания/company::11 ЮКОС/NONE::12 YUKOS/NONE::13 и/and::14 администрация/administration::15 Томской/NONE::16 области/region: :17 продлится/最終::18 時間/4::19 日/日::20

次のコードは文では成功しましたが、2 番目の文などでは間違った出力が得られます。

Егор/ NONE ::1 Гайдар/NONE::2 возглавлял/NONE::3 первое/head::4 российское/first::5 правительство/NONE::6 которое/government::7 нвазывали/which::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";

2 番目のセンテンスの出力が遅れていることに気付いたので、usleep(2); を追加しました。PyRun_SimpleString呼び出しが同期していないために起こることだと思いながら、C++に。しかし、それは役に立ちませんでした。これが理由であるかどうかはわかりません。遅延バグは、その後に続く文で発生し、増加します。

それで、呼び出しはPyRun_SimpleString同期ですか?おそらく、C++ と Python の間で変数値を共有するのは正しくないのでしょうか? 前もって感謝します。

4

1 に答える 1

1

docsによると、それは同期的です。

Python コードを C++ コードとは別にテストすることをお勧めします。これにより、デバッグがはるかに簡単になります。これを行う 1 つの方法は、対話型インタープリターにコードを貼り付けて、1 行ずつ実行することです。そして、デバッグするときは、例外を破棄しないという Winston Ewert のコメントを支持します。

于 2012-10-24T20:02:39.253 に答える