这是我最近的问题(Code for identifying programming language in a text file)的跟进。我真的很感谢我收到的所有答案,这对我很有帮助。 我完成此任务的代码非常有效,可以快速,合理地准确地工作。
我使用的方法如下:我有一个“学习”的Perl脚本,它通过对一组示例文件进行单词直方图来识别一种语言中最常用的单词。这些数据然后由c++程序加载,然后c++程序检查给定的文本并根据找到的单词为每种语言累积分数,然后简单地检查哪种语言累积了最高分数。
现在,我想做得更好,并在识别质量上有所作为。 问题是(很多语言的分数很小,但是没有什么比我的阈值高)的原因常常使我变得“未知”。经过一些调试,研究等,我发现这可能是由于事实,所有单词都被认为是相等的。这意味着,例如,看到“#include”与看到“while”具有相同的效果-两者都表明它可能是c/c++(我现在忽略了“while”在许多其他示例中使用的事实语言),但当然,在较大的.cpp文件中,可能会有大量的“while”,但大多数情况下只有少数“#include”。
因此忽略了“#include”更重要的事实,因为我无法提出一种好的方法来识别一个单词是否比另一个单词更重要。 现在请记住,创建数据的脚本非常愚蠢,它只是一个单词直方图,并且为每个选定的单词分配一个分数1。它甚至不查看单词(因此,如果出现“#& |?/”通常会被选作一个好词)。
我也想让数据创建部分完全自动化,所以没有人应该去看数据并更改它们,更改分数,更改单词等。所有的“brainz”都应该在脚本和cpp程序中。
有人建议如何识别关键字,或更笼统地说,重要的单词吗? 有些事情可能会有所帮助:我知道每个单词的出现次数和总单词数(因此可以计算比率)。由于直方图脚本通常会输入“continue;”,因此我还考虑过擦除;等字符。结果,但重要的词是“继续”。最后说明:所有相等性检查均进行完全匹配-没有子字符串,区分大小写。这主要是因为速度,但是子字符串可能会有所帮助(或伤害,我不知道)...
注意:感谢所有愿意回答的人,您对我有很大帮助。
我的工作即将完成,因此我将描述为取得良好效果所做的工作。
1)获得体面的训练集,从各种来源获得每种语言大约30-50个文件,以避免编码风格偏差
2)编写一个执行单词直方图的perl脚本。实现黑名单和白名单(有关更多信息,请参见下文)
3)将伪造的单词添加到黑名单中,例如“license”,“the”等。这些通常在许可证信息的文件开头找到。
4)将每种语言的大约五个最重要的单词添加到白名单中。这些是在给定语言的大多数源代码中找到的单词,但是不够频繁,无法进入直方图。例如对于C/C++,我在白名单中有:#include,#define,#ifdef,#ifndef和#endif。
5)强调文件的开头,因此在前50-100行中找到的单词要多加点
6)在做单词直方图时,使用@words = split(/[\s\(\){}\[\];.,=]+/, $_);对文件进行标记化。对于我认为的大多数语言,这应该没问题(给我最好的结果)。对于每种语言,最终结果中大约包含10-20个最常见的单词。
7)直方图完成后,删除在黑名单中找到的所有单词,并添加在白名单中找到的所有单词
8)编写一个程序,该程序以与脚本相同的方式处理文本文件-使用相同的规则进行标记化。如果在直方图数据中找到一个单词,请添加指向正确语言的点。直方图中仅对应一种语言的单词应添加更多的点,而属于多种语言的单词应添加更少的点。
欢迎发表评论。目前,在大约1000个文本文件上,我得到80个未知数(大多数情况下是非常短的文件-主要是只有一两行的javascript)。大约20个文件被识别为错误。文件大小约为11kB,从100字节到100 kByte(总共近11MB)。处理它们需要一秒钟,这对我来说足够了。
最佳答案
我认为您是从错误的角度来解决这个问题。从您的描述中,听起来好像您正在构建分类器。一个好的分类器需要区分不同的类。它不需要精确估计输入和最可能的类之间的对应关系。
实际上:您的分类器不需要精确评估某个输入与C++的距离。它只需要确定输入是否更像C而不是C++。这使您的工作更加轻松-当前的大多数“未知”案例将接近一种或两种语言,即使它们没有超出您的基本阈值。
现在,一旦意识到这一点,您还将看到分类器需要进行哪些培训:不是样本文件的某些随机方面,而是将两种语言区分开的方法。因此,当您解析了C样本和C++样本后,您将看到#include并未将它们分开。但是,class和template在C++中将更加常见。另一方面,#include确实区分C++和Java。
当然,除了可以使用的关键字外,还有其他方面。例如,最明显的是{的频率,而;也有类似的区别。分类器的另一个非常有用的功能是不同语言的注释标记。当然,基本问题是自动识别它们。再次,将//,/*,',--,#和!硬编码为伪关键字会有所帮助。
这也确定了另一个分类规则:SQL通常在行首使用--,而在C语言中则通常出现在其他地方。因此,将分类器也考虑到上下文对于您的分类器可能很有用。
关于c++ - 识别(编程)语言的关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3658713/
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在