[ 新規に投稿する ]

キャメルケースのスペルチェックが誤判定されるNo.42242
Fzok4234 さん 25/10/14 13:57 [ コメントを投稿する ]
  毎度お世話になっております。Fzok4234 です。


さて、スペルチェックの対象となる英単語の定義の仕方についてですが、キャメルケースやパスカルケースの
語句の中の各単語をスペルチェックの対象にするにはどうすればよいのでしょうか ?

例えば、
 PSArgumentOutOfRangeException
という語句があった場合、これを
 PS
 Argument
 Out
 Of
 Range
 Exception
というように各セグメントに分解してそれぞれに対してスペルチェックを行うということです。

このようなキャメルケースの各セグメントを考慮して任意の英単語にマッチさせる正規表現は、
 (?:(?<![A-Z])[A-Z]+(?:(?=[A-Z][a-z])|(?![a-zA-Z])))|(?:(?:[A-Z]|(?<![a-zA-Z]))[a-z]+(?![a-z]))
という感じになりますが、スペルチェック対象の英単語の定義をこの正規表現で厳格に指定したいのですが、
やり方が分からず困っている状態です。

現在、スペルチェックの対象に指定している項目は
 ・コメント
 ・文字定数
のみにしていますが、実際の運用ではドキュメントコメントやエラーメッセージ文の文字列リテラルに
キャメルケースの関数名などの識別子名をそのまま記述するケースが多く、スペルチェックでこの識別子名が
スペルミスと誤判定してしまって大変困っています。

キャメルケースの各セグメントは正しい英単語になっていることがほとんどなので、各セグメントごとに
スペルチェックを行えれば誤判定の量はかなり減らすことができます。

この問題に上手く対処させる方法のご教示をお願いいたします。


[ ]
RE:42242 キャメルケースのスペルチェックが誤判定されるNo.42245
秀丸担当 さん 25/10/14 15:25 [ コメントを投稿する ]
  スペルチェックで、キャメルケースなどの中の語句を対象にする方法は無いです。
できたらいいということでご意見参考にさせていただきます。
[ ]
RE:42245 キャメルケースのスペルチェックが誤判定されるNo.42246
Fzok4234 さん 25/10/14 16:40 [ コメントを投稿する ]
  とりあえずマクロで無理矢理対処させる方法と、現状で目障りな誤判定を目立たなくする方法が分かれば
それで結構です。どうかよろしくお願いします。

[ ]
RE:42246 キャメルケースのスペルチェックが誤判定されるNo.42249
秀丸担当 さん 25/10/15 09:11 [ コメントを投稿する ]
  無理矢理する方法は思いつかないです。
[ ]
RE:42246 キャメルケースのスペルチェックが誤判定されるNo.42250
秀まるお2 さん 25/10/15 09:36 [ コメントを投稿する ]
  マクロの例は作成してませんが、とりあえずスペルチェックするためには

PSArgumentOutOfRangeException



PS Argument Out Of Range Exception

のように分解して、さらに全部小文字に変換する、という風にするような作戦は可能かなぁと思います。
[ ]
RE:42249 キャメルケースのスペルチェックが誤判定されるNo.42252
Fzok4234 さん 25/10/15 12:06 [ コメントを投稿する ]
  > 無理矢理する方法は思いつかないです。

具体的には、HmSpell.dll の関数をマクロから直接呼び出す方法とかです。現状ではマクロヘルプのどこにも
HmSpell.dll 関連の記述がなく、ユーザー側で手の施しようがない状態となっています。


[ ]
RE:42250 キャメルケースのスペルチェックが誤判定されるNo.42253
Fzok4234 さん 25/10/15 12:07 [ コメントを投稿する ]
  > マクロの例は作成してませんが、とりあえずスペルチェックするためには
> PSArgumentOutOfRangeException
> を
> PS Argument Out Of Range Exception
> のように分解して、さらに全部小文字に変換する、という風にするような作戦は可能かなぁと思います。

キャメルケースを各セグメントに分解することは、最初の投稿で示した
 (?:(?<![A-Z])[A-Z]+(?:(?=[A-Z][a-z])|(?![a-zA-Z])))|(?:(?:[A-Z]|(?<![a-zA-Z]))[a-z]+(?![a-z]))
というような正規表現で検索することで、ユーザー側で自力で対処できます。

問題なのは、分解後のセグメントの文字列を HmSpell.dll に渡してスペルチェックを実行する段階です。
マクロヘルプの中に HmSpell.dll に関する記述が一切無く、ユーザーが自力でマクロで対処することが
できない状態となっていて、現状「詰み」となっていて困っています。


