因为GMail在电子邮件中检测到字符串
see the attached
,但没有实际附件,当我单击“发送”按钮时,它会通过“确定” /“取消”对话框警告我。也就是说,当用户输入这样的帖子时:my problem is I need to change the database but I don't won't to create a new connection. example: DataSet dsMasterInfo = new DataSet(); Database db = DatabaseFactory.CreateDatabase("ConnectionString"); DbCommand dbCommand = db.GetStoredProcCommand("uspGetMasterName");
该用户未将其代码格式化为代码!
,则他们没有在每个Markdown上缩进4个空格,也没有使用代码按钮(或键盘快捷键ctrl + k)为其执行缩进。
因此,我们的系统正在接受许多编辑,需要人们进入,并手动格式化那些无法解决此问题的人们的代码。这导致很多肚皮舞。我们已经多次改善了编辑器的帮助,但是由于没有赶到用户家并为他们按下键盘上的正确按钮,我们不知所措,下一步该做什么。
这就是我们考虑使用Google GMail样式警告的原因:
您是要发布代码吗?
您写了一些我们认为看起来像代码的东西,但是您没有使用工具栏代码按钮或ctrl + k代码格式化命令通过缩进4个空格来将其格式化为代码。
但是,显示此警告要求我们检测是否存在我们认为问题中未格式化的代码。一种简单,半可靠的方法是什么?
每次Markdown时,代码总是缩进4个空格或在反引号内,因此正确格式化的任何内容都可以立即从支票中丢弃。
这只是警告,它将仅适用于问他们的第一个问题(或提供他们的第一个答案)的低声誉用户,因此,只要它们的百分比在5%或以下,就可以接受一些误报。
关于堆栈溢出的问题可以使用任何语言,尽管实际上可以将检查范围限制为“十大”语言。每个标签页面都是C#,Java,PHP,JavaScript,Objective-C,C,C ++,Python,Ruby。可以在Stack Overflow的前10个标签中提问),看看它是如何工作的。 )。吻!如果您的解决方案要求我们尝试使用10种不同的编译器来编译帖子,或者需要一群人来手动训练贝叶斯推理引擎,那...就不完全是我们的初衷。 />
#1 楼
适当的解决方案可能是一些学习/统计的模型,但是这里有一些有趣的想法:仅此一项就可以捕获一大堆语言。 >花括号,方括号的存在:myFunc()
“注释”语法的存在(/ *,//等):
foo.bar = ptr->val
不常见的字符/运算符:
while (true) { bar[i]; }
在文本上运行语法荧光笔。如果它最终突出显示了较高的百分比,则可能是代码。
驼峰中的案例文本。
嵌套括号,括号和/或括号。
跟踪每种方法出现的次数,这些方法可以用作机器学习算法(如感知器)中的功能,就像SpamAssassin一样。
评论
提示:3的权重非常低,因为单词之间的点可能是拼写错误的结果。 5个不应匹配的URL。对于6,在代码上下文之外也经常使用&符,这也可能会使该字符的权重降低。再次检查荧光笔是否可以正常工作,因为荧光笔可以突出显示非代码文本,正如我有时在Notepad ++中看到的那样。
–塔玛拉·维斯曼(Tamara Wijsman)
2011-6-28在10:27
重新。作为错别字-标记作者应该进行编辑不会有任何危害。
–mmmmmm
2011-6-28在10:29
此外,许多语言可以帮助您的特定关键字:WHILE,ELSE,IF,LOOP,BREAK等。
–JoséNunoFerreira
2011年6月28日上午10:45
添加“在非数字词之前使用$:在Perl和PHP(和Ruby?)中,$ var很常见。”
– PhiLho
11年6月28日在11:37
您不会从ID不为NULL的人员中检测到我的SELECT DISTINCT名称。
–天赋
2011年6月29日下午4:57
#2 楼
我很想知道一方面英语写作的平均标准是多少,而另一方面则是代码。段落的长度
行的长度
单词大小
使用的字符
字母,数字和其他符号字符之间的比率
每个单词的符号数
等。
也许仅此一项就可以区分代码和其余代码。至少我相信,无论使用哪种语言,代码在很多情况下都会显示出一些明显不同的指标。
好消息是:您已经有大量数据可用来建立统计数据。
好吧,我回来了一些数据来支持我的假设。 :-)
我对自己的帖子以及在StackOverflow上找到的第一篇帖子进行了快速而肮脏的测试,并使用了一个非常高级的工具:
wc
。在这两个示例的文本部分和代码部分运行wc
之后,我得到的是什么:首先让我们看一下英语部分:
英语帖子的一部分(2635个字符,468个单词,32行)
5个字符/单词,82个字符/行,14个单词/行
其他文章的英语部分(1499个字符,237个单词,每行12条)
6个字符/单词,每行124个字符,每行19个字符单词/行
你觉得很相似吗?
现在让我们看一下代码部分!
帖子的代码部分(174个字符,13个单词,3行)
13个字符/单词,58个字符/行,4单词/行
其他帖子的代码部分(4181个字符,287个单词,151行)
14个字符/ word,27个字符/行,2单词/行
看看这些度量标准有多大不同,但更重要的是,它们与英语度量标准有多大不同?这只是使用有限的工具。我现在确定可以通过测量更多指标来获得真正准确的信息(我特别在考虑字符统计信息)。
我可以饼干吗?
评论
行长,特别是如果您排除项目符号点并寻找小于特定长度且包含特定标点符号的聚集行,则似乎是一个不错的选择。
–乔恩·霍普金斯(Jon Hopkins)
11年6月28日在9:30
这将适用于代码块,但查找内嵌cdde似乎要困难得多。不过,不确定到底有多重要-更大的问题是反格式代码的大块。
– cHao
2011年7月2日在17:42
没有饼干。您帖子中的链接是404。
–james.garriss
2014年10月3日,12:21
@ james.garriss:互联网偷了我的饼干罐。 :(不过,谢谢您的通知。
–朱利安·盖尔特(Julien Guertault)
14-10-8在14:27
#3 楼
通常,马尔可夫链用于生成文本,但也可以用于预测文本(根据C.E. Shannon 1950)与训练模型的相似性。我建议使用多个马尔可夫链。对于每种流行的语言,请在该语言的大量代表性代码样本上训练马尔可夫链。然后,对于要检测其代码的Stack Overflow帖子,对每个链条执行以下操作:
在帖子中的各行之间循环。 />声明两个变量:ACTUAL = 1.0和HIGHEST = 1.0
遍历行中的每个字符。
对于每个字符,请在马尔可夫链中找到当前字符为前N个字符之后的一个。设置ACTUAL = ACTUAL * PROB1。如果链中不存在当前字符,则为PROB1使用一个很小的值,例如0.000001。
现在,找到最有可能(即最高概率)跟随前N个字符的字符。设置HIGHEST = HIGHEST * PROB2。
显然,PROB2> = PROB1
对于每一行,您应该具有ACTUAL和HIGHEST值。用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-> "{"
为了训练,我建议使用大小为2到5的N-gram。回到我对此进行一些研究时,我们发现N-gram大小为2到5的英语非常有效。由于大多数源代码都像英语一样,所以我建议从该范围开始,然后在找到可行的参数时进行调整以找到最佳的参数值。按标识符,方法名称,空格等。但是,您可以调整训练以忽略训练样本的某些功能。例如,您可以折叠所有不必要的空格。输入中的空白(Stack Overflow帖子)也可以忽略。您也可以忽略字母大小写,这在面对各种标识符命名约定时会更有弹性。我不明白为什么这对于源代码也不能很好地起作用。源代码比人类语言更具结构性和可预测性。
评论
我预见的唯一问题是,概率将比玩具示例中的概率小得多。给定数值不稳定性,这意味着很快所有概率都为0。但是使用对数赔率可以解决此问题。此外,我会使用较大的令牌(即不是字符,而是单词/标点符号)。
–康拉德·鲁道夫(Konrad Rudolph)
2011年6月28日15:20
@Konrad:这里的想法不是测试绝对概率:是测试相对概率。对于每一行,该行的文本更有可能是由英语语言模型还是由代码语言模型生成的。
–肯·布鲁姆
2011年6月28日15:48
您可以在现有的SO帖子上训练该模型(特别是因为您可能需要考虑Markdown语法)。如果您假设大多数帖子格式正确(或者您从数以万计的大量帖子中删除了格式不正确的帖子),那么您会认为未代码格式的内容是英文文本,而经过代码格式化的东西就是代码,您可以从实际的SO答案中进行训练。
–肯·布鲁姆
2011年6月28日15:51
LingPipe网站上提供了有关如何执行此操作的教程(在Java中使用LingPipe)。在本教程的最后,有许多关于解决该问题的技术的论文。我建议阅读它们。
–肯·布鲁姆
11年6月28日在16:04
有趣的是,最新解决方案的投票数非常低,而且评分远远低于所有临时解决方案,这些解决方案虽然足够好,但在很大程度上依赖于特殊情况,并且固有地会很不错容易过拟合。
–康拉德·鲁道夫(Konrad Rudolph)
2011年7月3日在10:56
#4 楼
我可以建议一种根本不同的方法吗?因此,唯一允许使用的人工语言是英语,因此非英语的任何东西都有99.9%的机会成为代码段。 -检查器(只需确保它们还发出信号-除了拼写错误以外-语法错误,例如双点,或非语言符号,例如#
或~
)。然后,任何引发大量错误和警告的行/段落都将触发“此代码是吗?”问题。当然,对于使用其他英语以外的其他语言的StackExchange网站,也可以采用这种方法。
我的2¢...
评论
问题在于,很多传入的问题也不是英语(尽管它们很像)。
–布伦丹·朗(Brendan Long)
11年6月28日在19:07
@Brendan-然后增加了此建议的优势:在帖子中可能打算成为英文的部分加下划线(或突出显示)中的错误,并帮助作者用英语编写…… ;)
–mac
11年6月28日在19:12
我是荷兰人,我编写的所有代码都是英文,通过注释不是(取决于项目)。因此,非英语必须是代码不足的。那或您的意思是,破损的英语必须是代码。
–伊沃·利门(Ivo Limmen)
2011-6-28在20:14
@Ivo-我的评论是开玩笑地针对破碎的英语问题! ;)但是,我想说的是,用其他语言的提案注释会很好用...英文的OTOH块注释不会触发“这是代码吗?”问题,但这很好,因为为其编写注释的代码已经触发了它……
–mac
2011年6月28日在20:22
#5 楼
我可能会为此获得一些反对,但我认为您是从错误的角度来解决这个问题。人们必须手动输入格式代码,以便那些以某种方式无法弄清这个问题的人
IMO立场是自大的。我在软件设计中发现了很多问题,程序员和设计师对那些无法弄清楚如何正确使用软件的用户感到恼火,而问题出在用户而非软件本身,或者至少是UI上。 />
造成此问题的根本原因不是用户,而是他们对他们不知道可以这样做的事实。这个更明显吗?当然,这将是:
对于新用户而言,他们确切地知道他们需要做什么
更容易为您构建,而不是编写复杂算法来检测大量语言
示例:
评论
实际上,此IMO提出了一些很糟糕的问题,例如“我有问题,请帮助我,代码在下面”-很少需要将代码与问题分开。最好的问题是这样的:“我想实现这一点,并编写了这两行代码,但是效果却出在下面,这是什么问题”-很少有代码与普通语言相互交错。
–锋利的牙齿
2011年6月28日12:50
您的根本观察是正确的,但是您的诊断仍然是错误的:实际上,Jeff正在尝试通过这种方法来改善用户界面。此外,当前的用户界面已经经历了多个周期,尽管我毫不怀疑它可以得到改善(从根本上来说),但我怀疑这是否有助于防止懒惰的白痴。您提出的解决方案也不会。 @sharptooth已对此进行了说明。
–康拉德·鲁道夫(Konrad Rudolph)
2011年6月28日15:24
我想开箱即用+1,但我不同意具体建议,因为张贴“支持代码”会迫使问题流变得不自然。我从来没有在问题的底部抛弃过代码。我几乎总是发布简介,示例代码,然后发布实际问题。如果您接受内联代码必不可少的前提,那么就需要某种类型的格式设置-格式设置必须由用户输入或由系统建议。而这正是杰夫要问的事情。
–妮可
2011-6-28在16:23
@Konrad:除了我的上述评论和对您的回应之外,我不认为Jeff会通过这种方式改善UI,而只是处理潜在问题的症状。如果对UI进行了改进,以至于不会犯错误,那么就不需要警告用户的解决方案。我毫不怀疑我的例子是最终的解决方案,但需要思考“我们是否以最好的方式提出这个问题?”。
–matt_asbury
2011-6-28 20:29
简单的句子,请使用文本框周围的{}按钮标记代码即可。
–PaŭloEbermann
2011年6月28日23:55
#6 楼
伪代码将构成真正的挑战,因为所有编程语言都依赖于特殊字符,例如“ []”,“;”,“()”等。就像检测二进制文件一样(样本的5%以上包含字节值0)。评论
我将尽可能多地改善这些特殊字符的组成,例如[](); {} =。每行包含超过2-3个这些组的代码行。
– Honza
2011年6月28日上午8:19
...并寻找最常用语言的常用字符串,例如“ = someword();”对于大多数花括号语言,类似XML的语法(例如“
– Arve Systad
2011年6月28日8:27
您可能应该删除伪代码。有些人喜欢将其编写为C风格的语言,但其他人将使用纯正的英语,看起来更接近VB6
–詹姆斯P.
2011年6月28日14:25
#7 楼
我认为您可能只需要针对特定语言,一般来说,这个问题很棘手,因为您可以获得与英语非常相似的语言(例如notify7)。但是幸运的是,最常用的代码可以很容易地覆盖。以及其他任何使用类似语法且非常简单的语言。与英文相比,它也不太可能用英文;没有换行符评论
加上大量的花括号; p
– Marc Gravell♦
2011-6-28在8:15
正如Jeff在他的帖子中所说,它们可能只会针对主要语言。而且无论如何,我怀疑新用户(打算使用此功能的用户)比INTERCAL ;-)更有可能发布C#或Javascript。
–本
2011年6月28日上午8:28
是的,但这不适用于编程语言BRAINFUCK或BLANK。 ;-)
–伊沃·利门(Ivo Limmen)
2012年9月3日18:01
#8 楼
有人提到先查看标记,然后再寻找语法,但是由于针对新用户而被拒绝了。问题,然后应用相同的策略。如果我提到“ Javascript”,“ Java”或“ C#”,那么问题就出在这里,问题中的代码很可能就是该语言。评论
特别是如果标题是“ vb c#.net dot net帮我救救我!”
– Nick Aldwin
11年6月28日在14:12
#9 楼
首先,通过拼写检查运行它,它将发现很少的正确英文单词,但是应该有很多单词会被拼写检查器建议拆分。英文,典型代码:something();
不能只是普通英语; br /> $something
之间没有空格的单词; something
之间没有空格的单词; 当然要使其运行良好,您可能希望在这些特征的基础上构建贝叶斯分类器。
评论
检测包含()的非缩进行;将是建议该消息的一个很好的理由。
–user2567
2011年6月28日在8:22
粘贴代码之前不会拼写什么拼写检查器?
– Tim Post
11年6月28日在9:09
有了非母语英语作者写的一些信息,拼写检查器将阻塞其他所有单词。
– PhiLho
11年6月28日在11:33
@Ph:SO始终不接受这些问题/答案。
–vartec
2011年6月28日上午11:40
#10 楼
有几种语言共享相似的语法。大多数语言受几种语言的影响,因此[AMPL,AWK,csh,C ++,C-,C#,Objective-C,BitC,D,Go,Java,JavaScript,Limbo,LPC,Perl,PHP, Pike,Processing [都受C的影响,因此,如果您检测到C,则可能会检测到所有这些语言。因此,您只需编写一个简单的模式即可检测该语言集。我还将文本分成多个块,因为大多数代码将被两个换行符分隔,或者与其他文本块相似
这可以使用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("ConnectionString");DbCommand dbCommand = db.GetStoredProcCommand("uspGetMasterName");";
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 + "]");
}
}
#11 楼
只需对每行单词/标点符号进行计数。英语通常具有4个或更多,代码少于2个。上面的段落有18个单词,例如4个标点符号。本段有19个单词和4个标点符号,因此在预期范围内。偏斜。
我希望[non-whitespace]。[whitespace或newline]在代码中非常少见,但在英语中很常见,因此可以算作单词而不是标点符号。
我认为最大的问题将是内联代码,有人会问这样的问题:
如果我说(i = 0; i> 100; i ++){}这是什么意思?
这是代码和英文,应该用反引号标记:
如果我说
for (i=0; i>100; i++) {}
这是什么意思?#12 楼
我认为您应该首先区分仅需要实际指定的(足够)格式化的代码和(仍然)仍然需要手动格式化的(太)格式化差的代码。格式化的代码有断行和缩进。那就是:如果一行之前有一个单独的换行符,那么您就有一个不错的候选人。如果最重要的是空格,那么您将是一个非常不错的候选者。 >
在LISP代码中找不到分号,在Ruby代码中可能找不到括号,在伪代码中可能根本找不到。但是,在任何(非深奥的)语言中,您都会发现体面的代码将使用断行和缩进进行格式化。没有什么比这更普遍了。因为最后编写的代码是供人类阅读的。
因此,首先,搜索潜在的代码行。同样,代码行通常成组出现。如果您有一个,则很有可能上面或下面的那一行也是一行代码。
一旦您挑出了潜在的代码行,就可以根据可量化的标准检查它们并选择一些阈值:
非单词字符的频率
标识符的频率:非常短的单词或具有CamelCase或under_score样式的非常长的单词
不常见单词的重复
另外,现在有了程序员和CS,stackoverflow的范围明显缩小了。人们可能会考虑将所有语言标签表示为语言。在发布时,系统会要求您至少选择一种语言标签,选择
language-agnostic
标签或明确省略它。 在第一种情况下,您知道要查找的语言;在第二种情况下,您可能要寻找伪代码;在最后一种情况下,可能没有任何代码,因为这是与某种技术或框架等有关的问题。
#13 楼
您可以为要检测的每种语言创建一个解析器(通常很容易找到ANTLR的语言定义),然后通过每个解析器运行问题的每一行。如果任何行都能正确解析,则可能是您有代码。 ,否则只有在使用同一语言解析器正确解析多于一两个连续行的情况下,才可以限制肯定结果。好吧评论
人们通常在他们的代码中有语法错误(并对此进行询问)。
–PaŭloEbermann
2011年6月29日,0:02
#14 楼
从长远来看,什么可能是最适合未来的,并且需要最少的手动调整,因为其他语言(看起来与现在使用最多的编程语言有所不同)会变得越来越流行,而当前使用的语言却变得不那么流行类似于Google翻译的功能(请参见标题为“它如何工作?”的段落),而不是查找诸如ab和a()之类的某些东西。换句话说,而不是手动考虑到要查找的代码中的模式,计算机可以自行解决。这可以通过使用许多不同编程语言的大量代码
建议:从Web上自动获取代码示例的源代码存储库,例如Google Code或Github,甚至来自Stackoverflow上已经标记为代码的内容
注意:解析代码注释可能是一个好主意
很多英语文本都摘自网络文章
,尽管不是摘自有关编程的文章(否则它们中可能包含代码并混合系统:-))
并具有某种算法,可以自动在代码中查找非英语的模式,反之亦然,并使用这些模式来检测什么是代码以及什么是代码
(但是,我不确定这样的算法如何工作。当前问题的其他答案可能对此有有用的信息。)
然后系统可以重新扫描eve偶尔尝试解决代码在该时间点的外观变化。
评论
我认为,如果仅在没有缩进的情况下始终显示警告,那么您将远远低于5%的错误限制。这只是个笑话而已。@Konrad如果出现以下消息,则效果会更好:“或者您的问题是缺少有助于他人理解的代码示例,或者您忘记了对其进行适当的缩进”。这应该覆盖所有案例的99%。
这是一个很好的问题,但我觉得没有答案。您向我展示了一个防止白痴的系统,我将向您展示一个更好的白痴。即使CODE可以解决此问题,也许也不应该吗?正是这些无知的人不厌其烦地问一个正确的问题,正在为像我这样提出正确问题并做出正确答案的人而烦恼。
我见过的一个常见模式是本身已适当缩进的一段代码,但其中的第一行和最后一行(通常只有这两行,例如在显示多个功能时有时会更多)未标记为代码。这可能也应该被检测到。
附带说明一下,GMail确认文本相当混乱。如果您对第一个问题的回答是“是”,那么第二个问题的回答是“否” ...