テキストアナラ​​イザー:著者の認識(終了)

この記事は、プロジェクト「Text Analyzer」で実装された著者情報認識アルゴリズムに関するものです。 記事の最後で、周波数特性がどのように組み立てられるかを見ていきます。一般的な用語では、ハミングニューラルシステムに精通します。 ( 開始および継続 )。



記事の構造:

  1. 著者の分析
  2. コードを知る
  3. TAuthoringAnalyserの内部とテキストストレージ
  4. 戦略に関するステートマシンによるレベリング
  5. 周波数応答収集
  6. ハミングニューラルネットワークと著者分析


追加資料:









5.周波数特性の収集






個々の文字の頻度特性、2文字、3文字の組み合わせ、単語頻度表などは、著者を認識するのに最も役立ちます。 このプログラムは、最も単純なシンボル周波数のカウントのみを実装します。 もちろん、これは包括的な分析には十分ではありません。 確かに、認識の精度はそれほど高くありません。 私の知る限り、テストでは正解の確率は60〜70%に達し、それでも理想的な条件でした。 プログラムの開発中、私はいつかそれを書き直し、多くの方法に基づいた著者の包括的な分析を追加することを望んでいました。 誰が知っている、多分私はそれを取る...



だから、キャラクターの周波数特性のコレクション。 TCharFrequencyCalculator( [h] )クラスは、周波数表を作成し、テキストを1回通過させます。 テンプレートクラスTFrequencyTable( [h] )は、あらゆるタイプのオブジェクトの頻度テーブルを格納できます。



Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  1. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  2. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  3. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  4. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  5. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  6. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  7. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  8. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  9. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  10. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  11. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  12. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  13. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  14. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  15. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  16. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  17. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  18. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  19. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  20. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  21. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  22. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };



  23. Copy Source | Copy HTML class TCharFrequencyCalculator { private : TFrequencyTable< TChar > _FTable; public : TFrequencyTable< TChar > & operator ()(TTextStringWrapper & tWrapper) { _FTable << ftm_Clear; TUInt i; TTextStringWrapper d; // , , ... for (i=tWrapper.Begin(); i<=tWrapper.End(); i++) _FTable << (tWrapper[i]); return _FTable; }; TFrequencyTable< TChar > & operator ()( const TTextString & tTextString) { _FTable << ftm_Clear; for (TSInt i= 1 ; i<=tTextString.Length(); i++) _FTable << tTextString[i]; return _FTable; }; TCharFrequencyCalculator (){}; };







//使用法:

TCharFrequencyCalculator計算機。

TFrequencyTable charFrequencyTable = calculator(テキスト);





周波数をカウントする2つの関数が既に存在するという事実に注意する価値があります。 1つ目はTTextStringWrapper( [cpp][h] )-テキスト文字列のラッパークラスを受け入れます。 「ラッパー」は、アダプターパターンとしても知られています(アダプター、ラッパー、 [1][2][3] )。 あるクラスのインターフェースを別のクラスのインターフェースに変換します。 真に普遍的な計算機を作成することはできますが、周波数をカウントしているオブジェクトから抽象化する必要があります。 計算機は、どのリスト、テーブル、または配列にデータが含まれているか、それらがどこから来たのか、要素の数、およびそれらの順序を気にする必要さえありません。 電卓が必要とするインターフェイスに適応すると、オブジェクトのリストは同じように処理されます... deja vuのように感じましたか? そうです、ステートマシンマネージャーを検討したときにこれについて既に説明しました。 そこでは、イテレーターパターンを使用してイベントリストから抽象化し、ここでは、アダプターを使用して要素のリストから抽象化しました。 これは非定型のアプリケーションであり、イテレーターよりも劣ります。アダプターと頻度テーブルの階層を作成して、迅速に交​​換できるようにする必要があります。 最終的に、アダプターはそれ自体でなくなり、一種の抽象的なコンテナーに変わります。 次のようになります。



Copy Source | Copy HTML



  1. クラス TFrequencyCalculator
  2. {
  3. TFrequencyTable * 演算子 ()(TWrapper * tWrapper、TFrequencyTable *テーブル)
  4. {
  5. テーブル<< ftm_Clear;
  6. forint i = tWrapper-> Begin(); i <= tWrapper-> End(); ++ i)
  7. テーブル<<(tWrapper-> at(i));
  8. 戻りテーブル。
  9. };
  10. }
  11. TWordWrapper クラスパブリック TWrapper
  12. {
  13. // ......
  14. 仮想int Begin() const ;
  15. 仮想int End() const ;
  16. const int &index) constの 仮想 Word
  17. // ......
  18. };
  19. クラス TSentenceWrapperpublic TWrapper { /*......*/ };
  20. クラス TWordsFrequencyTablepublic TFrequencyTable { /*......*/ };
  21. クラス TSentenceFrequencyTablepublic TFrequencyTable { /*......*/ };
  22. //使用法:
  23. TWordWrapper wordWrapper = TWordWrapper (wordsList)
  24. TFrequencyCalculator wordCalc;
  25. TWordsFrequencyTable wordFrequencyTable = wordCalc(&wordWrapper、&wordFrequencyTable);
  26. TSentenceWrapperWrapper = TSentenceWrapper (sentencesMap)
  27. TFrequencyCalculator statementCalc ;
  28. TSentenceFrequencyTable statementFrequencyTable = statementCalc (& statementWrapper 、& statementFrequencyTable );




