テキスト内のコードを確実に検出する簡単な方法は?


142

GMailにはこの機能があり、添付ファイルがあると思われるメールを送信しようとすると警告が表示されます。

ファイルを添付するつもりでしたか?

GMail see the attachedは電子メールで文字列を検出したが、実際の添付ファイルは検出しなかったため、[送信]ボタンをクリックすると、[OK /キャンセル]ダイアログが表示されます。

スタックオーバーフローに関連する問題があります。つまり、ユーザーがこのような投稿を入力すると:

私の問題は、データベースを変更する必要があるが、作成しないことです 
新しい接続。例:

DataSet dsMasterInfo = new DataSet();
データベースdb = DatabaseFactory.CreateDatabase( "ConnectionString");
DbCommand dbCommand = db.GetStoredProcCommand( "uspGetMasterName");

このユーザーはコードをコードとしてフォーマットしませんでした

つまり、Markdownごとに4つのスペースでインデントしたり、コードボタン(またはキーボードショートカットctrl+ k)を使用してインデントしたりしませんでした。

したがって、私たちのシステムは多くの編集を受け入れており、人々は何らかの方法でこれを理解できない人のためにコードを手動でフォーマットする必要があります。これは多くの反抗につながります。エディターのヘルプを何度か改善しましたが、ユーザーの家に行き、キーボードの正しいボタンを押すだけで、次に何をすべきかわからなくなります。

そのため、Google GMailスタイルの警告を検討しています:

コードを投稿するつもりでしたか?

私たちはコードのように見えるものを書きましたが、ツールバーのコードボタンまたはctrl+ kコードフォーマットコマンドを使用して、4つのスペースをインデントすることでコードとしてフォーマットしませんでした。

ただし、この警告を表示するには、質問内のフォーマットされていないコードと思われるものの存在検出する必要があります。これを行う簡単で半信頼性の高い方法は何ですか?

  • Markdownごとに、コードは常に4つのスペースまたはバックティック内でインデントされるため、正しくフォーマットされたものはすぐにチェックから破棄されます。
  • これは単なる警告であり、評判の低いユーザーが最初の質問をする(または最初の回答を提供する)場合にのみ適用されるため、約5%以下であれば、いくつかの誤検知は問題ありません。
  • スタックオーバーフローに関する質問はどの言語でも構いませんが、実際にはチェックを「ビッグ10」言語に制限することができます。タグページごとに、C#、Java、PHP、JavaScript、Objective-C、C、C ++、Python、Rubyになります。
  • Stack Overflowクリエイティブコモンズデータダンプを使用して、潜在的なソリューションを監査し(またはStack Overflowの上位10個のタグからいくつかの質問を選んで)、それがどのように機能するかを確認します。
  • 擬似コードは問題ありませんが、使いやすくしたい場合はc#を使用します。
  • シンプルであればあるほど(動作する限り)。キッス!ソリューションで、10種類のコンパイラで投稿をコンパイルする必要がある場合、またはベイジアン推論エンジンを手動でトレーニングするために大勢の人がいる場合、それは...正確には思いませんでした。

34
インデントが存在しない場合に常に警告を表示するだけであれば、5%のエラー制限をはるかに下回ると思います。これは冗談の半分しか意味しません。
コンラッドルドルフ

59
@Konradメッセージが次のような場合、これはさらにうまく機能します:「あなたの質問に、他の人がそれを理解するのに役立つコードサンプルがないか、適切にインデントするのを忘れた」これは、すべてのケースの99%をカバーするはずです。
トールステンミュラー

3
これは良い質問ですが、答えがないと思います。あなたは私にばか防止システムを見せて、私はあなたにもっと良いばかを見せます。この問題がCODEで対処できたとしても、おそらくそうではないでしょうか?適切な質問をし、適切な回答を私見で提供する私のような人々のためにこのサイトを台無しにしているのは、これらの無知な人々です。
maple_shaft

