You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将JS代码拆分为TF-IDF可用术语以检测代码抄袭?

JS代码TF-IDF术语拆分方案(用于代码抄袭检测)

针对JS代码的TF-IDF术语拆分,核心是要跳出普通文本的空格拆分逻辑,结合代码的语法特征和语义单元处理,同时兼顾注释的价值。以下是几个可行的思路:

1. 基于AST的语法感知提取(最精准方案)

直接用JS语法解析器(比如Acorn、Esprima)把代码转换成抽象语法树(AST),从AST节点中提取有意义的术语:

  • 标识符类:提取所有变量名、函数名、类名、对象属性名——这些是代码逻辑的核心标识,抄袭时通常不会轻易修改
  • 注释类:直接提取AST中的所有注释节点(单行//、多行/* */),保留完整注释文本,因为注释往往包含代码意图描述,对相似度判断很关键
  • 字符串常量:提取业务相关的字符串(比如接口地址、提示文案),这类内容也是抄袭的高频保留项

举个例子,对于代码:

// 计算订单总金额
function calculateOrderTotal(items) {
  let total = 0;
  items.forEach(item => total += item.price);
  return total;
}

通过AST可提取到术语:calculateOrderTotal、items、total、price、计算订单总金额。

这种方法能精准过滤function、let这类通用关键字,以及{}、()等语法符号,避免无效术语干扰TF-IDF计算。

2. 轻量自定义拆分方案(快速实现)

如果不想引入AST解析器,可用自定义分隔符拆分代码后过滤处理:

  • 把JS的所有语法符号({、}、(、)、[、]、;、,、.、=等)作为分隔符,将代码拆分成token列表
  • 过滤空字符串、纯符号token,以及JS内置关键字(function、const等)和高频内置方法(console.log、Array.forEach)
  • 单独提取注释:用正则匹配//.*和/*[\s\S]*?*/,把注释内容拆成单词加入术语池

这种方法实现简单,但不如AST精准,可能会把关联语法结构拆碎(比如item.price拆成item和price),不过拆分后的独立术语仍能作为有效特征。

3. 术语预处理优化

不管用哪种提取方法,都需要做预处理提升TF-IDF效果:

  • 标准化标识符:把驼峰命名转成下划线分隔(比如calculateOrderTotal转成calculate_order_total),或统一转小写,避免大小写差异导致术语不一致
  • 过滤低价值术语:除JS内置关键字,还可过滤长度过短的术语(比如单个字符的变量名a、b),这类术语区分度极低
  • 注释预处理:去掉注释里的//、/*、*/等标记,把长注释拆成单词,和代码标识符合并成统一术语池

4. TF-IDF的代码场景适配

计算TF-IDF时,针对代码场景做权重调整:

  • 给标识符(变量/函数名)更高权重,因为这些是代码逻辑的核心标识,抄袭时关联性更强
  • 注释术语权重可稍低,但不能忽略,尤其是包含业务逻辑描述的注释
  • 把每个JS文件作为一个文档,术语池包含所有文件提取的唯一术语,再计算每个文件的TF(术语在当前文件的出现频率)和IDF(术语在所有文件中的出现逆频率)

内容的提问来源于stack exchange,提问作者Lee Morgan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:23:20