質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

557閲覧

日本語変換エンジンの変換アルゴリズムが途中で失敗するのを直したい(C++)

katahiromz

総合スコア186

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2023/05/15 05:50

実現したいこと

  • 日本語変換エンジンが不安定なので直したい

前提

C++/Win32で自作の日本語IMEの変換エンジンを作成しています。
こちらのリポジトリをダウンロードして、CMakeとVisual C++でビルドして下さい。

https://github.com/katahiromz/mzimeja

ime/convert.cpp」が変換エンジンで、「ime/tests.cpp」がテストコードになっております。
ime/convert.cpp」の「MzIme::ConvertMultiClause」関数が変換処理になります。
res/basic.dat」が辞書データとなっております。

コンパイルしてできた「imetests.exe」がテストプログラムです。

発生している問題・エラーメッセージ

変換アルゴリズムが不安定で困っています。具体的には次のテスト項目の変換において途中で変換が勝手に終了して失敗することがあります。

イメージ説明

cxx

1DoEntry(L"とうたつします。とうたつしてください。とうたつしないでください。", 2 L"到達します。到達してください。到達しないでください。"); 3DoEntry(L"とうたつするよ。とうたつしたぞ。とうたつできるな。とうたつしよう。", 4 L"到達するよ。到達したぞ。到達できるな。到達しよう。"); 5DoEntry(L"これをたべないでください。", L"これを食べないでください。"); 6DoEntry(L"わかりづらいので、わかりやすくおねがいします。たべにくいです。たべやすいものがいいです。", 7 L"分かりづらいので、分かりやすくお願いします。食べにくいです。食べやすいものが良いです。"); 8DoEntry(L"わたしがわたしたわたをわたがしみたいにたべないでくださいませんか", 9 L"私が渡した綿を綿菓子みたいに食べないでくださいませんか");

該当のソースコード

cxx

1// 複数文節を変換する。 2BOOL MzIme::ConvertMultiClause(const std::wstring& str, MzConvResult& result, BOOL show_graphviz) 3{ 4 DPRINTW(L"%s\n", str.c_str()); 5 6 // 変換前文字列をひらがな全角で取得。 7 std::wstring pre = lcmap(str, LCMAP_FULLWIDTH | LCMAP_HIRAGANA); 8 9 // ラティスを作成し、結果を作成する。 10 Lattice lattice; 11 lattice.AddNodesForMulti(pre); 12 lattice.AddExtraNodes(); 13 lattice.UpdateLinksAndBranches(); 14 lattice.CutUnlinkedNodes(); 15 lattice.AddComplement(); 16 lattice.MakeReverseBranches(lattice.m_head.get()); 17 18 lattice.m_tail->marked = 1; 19 lattice.CalcSubTotalCosts(lattice.m_tail.get()); 20 21 lattice.m_head->marked = 1; 22 lattice.OptimizeMarking(lattice.m_head.get()); 23 24 MakeResultForMulti(result, lattice); 25 26 if (result.clauses.empty()) { 27 MakeResultOnFailure(result, pre); 28 } 29 30 if (show_graphviz) 31 ShowGraphviz(result); 32 33 return TRUE; 34} // MzIme::ConvertMultiClause

試したこと

テストコードを書き、テストを実施しました。直す方法が分かりませんでした。
外注しようかと思いましたが、解決できる人材が見つかりませんでした。

補足情報(FW/ツールのバージョンなど)

  • Visual Studio Community 2019 (with Visual C++)
  • CMake
ujimushi_sradjp👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2023/05/15 08:30

まずはコードのどこでどういうふうに失敗するのか、を突き止めましょう これでは単なるデバッグ依頼ですがなw 果たしてこのコードはあなたのものなんでしょうか
katahiromz

2023/05/16 12:32

異常終了はしてません。リンクが足りない、もしくはリンクを必要以上にカッティングしていると考えますが、なぜそれが気まぐれのように失敗するのかがわかりません。 このコードは私のものです。
katahiromz

2023/05/16 12:42

失敗時は`result.clauses.empty()`がtrueになっています。 `OptimizeMarking`を書き直す必要があると思いますが、解決策が思い付きません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問