Как предсказать, соответствует ли имя функции соглашению - PullRequest
2 голосов
/ 30 августа 2009

Предположим, у вас есть хранилище из 10000 имен функций и, возможно, их частота использования в корпусе кода, который может быть на C / C # / C ++. (у них обычно прописаны разные условности)

Некоторые образцы могут быть:

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

Теперь, когда нам дано имя функции, как мы можем предсказать, будет ли это имя соответствовать соглашению, созданному человеком ?

Примечание:

  1. Очевидно, что все имена кандидатов будут действительными именами
  2. сгенерированные имена могут иметь произвольные символы и будут рассматриваться как плохие
  3. Буквенные кейсы могут быть искажены

Некоторые кандидаты:

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

Любые указатели на технику и программное обеспечение приветствуются

Ответы [ 6 ]

2 голосов
/ 30 августа 2009

Вы можете попробовать провести байесовский анализ текста:

  1. Загрузить список имен (и их частоты) в вашу программу. Возможно, стоит пометить имена на этом этапе. Так, например CloseWindow становится Close и Window, причем частота обоих увеличивается. На этом этапе было бы также полезно загрузить некоторые не-человеческие имена функций, чтобы обучить программу и отрицательным словам.
  2. Возьмите имя функции, и, используя только что собранные данные, найдите вероятность появления каждой детали

    P ((Генерируемый человеком | Видящий токен) = P (Видящий токен | Генерируемый человеком) * P (Генерируемый человеком)) / P (Видящий токен)

В этом случае вероятность того, что что-то будет сгенерировано человеком или компьютером, будет определяться на основе известных знаний, т. Е. Какой процент имен функций считается сгенерированным человеком.

Вероятность увидеть жетон (P (Видя жетон)) должна будет постепенно эволюционировать. Он будет состоять из количества раз, которое токен виден в человеческих функциях, и количества раз, когда он виден в компьютерных функциях ... это решение основано на предпосылке, что программа изучает со временем (и, следовательно, нуждается в обучении )

Результат, P ((HumanGenerated | Seeing Token), даст вам вероятность того, что имя функции будет сгенерировано человеком.

Примечание: это только грубый набросок, многие детали отсутствуют. Если вас интересует это направление исследований, я бы предложил ознакомиться с теорией вероятностей и, в частности, с байесовским анализом

1 голос
/ 30 августа 2009

Мой друг может помочь. Насколько я могу судить, он готовит докторскую диссертацию по этому вопросу.

Домашняя страница

1 голос
/ 30 августа 2009

Разделите идентификаторы на отдельные слова (на основе заглавных букв) и поместите слова в средство проверки орфографии (например, ispell ). Считайте все слова с орфографическими ошибками негенерированными, а также идентификаторы, в которых они встречаются.

0 голосов
/ 30 августа 2009

В дополнение к использованию словаря, как предложил Мартин В. Лоус, это хороший вариант, но вы должны также учитывать следующие общие формы переменных:

  1. Однобуквенные имена переменных.
  2. Имена переменных, в которых вместо верблюда используется знак подчеркивания.
  3. Метасинтаксические переменные.
  4. Венгерская запись.
  5. Ключевые слова / типы с присоединенным символом (т. Е. $return или list_).
0 голосов
/ 30 августа 2009

Вы, вероятно, можете обнаружить верблюжий чемодан. Кроме того, вы можете выполнить поиск по регулярному выражению для типичных слов, таких как: do, get, set, in и т. Д. До следующего заглавного слова.

0 голосов
/ 30 августа 2009

Прогнозирование, созданное человеком, - очень сложный вопрос. Проанализировать базу кода, чтобы найти имена функций, проще - вы можете взглянуть на такие инструменты, как NDepend .

...