[ ]
RE:42249 キャメルケースのスペルチェックが誤判定されるNo.42255
(-L-) さん 25/10/15 13:01 [ コメントを投稿する ]
>無理矢理する方法は思いつかないです。

横から失礼します。

キャメルケース分解やらHmSpell.dllのややこしい方向ではなく、
スペルチェックのホワイトリスト(個人辞書?)的なものを無理矢理にでも動的生成→スペルチェックに反映という方向に議論が行かないのは、この方向でも何かしらの困難があるということなのでしょうか。
[ ]
RE:42253 キャメルケースのスペルチェックが誤判定されるNo.42256
秀まるお2 さん 25/10/15 13:29 [ コメントを投稿する ]
  秀丸エディタのスペルチェックアドインはWindowsのスペルチェックライブラリを呼び出してるだけなので、それをマクロから呼び出して使えばいいかと思うんですが、例えば秀丸マクロのcreateobjectみたいな仕組みで呼び出せたらいいんですが、今ちょっとChatGPTに聞いたら無理とのことでした。

スペルチェックのライブラリは

ISpellCheckerFactory
ISpellChecker

などのCOMのインタフェースになってるので、これを呼び出すC++のDLLを1つ作れば実現可能かとは思いますが、ちょっと大変ではあります。

----------------------------------------------------------
ChatGPTにサンプル作ってもらったんですが、おおよそ動きそうなサンプルは出てきました。そんなので自作する作戦どうでしょうか。

■質問1:
Windowsのスペルチェックライブラリを使って特定の単語がスペルミスかどうか調べるC++コンソールアプリの例は?。例えば「test.exe abc」みたいなコマンドラインで呼び出してabcがスペルミスかどうか調べる例は?


■質問2:
これを秀丸エディタのマクロから呼び出すdllにするには?


で出てきたサンプルそのままで、dllfuncじゃなくてdllfuncwで呼び出せば動きそうな気がします。
[ ]
RE:42256 キャメルケースのスペルチェックが誤判定されるNo.42257
Fzok4234 さん 25/10/15 13:59 [ コメントを投稿する ]
  回答ありがとうございます。

> スペルチェックのライブラリは
> ISpellCheckerFactory
> ISpellChecker
> などのCOMのインタフェースになってるので、これを呼び出すC++のDLLを1つ作れば実現可能かとは思いますが、
> ちょっと大変ではあります。