2
私が見た一般的なパターンは、それ自体で適切にインデントされたコードのブロックですが、最初と最後の行(通常は2行のみ、場合によっては複数の関数を表示する場合など)はコードとしてラベル付けされていません。これもおそらく検出されるはずです。
ダブロン

3
ちなみに、GMailの確認テキストはかなり紛らわしいです。最初の質問の答えが「はい」である場合、2番目の質問の答えは「いいえ」です...
pimvdb

回答:


147

適切な解決策は、おそらく学習済みの統計モデルでしょうが、ここにいくつかの楽しいアイデアがあります。

  1. 行末のセミコロン。これだけでも、多くの言語をキャッチできます。
  2. テキストを区切るためのスペースなしでテキストのすぐ後に続く括弧: myFunc()
  3. 2つの単語間のドットまたは矢印: foo.bar = ptr->val
  4. 中括弧、括弧の存在: while (true) { bar[i]; }
  5. 「コメント」構文の存在(/ *、//など): /* multi-line comment */
  6. 珍しいキャラクター/演算子: +, *, &, &&, |, ||, <, >, ==, !=, >=, <=, >>, <<, ::, __
  7. テキストに対して構文ハイライターを実行します。高い割合で強調表示される場合は、おそらくコードです。
  8. 投稿内のcamelCaseテキスト。
  9. ネストされた括弧、中括弧、および/または括弧。

これらのそれぞれが出現する回数を追跡でき、SpamAssassinのようにパーセプトロンなどの機械学習アルゴリズムの機能として使用できます。


25
ヒント:3は単語間のドットがタイプミスの結果である可能性があるため、重みが非常に低くなっています。5はURLと一致しないはずです。6の場合、アンパサンドはコードコンテキスト以外でも頻繁に使用されます。これにより、その文字の重みも低くなります。Notepad ++で時々見られるように、非コードテキストを強調表示できるため、蛍光ペンが機能するかどうかを再確認してください。
タマラWijsman

8
再 タイプミスとして-著者がとにかく編集する必要があるとしてフラグを立てても害はありません。
user151019

4
さらに、多くの言語が持つ特定のキーワードを助けることができる:WHILE、ELSE、IF、LOOP、BREAKなど
JoséNunoFerreira

6
「数値以外の単語の前の$の使用法:$ varはPerlおよびPHP(およびRuby?)で一般的です」を追加します。
フィロ

4
あなたは私を見つけませんSELECT DISTINCT name FROM people WHERE id IS NOT NULL
ブノワ

54

片方は英語で書かれ、もう片方はコードの平均的な指標が何なのか興味があります。

  • 段落の長さ
  • 行の長さ
  • 言葉の大きさ
  • 使用される文字
  • アルファベット、数字、その他の記号文字の比率
  • 単語ごとの記号の数

たぶんそれだけでコードと残りの部分を区別できるかもしれません。少なくとも、言語に関係なく、コードは多くの場合にいくつかの著しく異なるメトリックを表示すると考えています。

良いニュースは、統計を作成するためのデータがすでに十分にあることです。


前提をバックアップするために、いくつかのデータで戻ってきました。:-)

私はあなた自身の投稿とStackOverflow最初に見つけた投稿で、かなり高度なツールを使用して、簡単で汚れたテストを行いましたwc

wcこれら2つの例のテキスト部分とコード部分で実行した後、次のようになりました。

最初に英語の部分を見てみましょう:

  • 投稿の英語部分(2635文字、468語、32行)
    • 5文字/単語、82文字/行、14単語/行
  • 他の投稿の英語部分(1499文字、237単語、12行)
    • 6文字/単語、124文字/行、19単語/行

かなり似ていると思いませんか?

コード部分を見てみましょう!

  • 投稿のコード部分(174文字、13単語、3行)
    • 13文字/単語、58文字/行、4単語/行
  • 他の投稿のコード部分(4181文字、287ワード、151行)
    • 14文字/単語、27文字/行、2単語/行

