【发布时间】:2011-04-05 17:45:40
【问题描述】:
我应该编写代码,当给定一个文本文件(源代码)作为输入时,它将输出它是哪种编程语言。这是问题的最基本定义。更多约束如下:
- 我必须用 C++ 编写。
- 应识别多种语言 - html、php、perl、ruby、C、C++、Java、C#...
- 误报(错误识别)的数量应该很低 - 输出“未知”比输出错误结果更好。 (它将在概率列表中,例如未知:100%,见下文)
- 输出应该是代码知道的每种语言的概率列表,所以如果它知道 C、Java 和 Perl,则输出应该是例如:C: 70%, Java: 50%, Perl: 30% (请注意,概率总和不需要达到 100%)
- 它应该具有良好的准确性/速度比(速度更受青睐)
如果代码的编写方式可以很容易地添加新的语言进行识别,并且只需为该特定语言添加“设置/数据”,那就太好了。我可以使用任何可用的东西——启发式、神经网络、黑魔法。任何事物。我什至可以使用现有的解决方案,但是:解决方案必须是免费的、开源的并允许商业使用。它必须以易于集成的源代码或静态库的形式出现 - 没有 DLL。但是我更喜欢编写自己的代码或仅使用其他解决方案的片段,我厌倦了集成其他人的代码。最后一点:也许你们中的一些人会建议 FANN(快速人工神经网络库)——这是我唯一不能使用的东西,因为这是我们已经使用的东西,我们想要替换它。
现在的问题是:你会如何处理这样的任务,你会怎么做?有什么建议如何实现或使用什么?
编辑: 基于 cmets 和答案,我必须强调一些我忘记的事情:速度非常关键,因为这将获得数千个文件并且应该快速回答,所以看一千个文件最多应在几秒钟内为所有文件生成答案(文件的大小当然会很小,每个文件只有几 kB)。所以试图编译每一个是没有问题的。问题是,我真的想要每种语言的概率 - 所以我更想知道该文件可能是 C 或 C++,但它是 bash 脚本的机会非常低。由于代码混淆、cmets 等。我认为寻找 100% 准确的代码是一个坏主意,实际上不是这样做的目标。
【问题讨论】:
-
一个相当厚颜无耻的想法 - 通过每种语言的编译器运行它,然后选择一个不会出错的? ;)。 (是的,我知道 - 可能很慢,如果代码无法编译,或者用户正在编写 polygots 等,可能会完全出错。)
-
+1:很好的问题。但我认为“概率”部分没有意义:输入在特定语言中要么是合法的,要么不是。我不明白它属于语言 A 的概率高于属于语言 B 的概率是什么意思。
-
@Philip Potter:这是我想要概率的原因之一,而不是一个明确的答案。
标签: c++ algorithm text-processing language-recognition