どうやら問題解決のためにはガッツリと C/C++ でアンマネージドな DLL を作らないといけないみたいですね。
当方では普段は C# などのマネージドコードを中心に開発作業をしているので、単純に秀丸マクロや JavaScript、
.Net アセンブリ ( 要は C# のマネージド DLL ) で作れないとなると、メモリー管理などでかなり大掛かりな
開発作業となりそうです。

正確なスペルチェックで実際に受けられる恩恵の大きさと、開発作業の負担の量とが釣り合っているかどうか
よくよく検討してみます。


[ ]
RE:42257 キャメルケースのスペルチェックが誤判定されるNo.42258
秀まるお2 さん 25/10/15 14:38 [ コメントを投稿する ]
  ChatGPTに

「秀丸エディタのマクロから呼び出す用のdllをC#で作成することは出来ますか?」

って質問したら、一応できるような話が出てきますが、すみませんが僕はマネージドコードその他あんまり詳しくないので、それが正解なのかどうかは分からず・・・・

exeを作ってrunsyncで呼び出すやり方も提示されたので、遅くてもいいならそれがいいかもしれまん。

単純に目視で判定できればいいだけなら、単語に区切ったテキストデータを新規作成の秀丸エディタ上に貼り付けて「表示 - 自動スペルチェック」をONにするなり「設定 - スペルミスの修正」コマンドを実行するなりの方法でもいいんじゃないかとは思います。
[ ]
RE:42258 キャメルケースのスペルチェックが誤判定されるNo.42259
秀まるお2 さん 25/10/15 14:53 [ コメントを投稿する ]
  もう1つ

「WindowsのスペルチェックAPIを呼び出すモジュールをC#で作成してそれをwshから呼び出して使うことは出来ますか?」

って質問したらそれも出来るみたいな話です。そういうdllを作ることが出来るなら、それを秀丸マクロからcreateobject/callmethod_returnstrとかで呼び出して使うことも可能だろうとは思います。ただ、この質問に対しても、exeを作って呼び出した方が簡単だとの説明も出てきてしまいました。
[ ]
RE:42258 キャメルケースのスペルチェックが誤判定されるNo.42260
こみやんま さん 25/10/15 15:19 [ コメントを投稿する ]
  >「秀丸エディタのマクロから呼び出す用のdllをC#で作成することは出来ますか?」

C#は「マネージド」も「ネイティブ」もどちらも作成可能です。
もちろん.dllのx86|x64 ともにC#はネイティブも可能です。

よって、loaddll用のものも作成可能ですし、createobject用も作成可能です。
秀丸のjsmodeの「javascriptの関数」を、そのままC#のCOMの.dllに渡して、
C#側から「何の工夫もせず、キャストすらもなく、元々のC#の関数であったかのように( ) を付けて呼び出す」ことすらも可能です。
[ ]
RE:42255 キャメルケースのスペルチェックが誤判定されるNo.42263
秀丸担当 さん 25/10/15 16:39 [ コメントを投稿する ]
  目的は違うと思いますが、そのやり方でよければ、それでもいいと思います。
[ ]
RE:42255 キャメルケースのスペルチェックが誤判定されるNo.42264
Fzok4234 さん 25/10/15 19:00 [ コメントを投稿する ]
  > スペルチェックのホワイトリスト(個人辞書?)的なものを無理矢理にでも動的生成→スペルチェックに反映 ...

ここでおっしゃった意味を解釈すると、例えば既知の英単語が
 argument
 exception
の 2 個だけで、且つ、これを組み合わせたキャメルケースの熟語の単語数が最大 2 語に制限された場合、
ホワイトリストの辞書に登録する語句は、上記の 2 個だけではなく、全ての熟語の組み合わせ ( 厳密には
重複順列という ) の
 argumentArgument
 argumentException
 exceptionArgument
 exceptionException
という 4 個も含まれる、ということになってしまいますね。

このように、キャメルケースの熟語を 1 個の独立した単語と見做すやり方では、辞書のサイズが爆発的に
増加する恐れがあるため、現実的な方法とは言えません。

ホワイトリスト方式を実現するためには、やはりキャメルケースを単語のセグメントに分解するなどして
辞書のサイズをできるだけ削減する、といった流れにならざるを得ません。


[ ]
RE:42264 キャメルケースのスペルチェックが誤判定されるNo.42265
(-L-) さん 25/10/15 19:11 [ コメントを投稿する ]
>このように、キャメルケースの熟語を 1 個の独立した単語と見做すやり方では、辞書のサイズが爆発的に
>増加する恐れがあるため、現実的な方法とは言えません。
>(snip)
>辞書のサイズをできるだけ削減する、といった流れにならざるを得ません。

永久にだと増加ですが、あるプロジェクトなり、その塊の範囲内でなら、現実的な数に収まるかと思ったまで。
なので、その範囲内で動的に運用できる仕組みをどう実現するかという話になるイメージでいました。

ま、現実的な方法ではないと一刀両断、けんもほろろなので返信不要です。
[ ]
RE:42259 キャメルケースのスペルチェックが誤判定されるNo.42266
Fzok4234 さん 25/10/15 20:23 [ コメントを投稿する ]
  一応、ISpellChecker などについての公式ドキュメント
 https://learn.microsoft.com/en-us/windows/win32/api/spellcheck/
を見てみましたが、基本的に単純な COM コンポーネントとなっているようなので、理論上は C# からでも
ComImportAttribute を使って呼び出しできるものと思われます。

ただ、ネット上での実装例の紹介はほとんど存在しない状態でした。
 https://www.pinvoke.net/
にも掲載されていません。


[ ]
RE:42266 キャメルケースのスペルチェックが誤判定されるNo.42268
秀まるお2 さん 25/10/15 21:07 [ コメントを投稿する ]
  釈迦に説法かもしれませんが、とりあえずChatGPTやGoogle Geminiが作ってくれたサンプルをそのままコンパイル通してエラーになったら「ここがエラーになった」ってまたChatGPTに問い合わせたりと、それを繰り返していくことでまともなプログラムになっていくんじゃないかと思います。

僕はお手伝いできませんけども。

------------------------------------
「C#でWindowsのスペルチェックAPI(ISpellCheckerインタフェースなど)を使うサンプルの掲載されたサイトは? 」って質問したら、Habrっていうロシア語のサイトがあるような回答がありました。

とりあえず、こちらに聞く前にAIチャットで片っ端から質問してみたら、何か解決策が出てきそうな気がします。これまた釈迦に説法ではありますが。

「GitHubにありませんか?」って質問したら、「GitHubでこういうキーワードで検索したらどうか」、みたいなアドバイスとか、「C++のソースコードならあるのでそれをラッパーでなんとかする」みたいな回答は出てきました。
[ ]

[ 新規に投稿する ]