返回首页
一周热榜
我正在构建一个开源学习管理系统(LMS),并使用 OpenSearch 的 more_like_this 查询和字符 n-grams 来进行相似性评分,以实现抄袭检测。
基本上,当学生提交答案时,我会搜索其他学生在同一问题上的相似答案。这个方法效果还不错,但感觉有点不够优雅——只是重复利用了我已经有的搜索引擎。
当前设置:
```python
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 的轻量级机器学习模型吗?
这种搜索引擎的方法有效,但我很好奇是否有更适合我们约束条件的更好方法。