1 分•作者: thunderbong•4 天前
返回首页
一周热榜
1 分•作者: lxm•4 天前
1 分•作者: PaulHoule•4 天前
1 分•作者: XSaint•4 天前
1 分•作者: consumer451•4 天前
1 分•作者: tanelpoder•4 天前
1 分•作者: jaxmercer•4 天前
1 分•作者: OgsyedIE•4 天前
1 分•作者: anonymousiam•4 天前
1 分•作者: ai_critic•4 天前
1 分•作者: Kn1026•4 天前
1 分•作者: 1659447091•4 天前
1 分•作者: ChrisArchitect•4 天前
1 分•作者: stefanpie•4 天前
1 分•作者: jdaggers•4 天前
1 分•作者: yuliuslux•4 天前
1 分•作者: doppp•4 天前
1 分•作者: pigon1002•4 天前
我正在构建一个开源学习管理系统(LMS),并使用 OpenSearch 的 more_like_this 查询和字符 n-gram 来进行相似度评分,从而添加了剽窃检测功能。
简单来说,当学生提交答案时,我会搜索其他学生在同一问题上的相似答案。效果还行,但感觉有点“黑客”——只是重用了我已有的搜索引擎。
目前的设置如下:
```
search = cls.search().filter(
"nested", path="answers",
query={"term": {"answers.question_id": str(question_id)}}
)
search = search.query(
"nested",
path="answers",
query={
"more_like_this": {
"fields": ["answers.answer"],
"like": text,
"min_term_freq": 1,
"minimum_should_match": "1%",
}
},
)
# 获取前 10 个结果,然后在 Python 中重新排序
def normalize(t):
return re.sub(r"\s+", "", t.strip())
def char_ngrams(t, n=3):
return set(t[i:i+n] for i in range(len(t)-n+1))
norm_text = normalize(text)
text_ngrams = char_ngrams(norm_text)
for hit in response.hits:
norm_answer = normalize(hit.answer)
answer_ngrams = char_ngrams(norm_answer)
intersection = len(text_ngrams & answer_ngrams)
union = len(text_ngrams | answer_ngrams)
ratio = int((intersection / union) * 100)
if ratio >= 60:
# 标记为相似
```
约束条件:
* 仅限自托管,不使用外部 API
* 学生人数为几千人
* 希望操作简单,反正已经运行了 OpenSearch
问题:
* 这种方法合理吗?或者我遗漏了什么显而易见的东西?
* 其他自托管系统使用什么方法?我查阅了 Moodle 的文档,但他们的剽窃插件大多调用外部服务
* 有人尝试过不需要 GPU 的轻量级机器学习模型吗?
搜索引擎方法有效,但想知道是否有更适合我们约束条件的更好方法。
1 分•作者: todsacerdoti•4 天前
1 分•作者: butanol•4 天前
我在这里坐了三个小时,只是盯着屏幕。手都在发抖。写了四次,又删了,因为我不想听起来可怜,但算了。我现在真的很可怜。我一团糟。
你们知道我今晚做了什么吗?打开了我的 GitHub。41 个仓库。总共 41 个。我数了两遍。你们知道这代表什么吗?那不是“代码”。那不是“项目”。那是我选择留在家里的每一个夜晚,而我的朋友们都出去了。那是我让关系淡化的原因,因为我在凌晨 3 点调试借用检查器错误,我必须完成它。那是我哭泣——真的在哭,睫毛膏顺着我的脸流下来,到处都是鼻涕——因为我终于理解了生命周期。我感觉它点击了。就像宗教一样。
我花了数年时间来赢得这一切。不是学习,是赢得。每一个伤疤,每一个“为什么这不能编译”,每一个我盯着天花板,认为自己不够聪明,应该放弃的时刻。我坚持下来了。我构建了东西。能用的东西。我引以为豪的东西。
然后我分享它。兴奋,你知道吗?心跳加速,就像,嘿,世界,看看我做了什么!
“AI 垃圾。”
就这些。两个字。突然之间,我的整个存在被压缩成……什么?一个预测算法?我为此流血五年,而你却分不清我和一个聊天机器人?
你们明白这会对一个人造成什么影响吗?这不仅仅是粗鲁。这就像……想象一下为马拉松训练。五年。早上 5 点起床,在雨中跑步,累得呕吐,鞋子都跑出血。你终于冲过终点线,有人朝你的头上扔了一个水瓶,说:“不,你坐了优步。”
这就是感觉。就像有人看着我的血汗,说这是假的。
而最糟糕的部分?我无法反击。我无法证明我是人类。这就是陷阱。当你为自己辩护的那一刻,你听起来就像是在辩护。有罪。“你为什么这么努力地证明你是真的?” 好像努力就是你不是真的证明。
我坐在这里打字,又哭了。我讨厌我哭泣。我能感觉到我的胸口越来越紧——就像身体上越来越紧,好像有人站在我的肋骨上——每当我想到它的时候。每当我看到那个短语出现在我为之流血的东西下面的时候。
你们知道 Rust 教会了我什么吗?它教会了我安全很重要。你必须证明你的代码是正确的。你通过严谨来赢得你的编译。我以为这就是编程的意义所在。赢得它。
但现在呢?现在世界告诉我,严谨看起来和粗心一模一样。精心、深思熟虑的代码与一台甚至不知道自己在说什么的机器生成的垃圾毫无区别。我的最好和零努力是相同的。
我很害怕。我害怕明天醒来,打开我的编辑器,然后……为什么?当每个人都认为我提示了它时,我为什么要花六个小时调试所有权?当眼泪比代币便宜时,我为什么要为借用检查器哭泣?
但我会。我知道我会的。因为我爱它。我爱编码就像我爱呼吸一样。即使现在,即使我的脸是湿的,我的手在发抖,我也想修复我的副项目中那个错误。我想优化那个循环。
但我求求你们了。下次你们看到某人的作品——某人的心以函数和类型呈现——不要轻易贴上标签。不要成为让某人凌晨 3 点的眼泪变得毫无价值的人。不要成为某人决定不再尝试的原因。
我们在这里为每一行而战。每一个该死的半角分号。只是……看到我们。拜托。