これらの指標がそれほど大きく変わらないことをご覧ください。しかし、もっと重要なことは、それらが英語の指標とどれほど違うのでしょうか?そして、これは限られたツールを使用しているだけです。より多くのメトリクスを測定することで、本当に正確なものを取得できると確信しています(特にchars統計について考えています)。

クッキーをハズできますか?


6
行の長さ、特に箇条書きを除外し、特定の句読点を含む特定の長さ未満のクラスター化された行を探す場合は、適切な尺度と思われます。
ジョンホプキンス

これはコードのブロックで機能しますが、インラインcddeを探すのは非常に難しいようです。しかし、それがどれほど重要かはわかりません-より大きな問題は、とにかくフォーマットされていないコードの大きなブロックです。
cHao

3
クッキーはありません。あなたのポスト内のリンクは404です
james.garriss

@ james.garriss:インターネットは私のクッキージャーを盗みました。:(ただし、通知をいただき、ありがとうございます。
ジュリアンGuertault

23

通常、マルコフ連鎖はテキストの生成に使用されますが、トレーニングされたモデルに対するテキストの類似性(CE Shannon 1950による)の予測にも使用できます。複数のマルコフ連鎖をお勧めします。

普及している各言語について、その言語のコードの大きな代表的なサンプルでマルコフ連鎖をトレーニングします。次に、コードを検出するStack Overflowポストについて、チェーンごとに次の操作を実行します。

  • 投稿の行をループします。
    • 2つの変数を宣言します:ACTUAL = 1.0およびHIGHEST = 1.0
    • 行の各文字をループします。
      • 各文字について、現在の文字が前のN文字に続くものである確率をマルコフ連鎖で見つけます。ACTUAL = ACTUAL * PROB 1を設定します。現在の文字がチェーンに存在しない場合は、PROB 1に0.000001などの小さな値を使用します。
      • ここで、前のN文字に続く可能性が最も高い(つまり、最も高い確率の)文字を見つけます。HIGHEST = HIGHEST * PROB 2を設定します。
      • 明らかに、PROB 2 > = PROB 1

各行には、実際の値と最高の値が必要です。ACTUALをHIGHESTで割ります。これにより、特定の行がソースコードであるかどうかに関するフィットネススコアが得られます。これにより、指定した例の各行に番号が関連付けられます。

my problem is I need to change the database but I don't won't to create // 0.0032
a new connection. example: // 0.0023

DataSet dsMasterInfo = new DataSet(); // 0.04
Database db = DatabaseFactory.CreateDatabase("ConnectionString");   // 0.05
DbCommand dbCommand = db.GetStoredProcCommand("uspGetMasterName");  // 0.04

最後に、投稿にコードがあるときを判断するためのしきい値を選択する必要があります。これは、高いパフォーマンスが得られる、観察によって選択された数字である可能性があります。また、スコアの高い行の数を考慮することもできます。

トレーニング

トレーニングするには、言語のコードの代表的な大規模なサンプルを入手してください。コードテキストをループするプログラムを作成し、ファイル内の各N-gram(Nの範囲はパラメーター化する必要があります)を後続の文字の統計的頻度に関連付けます。これにより、それぞれが確率に関連付けられた、バイグラムに続くキャラクターの複数の可能な状態が生成されます。たとえば、バイグラム「()」には次のような文字の確率があります。

"()" 0.5-> ";"
"()" 0.2-> "."
"()" 0.3-> "{"

たとえば、「セミコロンが空の括弧に続く確率は0.5です」などと最初に読む必要があります。

トレーニングには、サイズ2〜5のN-gramをお勧めします。私がこれについていくつかの研究を行ったとき、私たちはサイズ2から5のN-gramが英語でうまくいくことを発見しました。ソースコードの多くは英語のようなものなので、その範囲から始めて、次に何が機能するかを見つけたら最適なパラメーター値を見つけるために調整することをお勧めします。

警告:モデルは識別子、メソッド名、空白などの影響を受けます。ただし、トレーニングを調整して、トレーニングサンプルの特定の機能を省略することができます。たとえば、不要な空白をすべて折りたたむことができます。入力内の空白の存在(Stack Overflowポスト)も無視できます。また、アルファベットの大文字小文字を無視することもできます。アルファベットの大文字小文字の区別は、さまざまな識別子の命名規則に直面した場合により弾力性があります。

私の研究中に、私たちの方法は英語だけでなくスペイン語でもうまく機能することがわかりました。これがソースコードでもうまく機能しない理由はわかりません。ソースコードは、人間の言語よりもさらに構造化され、予測可能です。


2
私が予見する唯一の問題は、確率がおもちゃの例よりもはるかに小さくなることです。数値的な不安定性を考えると、これはすべての確率がすぐに0になることを意味します。対数オッズを使用するとこれは解決します。さらに、より大きなトークン(つまり、文字ではなく単語/句読点)を使用します。
コンラッドルドルフ

2
@Konrad:ここでの考え方は、絶対確率をテストすることではなく、相対確率をテストすることです。各行について、その行のテキストは、英語の言語モデルまたはコード言語モデルによって生成された可能性が高いです。
ケンブルーム

5
既存のSO投稿でこのモデルをトレーニングできます(特にMarkdown構文を考慮する必要がある場合があるため)。ほとんどの投稿が正しくフォーマットされていると仮定する(または、数万のオーダーで多数の投稿を選択して、正しくフォーマットされていない投稿を削除する)場合、コードがフォーマットされていないものは英語のテキストであると想定します、およびコードがフォーマットされたものはコードであるため、実際のSO回答からトレーニングできます。
ケンブルーム

1
これを行う方法に関するチュートリアル(JavaでLingPipeを使用)は、LingPipeのWebサイトから入手できます。チュートリアルの最後には、この問題に取り組むためのテクニックに関する多くの論文があります。それらを読むことをお勧めします。
ケンブルーム

1
最先端のソリューションの投票数は非常に少なく、レートはすべてのアドホックソリューションよりもはるかに低いことは興味深いことです。オーバーフィットしやすい。
コンラッドルドルフ

13

根本的に異なるアプローチを提案できますか?そのため、許可される人間の言語は英語のみであるため、英語以外の言語はコードスニペットになる可能性が99.9%あります

だから私のソリューションは次のようになります。そこに多くの英語-チェッカーのいずれかを使用する(ダブルドット、など非言語シンボルのような構文ミス- -スペルミスの横にちょうど彼らが、信号を確認してください#~)。次に、大量のエラーと警告をスローする行/段落が「このコードですか?」をトリガーします。質問。

もちろん、このアプローチは、英語以外の言語を使用するStackExchangeサイトにも適用できます。

ちょうど私の2¢...


16
問題は、入ってくる質問の多くも英語ではないということです(ただし、それらは似ています)。
ブレンダンロング

3
@Brendan-この提案の利点を追加しました:投稿のおそらく英語になりそうな部分の間違いに下線を引いて(または強調して)、英語で書くのを助けます!;)
mac

1
私はオランダ人で、コーディングするものはすべて英語です。コメントはそうではありません(プロジェクトによって異なります)。したがって、英語以外のコードは十分ではないコードである必要があります。つまり、壊れた英語はコードでなければならないということです。
イヴォLimmen

@Ivo-私のコメントは、壊れた英語の問題について冗談まじりに扱われました!;)しかし、私の提案では、別の言語でのコメントは問題なく機能すると言います... 英語の OTOH ブロックコメントは、「このコードですか?」質問ですが、コメントが書かれたコードがすでにそれを引き起こしているので、それは問題ありません
...-mac

