キャメルケースのスペルチェックが誤判定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++のソースコードならあるのでそれ
をラッパーでなんとかする」みたいな回答は出てきました。

[ ]