2

10,000 個の関数名のリポジトリがあり、C/C#/C++ で作成できるコードのコーパスでそれらの使用頻度があるとします。(彼らは通常規定されている異なる慣習を持っています)

一部のサンプルは次のとおりです。

DoPaint
OnPaint
CloseWindow
DeleteGraphOnClose
FreeConnection
ConnectInternat (smallTypo, but part of code)
FreeSoH 

関数名が与えられた場合、名前が Human Generated Name の規則に従っているかどうかをどのように予測できますか?

ノート:

  1. 明らかに、すべての候補名は有効な名前になります
  2. 生成された名前には任意の文字を含めることができ、不適切なものとして扱われます
  3. レターケースは文字化けする可能性があります

いくつかの候補:

Z090292 - not likely
onDelete - likely
CloseWindow - likely
iGetIndex - unlikely

技術ソフトウェアに関する指針は大歓迎です

4

6 に答える 6

2

テキストに対してベイジアン分析を実行してみてください。

  1. 名前 (およびその頻度) のリストをプログラムにロードします。この時点で、名前をトークン化する価値があるかもしれません。たとえば、CloseWindow は Close と Window になり、両方の頻度が増加します。この時点で、いくつかの人間以外の関数名をロードして、プログラムを否定的にトレーニングすることも役立ちます。
  2. 関数名を取り、収集したばかりのデータを使用して、各部分が出現する確率を見つけます

    P((HumanGenerated|トークンの参照) = P(トークンの参照|人間が生成した) * P(Humangenerated)) / P(トークンの参照)

この場合、何かが人間またはコンピューターで生成された可能性は、既知の知識に基づいて決定されます。つまり、関数名の何パーセントが人間によって生成されたと考えられます。

トークンが表示される確率 (P(Seeing the Token)) は、徐々に進化する必要があります。これは、トークンが人間の機能で見られる回数と、コンピューターの機能で見られる回数で構成されます...このソリューションは、プログラムが時間の経過とともに学習するという前提に基づいています (したがって、トレーニングが必要です)。 )

結果 P((HumanGenerated|Seeing the Token) は、関数名が人間によって生成された確率を示します。

注: これは大まかな概要に過ぎず、多くの詳細が欠落しています。この一連の調査に興味がある場合は、確率論、特にベイジアン分析を読むことをお勧めします

于 2009-08-29T21:57:59.363 に答える
1

識別子を (大文字化に基づいて) 個々の単語に分割し、その単語をスペル チェッカー ( ispellなど) に入れます。スペルミスのあるすべての単語は、それらが発生した識別子とともに、人間が生成したものではないと考えてください。

于 2009-08-29T21:43:52.590 に答える
1

私の友人が助けてくれるかもしれません。私が知る限り、彼はまさにこのテーマで博士号を取得しています。

ホームページ

于 2009-08-29T21:48:43.470 に答える
0

Martin V. Lowesが提案したように辞書を使用することに加えて、それは良いものですが、次の一般的な形式の変数も考慮する必要があります。

  1. 1文字の変数名。
  2. キャメルケースの代わりにアンダースコアを使用する変数名。
  3. メタ構文変数。
  4. ハンガリアン記法。
  5. 文字が付加されたキーワード/タイプ(つまり$return、またはlist_)。
于 2009-08-29T22:24:37.047 に答える
0

それが人為的なものかどうかを予測することは、非常に難しい問題です。関数名を見つけるためにコード ベースを分析する方が簡単です。NDependなどのツールを調べるとよいでしょう。

于 2009-08-29T21:45:18.623 に答える
0

おそらくキャメルケースを検出できます。また、次の大文字の単語の前で、do、get、set、in などの典型的な単語を正規表現検索することもできます。

于 2009-08-29T21:46:21.133 に答える