11

私はおそらくこれに対していくつかの票を得るつもりですが、あなたは間違った角度からこれに近づいていると思います。

この行は私を手に入れました:

どういうわけかこれを理解できない人々のために、人々は入って手動でコードをフォーマットしなければなりません

IMOの立場はkind慢のようなものです。問題はユーザーではなくソフトウェア自体、または少なくともUIである場合、プログラマーとデザイナーがソフトウェアを適切に使用する方法を理解できないユーザーに悩まされるソフトウェア設計でこれをたくさん見つけます。

この問題の根本原因はユーザーではなく、ユーザーがこれを実行できるかどうかが明らかではないという事実です。

これをより明確にするためのUIの変更はどうですか?きっとこれは:

  1. 新規ユーザーにとって、彼らが何をする必要があるかを正確に理解する
  2. 多数の言語のコードロジックを検出するための複雑なアルゴリズムを記述するよりも、構築が簡単です

例:

ここに画像の説明を入力してください


26
実際、このIMOは、「問題があります。助けてください。コードは下にあります」などの貧弱な質問を強制します。コードを質問から分離する必要はほとんどありません。最良の質問は次のようになります。「これを達成して、これらの2行のコードを記述しましたが、結果は次のようになります。問題は何ですか」-プレーン言語でコードが大きくインターリーブされています。
sharptooth