6.ハミングニューラルネットワークと著者分析






最後に、疲れ果てたボロボロの最後のステップにたどり着きました。 ハミングニューラルネットワーク( [1][2] )は、同じ長さのバイナリベクトルのセットを基本とします。 これらはサンプルと呼ばれ、サンプルマトリックスに保存されます。 同じ長さのテストベクトルがニューラルネットワークの入力に供給されます。 入力の数は、ベクトルのサイズに等しくなります。 大量の入力データの場合、多くのことがあります。 Hamming ANN(Hopfield ANNを超える)の利点の1つは、入力ベクトルのサイズに関係なく、ニューラルネットワークの構造が変わらないことです。 レイヤー-2つ、最初の架空のもの。 マトリックス内のサンプルと同じ数の出力とニューロンが各層にあります。 ニューラルネットワークは高速です。 彼女の仕事は、サンプルのマトリックスで、入力に最も「類似する」ベクトルを見つけることです。 類似性は、いわゆるハミング距離によって決まります。 この距離が短いほど、2つのベクトルが「類似」します。 相対的に言えば、ハミング距離は、これらのベクトルの何ビットが一致しないかを示します。 ハミング距離の計算は簡単です。また、ニューラルネットワーク全体は、いくつかの単純な式の便利な表現にすぎません。 いくつかの値を計算すると、ニューラルネットワークは結果に収束します。すべてゼロのベクトルが出力で受信されます-ユニットが現れる1つの出力は除外されます。 この収量のインデックスは、サンプルマトリックス内の目的のサンプルを示します。



ニューラルネットワーク(クラスTHamNeuroSystem: [cpp][h] )にテキストサンプルを読み込むには、それらをバイナリに変換する必要があります。 これにより、テンプレートコネクタクラス(THamNSConnector: [h] )が作成されます。 ニューラルネットワークとコネクタコードを見るのは面白いです。これは、はるかに簡単に行えることを理解しています。



Copy Source | Copy HTML



  1. テンプレート< クラス T > void THamNSConnector < T > :: ByteToBinaryVector( T DataItem、TSInt SizeOfData、TSampleVector * DestinationVector)
  2. {
  3. vector < bool > BoolBits;
  4. T NewDataItem = DataItem;
  5. for (TSInt i = 1 ; i <SizeOfData; i ++)
  6. {
  7. BoolBits.clear();
  8. BoolBits.push_back(NewDataItem&bitOne);
  9. BoolBits.push_back(NewDataItem&bitTwo);
  10. BoolBits.push_back(NewDataItem&bitThree);
  11. BoolBits.push_back(NewDataItem&bitFour);
  12. BoolBits.push_back(NewDataItem&bitFive);
  13. BoolBits.push_back(NewDataItem&bitSix);
  14. BoolBits.push_back(NewDataItem&bitSeven);
  15. BoolBits.push_back(NewDataItem&bitEight);
  16. for (TUInt j = 0 ; j <BoolBits.size(); j ++)
  17. {
  18. if (BoolBits [j])DestinationVector-> push_back( 1 );
  19. else DestinationVector-> push_back( 0 );
  20. }
  21. NewDataItem = NewDataItem >> 8 ;
  22. };
  23. };
  24. テンプレート< クラス T > TSampleVector THamNSConnector < T > :: VectorToBinaryVector(TVector SourceVector)
  25. {
  26. TSInt SizeOfData;
  27. T DataItem;
  28. TUInt i;
  29. TSampleVector ResVector;
  30. SizeOfData = sizeofT );
  31. for (i = 0 ; i <SourceVector.size(); i ++)
  32. {
  33. DataItem = SourceVector [i];
  34. ByteToBinaryVector(DataItem、SizeOfData、およびResVector);
  35. };
  36. return ResVector;
  37. };




それだけです ニューラルネットワークを改善しようとする試みは別として、これ以上話すことはありません。 ニューラルネットワークは、未知の著者のテキストの特性により類似すると見なされる特性を持つテキストのサンプルのインデックスを返します。 答えがどれほど正しいか、プログラムをコンパイルすることで自分で解くことができます。 卒業証書を書くとき、または今では、広範なテストを行うのに十分ではありませんでした。 記事がお役に立てば幸いです。



よろしく



All Articles