это продолжение моего недавнего вопроса ( Код для определения языка программирования в текстовом файле ).Я очень благодарен за все ответы, которые я получил, это мне очень помогло. Мой код для этой задачи завершен, и он работает довольно хорошо - быстро и достаточно точно.
Я использовал следующий метод: у меня есть "обучающий" скрипт на Perl, которыйопределяет наиболее часто используемые слова в языке, выполняя гистограмму слова над набором файлов примеров.Эти данные затем загружаются программой c ++, которая затем проверяет заданный текст и накапливает баллы для каждого языка на основе найденных слов, а затем просто проверяет, какой язык набрал наибольшее количество баллов.
Теперь я хотел бысделать это еще лучше и немного поработать над качеством идентификации. Проблема в том, что я часто получаю «неизвестность» в результате (многие языки набирают небольшое количество баллов, но ни один из них не превышает моего порога).После некоторой отладки, исследований и т. Д. Я обнаружил, что это, вероятно, связано с тем, что все слова считаются равными.Это означает, что просмотр «#include», например, имеет тот же эффект, что и «while» - оба указывают на то, что это может быть c / c ++ (сейчас я игнорирую тот факт, что «while» используется во многих другихязыки), но, конечно, в больших файлах .cpp может быть тонна "while", но в большинстве случаев только несколько "#include".
Так что факт "#include"«важнее игнорируется, потому что я не смог придумать, как определить, является ли слово более важным, чем другое». Теперь имейте в виду, что скрипт, который создает данные, довольно глуп, его толькогистограмму слова, и каждому выбранному слову присваивается оценка 1. Он даже не смотрит на слова (поэтому, если в файле часто встречается «# & |? /», он может быть выбран как хорошее слово).
Также я хотел бы, чтобы часть создания данных была полностью автоматизирована, поэтому никто не должен смотреть на данные и изменять их, менять оценки, менять слова и т. Д. Все «мозговые» должны быть в сценарии иCPP Program.
Есть ли у кого-нибудь предложения, как определить ключевые слова или, в более общем смысле, важные слова? Некоторые вещи, которые могут помочь: у меня есть число вхождений каждого слова и количествоВсего слов (так что соотношение может быть рассчитано).Я также думал о том, чтобы стереть такие символы, как; и т. Д., Так как скрипт гистограммы часто добавляет, например, «продолжить»;в результате, но важное слово «продолжить».Последнее замечание: все проверки на равенство выполняются для точного соответствия - без подстрок, с учетом регистра.Это в основном из-за скорости, но подстроки могут помочь (или повредить, я не знаю) ...
ПРИМЕЧАНИЕ: спасибо всем, кто потрудился ответить, вы мне очень помогли.
Моя работа с этим почти закончена, поэтому я опишу, что я сделал, чтобы получить хорошие результаты.
1) Получите приличный обучающий набор, около 30-50 файлов на язык из различных источников, чтобы избежатьсмещение стиля кодирования2) Напишите Perl-скрипт, который выполняет гистограмму слова.Реализация черного и белого списков (подробнее об этом ниже)3) добавить фиктивные слова в черный список, такие как «лицензия», «the» и т. Д. Они часто встречаются в начале файла в информации о лицензии.4) добавить около пяти самых важных слов для каждого языка в белый список.Это слова, которые встречаются в большинстве исходных кодов данного языка, но не достаточно часто встречаются в гистограмме.Например, для C / C ++ у меня были: #include, #define, #ifdef, #ifndef и #endif в белом списке.5) Подчеркните начало файла, поэтому дайте больше очков словам, найденным в первых 50-100 строках.6) при выполнении гистограммы слова токенизируйте файл, используя @words = split(/[\s\(\){}\[\];.,=]+/, $_);
Это должно быть приемлемо для большинства языков, которые я считаю (дает мне лучшие результаты).Для каждого языка, около 10-20 наиболее часто употребляемых слов в окончательных результатах.7) Когда гистограмма будет завершена, удалите все слова, найденные в черном списке, и добавьте все те, которые находятся в белом списке.
8) Напишите программу, которая обрабатывает текстовый файл так же, как скрипт - токенизируйте по тем же правилам. Если в данных гистограммы найдено слово, добавьте точки на нужный язык. Слова в гистограмме, которые соответствуют только одному языку, должны добавлять больше точек, а те, которые принадлежат нескольким языкам, должны добавлять меньше.
Комментарии приветствуются. В настоящее время около 1000 текстовых файлов я получаю 80 неизвестных (в основном на очень короткие файлы - в основном JavaScript с одной или двумя строками). Около 20 файлов распознаются неправильно. Размер файлов составляет около 11 КБ в диапазоне от 100 до 100 КБ (почти 11 МБ). Обработка их всех занимает одну секунду, что для меня достаточно.