核心算法实现
文本向量化
使用预训练语言模型将文本转换为数值向量,这是AI查重的基础步骤。
// 使用Sentence-BERT进行文本向量化
const sentenceTransformer = require('sentence-transformers');
async function getEmbedding(text) {
// 加载预训练模型
const model = await sentenceTransformer.load('paraphrase-MiniLM-L6-v2');
// 生成文本嵌入向量
const embedding = await model.encode(text);
return embedding;
}
// 计算两个文本的相似度
function calculateSimilarity(vec1, vec2) {
// 余弦相似度计算
const dotProduct = vec1.reduce((sum, val, i) => sum + val * vec2[i], 0);
const norm1 = Math.sqrt(vec1.reduce((sum, val) => sum + val * val, 0));
const norm2 = Math.sqrt(vec2.reduce((sum, val) => sum + val * val, 0));
return dotProduct / (norm1 * norm2);
}
相似度检测流程
class AIPaperChecker {
constructor() {
this.database = new Map(); // 存储已知论文向量
this.threshold = 0.85; // 相似度阈值
}
// 添加论文到数据库
async addPaper(paperId, content) {
const embedding = await getEmbedding(content);
this.database.set(paperId, embedding);
}
// 检测新论文的相似度
async checkSimilarity(newContent) {
const newEmbedding = await getEmbedding(newContent);
const results = [];
for (let [paperId, embedding] of this.database) {
const similarity = calculateSimilarity(newEmbedding, embedding);
if (similarity > this.threshold) {
results.push({
paperId: paperId,
similarity: similarity.toFixed(4)
});
}
}
// 按相似度排序
return results.sort((a, b) => b.similarity - a.similarity);
}
}
// 使用示例
const checker = new AIPaperChecker();