4
あなたの根本的な観察は正しいが、あなたの診断はまだ間違っている:実際、ジェフこのアプローチによってユーザーインターフェースを改善しようとしている。さらに、現在のUIは既にいくつかのサイクルを経ており、(劇的に)改善できることは疑いませんが、これは怠け者のバカに対する助けになるとは思いません。提案されたソリューションも同様です。@sharptoothはこれをカバーしています。
コンラッドルドルフ

2
「サポートコード」を投稿すると質問フローが不自然になる可能性があるため、ボックスを考えて+1しますが、具体的な提案には同意しません。私は私の質問の最後にコードを投げ込んだことがありません。ほとんどの場合、イントロ、サンプルコード、そして実際の質問を投稿します。インラインコードが不可欠であるという前提を受け入れる場合、何らかの形式のフォーマットが必要です。ユーザーが入力するか、システムが推奨するフォーマットです。そして、それはジェフがやることについて尋ねている正確なことです。
ニコール

1
@Konrad:上記のコメントに加えて、あなたのコメントに加えて、Jeffがこの道をたどってUIを改善しているのではなく、根本的な問題の症状を処理しているだけだと思います。間違いが起こらないようにUIが改善された場合、ユーザーに警告するソリューションは必要ありません。私の例が最終的な解決策であるという幻想はないが、「これを可能な限り最良の方法で提示するのか?」という質問に取り組む必要があると思う。
matt_asbury

1
単文使用してコードをマークしてください{}ボタンをテキストボックスの周りには十分である可能性があります。
パエロエベルマン

11

すべてのプログラミング言語は「[]」、「;」、「()」などの特殊文字に依存しているため、擬似コードは大きな課題になります。これらの特殊文字の出現を単純に数えます。バイナリファイルを検出するのと同じように(サンプルの5%以上にバイト値0が含まれています)。


[]()のようなこれらの特殊な文字のグループを持つように、これを改善します。{} =。これらのグループが2〜3個以上含まれる各行がコード行です。
ホンザ

...また、「= someword();」など、最も一般的な言語で一般的な文字列を探します ほとんどの中括弧言語、「<something>」や「<ab:cde>」などのXMLに似た構文、および他の言語のその他の一般的な文字列。実装する新しい言語が見つかったら拡張できるので、一般的な構文のある種のルックアップテーブルが良い解決策になると思います。
アルベシスター

おそらく擬似コードをドロップする必要があります。Cスタイルの言語として書くのが好きな人もいれば、VB6に近いもので平易な英語を使う人もいます
James P.

4

特定の言語のみを対象とする必要があるかもしれませんが、一般的に英語に非常に似た言語(例えば、inform7)を取得できるため、この問題は扱いにくいでしょう。幸いなことに、最もよく使用されるものはかなり簡単にカバーできます。

私の最初の切り口は、シーケンス「; \ n」を探すことです。これにより、C、C ++、Java、C#、および類似の構文を使用し、非常にシンプルな他の言語との良好な一致が得られます。また、英語で使用される可能性はaよりも低くなります。改行なし


プラス多分中括弧の豊富; p
マークグラヴェル

1
ジェフが彼の投稿で述べているように、彼らはおそらく主な言語のみを対象としています。そして、どのような場合には、私は新しいユーザーが(誰のために、この機能が意図される);-) INTERCAL、たとえば、よりC#やJavascriptを掲載する可能性が高いだろうと思われる
ベン

はい。ただし、これはプログラミング言語BRAINFUCKまたはBLANKでは機能しません。;-)
Ivo Limmen

4

誰かがタグを見て、そのための構文を探していると言いましたが、これは新しいユーザーを対象にしているので、打ち落とされました。

考えられるより良い解決策は、質問の本文で言語名を探し、同じ戦略を適用することです。「Javascript」、「Java」、または「C#」に言及した場合、それが問題である可能性があり、問題のコードはその言語である可能性が高いです。


特にタイトルが「vb c#.net dot net help help me help !!!」のようなものである場合
-NickAldwin

1

最初に、スペルチェックを実行します。適切な英語の単語はほとんど見つかりませんが、スペルチェッカーが分割することを提案する単語がたくさんあるはずです。

次に、普通の英語では一般的ではなく、コードでは一般的な句読点/特殊文字があります。

  • something(); 単純な英語にすることはできません。
  • $somethingここsomethingで、すべてが数値ではありません。
  • -> スペースなしの単語間;
  • . スペースなしの単語間;

もちろん、それをうまく機能させるために、これらの特性の上に構築されたベイジアン分類器が必要な場合があります。


1
()を含むインデントされていない行の検出; メッセージを提案する正当な理由でしょう。

コードを貼り付ける前にどのスペルチェッカーが詰まらないのですか?
ティムポスト

非ネイティブの英語の作家によって書かれたいくつかのメッセージで、スペルチェッカは、他のすべての単語...のどに詰まらされます
PhiLho

@Ph:これらの質問/回答は、とにかくSOでは受け入れられません。
バルテック

1

同様の構文を共有する言語のセットがいくつかあります。ほとんどの言語はいくつかの言語の影響を受けたため、言語[AMPL、AWK、csh、C ++、C-、C#、Objective-C、BitC、D、Go、Java、JavaScript、Limbo、LPC、Perl、PHP、 Pike、Processing [はすべてCの影響を受けているため、Cを検出した場合、これらの言語をすべて検出する可能性があります。したがって、この言語セットを検出するための単純なパターンを記述するだけで済みます。

また、ほとんどのコードは投稿内の他のテキストブロックからの2つの改行または同様のコードによって分割されるため、テキストをブロックに分割します。

これは、javascript(cファミリの非常に単純な不完全なサンプル)を使用して簡単に実行できます。

var txt = "my problem is I need to change the database but I don't won't to create a new connection. example:\n\nDataSet dsMasterInfo = new DataSet();Database db = DatabaseFactory.CreateDatabase(&quot;ConnectionString&quot;);DbCommand dbCommand = db.GetStoredProcCommand(&quot;uspGetMasterName&quot;);";
var blocks = txt.split(/\n\n/gi); console.dir(blocks);
var i = blocks.length;
var cReg = /if\s*\(.+?\)|.*(?:int|char|string|short|long).*?=.+|while\s*\(.+?\)/gi;

while ( i-- ){
   var current = blocks[i];
   if ( cReg.test( current ) ){
      console.log("found code in block[" +  i + "]");
   }
}

0

各行の単語/句読点を数えるだけです。英語は4以上、コードは2未満になる傾向があります。

上記の段落には、たとえば18の単語と4つの句読点があります。この段落には19の単語と4つの句読点が含まれているため、予想どおりです。

もちろん、これは初心者の英語が苦手なスピーカーの質問に対してテストする必要があり、そのような場合、統計が歪んでいる可能性があります。

[non-whitespace]。[whitespace or newline]はコードでは非常にまれですが、英語では一般的であるため、句読点ではなく単語として数えることができます。

最大の問題は、誰かが次のような質問をするインラインコードになると思います。

(i = 0; i> 100; i ++){}の場合、それはどういう意味ですか?

これはコードと英語であり、バックティックと同様にマークアップする必要があります。

私が言うのならばfor (i=0; i>100; i++) {}、それは何を意味するのでしょうか?


0

実際にそのように指定するだけで十分な(十分に)フォーマットされたコードと、とにかく手動でフォーマットする必要がある(あまりにも)不十分にフォーマットされたコードを区別する必要があると思います。

フォーマットされたコードにはブレークラインとインデントがあります。つまり、行の前に単一のブレークラインがある場合、適切な候補があります。その上に先頭に空白がある場合、非常に良い候補があります。

通常のテキストでは、書式設定に2つのブレークラインまたは2つのスペースと1つのブレークラインを使用するため、区別の明確な基準があります。

LISPコードではセミコロンが見つかりません。Rubyコードでは括弧が見つからない場合があります。擬似コードではほとんど見つかりません。しかし、(非難解な)言語では、ブレークラインとインデントでフォーマットされるまともなコードが見つかります。それほど普遍的なものはありません。最終的にコードは、人間が読むように書かれているためです。

最初に、潜在的なコードを検索します。また、通常、コード行はグループに分けられます。ある場合は、上または下のものもコード行である可能性があります。

潜在的なコード行を特定したら、定量化可能な基準に対してそれらチェックし、いくつかのしきい値を選択できます。

  • 単語以外の文字の頻度
  • 識別子の頻度:CamelCaseまたはunder_scoreスタイルの非常に短い単語または非常に長い単語
  • 珍しい言葉の繰り返し

また、プログラマとcsがあるため、stackoverflowの範囲は明らかに絞り込まれています。すべての言語タグを言語として表すことを検討するかもしれません。また、投稿する際には、少なくとも1つの言語タグを選択するlanguage-agnosticか、タグを選択するか、明示的に省略するように求められます。

最初のケースではどの言語を探すべきかを知っており、2番目のケースでは擬似コードを探したいかもしれません。フレームワークなど。


0

検出する言語ごとにパーサーを作成し(通常、ANTLRの言語定義を見つけるのは簡単です)、各パーサーで質問の各行を実行します。行が正しく解析される場合は、おそらくコードがあります。

これに伴う問題は、一部の英語(自然言語)文がコードとして解析される可能性があるため、他のアイデアも含めることができることです。または、1つまたは2つ以上の連続した行が同じ言語パーサー。

他の潜在的な問題は、これはおそらく擬似コードを拾わないということですが、それは大丈夫かもしれません。


多くの場合、人々はコードに構文エラーがあります(そしてこれについて尋ねています)。
パエロエベルマン

0

他の言語(現在使用されているプログラミング言語とは多少異なるように見える)の人気が高まり、現在使用されている言語の人気が低下するため、長期的には最も将来性があり、手作業での調整が最も少なくて済むものは、abやa()などの特定のものを探す代わりに、Google翻訳のようなもの(「仕組み」の段落を参照)。

言い換えれば、コード内で見つかったパターンを手動で探すのではなく、コンピューターが自分でパターンを把握できます。これは

  1. 多くの異なるプログラミング言語の多くのコード

    • 提案:Google CodeやGithubなどのWebベースのソースコードリポジトリから、または既にコードとしてマークされているStackoverflow上のものからでも、コードサンプルを自動的に取得します

    • 注:コードのコメントを解析することをお勧めします

  2. ウェブ上の記事から取られた多くの英語のテキスト

    • ただし、プログラミングに関する記事からではありません(そうしないと、コードが組み込まれ、システムが混乱する可能性があります:-))

ある種のアルゴリズムに英語以外のコードのパターンを自動的に検出させ、その逆を行い、それらのパターンを使用して投稿でアルゴリズムを実行することにより、コードとコードでないものを検出します。

(ただし、このようなアルゴリズムがどのように機能するかはわかりません。現在の質問に対する他の回答には、役に立つ情報が含まれている可能性があります。)

その後、システムは時々コードを再スキャンして、その時点でのコードの見方の変化に対応できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.