第二次作业———个人项目

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136
这个作业的目标 <设计查重程序、使用PSP记录、总结心得>

Github链接:https://github.com/idnhtdt/idnhtdt/commit/1c6c6095a1c27bf03009728b60256dbf292ebb1c

由于本人先前没有使用过python开发经验,因此本次作业可能有些地方不和规范,敬请原谅。

Part 1 PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 15
- Estimate - 估计这个任务需要多少时间 10 15
Development 开发 360 900
- Analysis - 需求分析 (包括学习新技术) 90 400
- Design Spec - 生成设计文档 30 20
- Design Review - 设计复审 30 10
- Coding Standard - 代码规范 (为目前的开发制定合适的规范) 30 30
- Design - 具体设计 30 30
- Coding - 具体编码 100 350
- Code Review - 代码复审 20 10
- Test - 测试(自我测试,修改代码,提交修改) 30 50
Reporting 报告 80
- Test Repor - 测试报告 40
- Size Measurement - 计算工作量 20
- Postmortem & Process Improvement Plan - 事后总结, 并提出过程改进计划 20
合计 450

Part 2 个人的理解

经过查阅网上资料后大致理解了查重的方法,主要分为四步:
1 .去除标点符号、移除停用词等等。
2 .对输入的文章进行文本切分,对文本使用不同方法进行切分。
3 .特征构建,构建出一个可以代表本文的向量或集合。
4 .使用度量方法,不同场景下可用不同的度量方法。
在看过一些资料后发现主要在三四步有较多的方法,并在网上搜索在线文本相似度尝试作业所给的样本后发现不同算法有不同的相似度,有的差异较大。后来在阅读一篇文章中作者指出有些算法适合的使用地方。在本次项目中,本人在分词上采用的时jieba分词,但对于后面两步尝试了三种办法。(感觉在自己余弦使用的特征向量不对并且认为相似度结果不对 就查了一下如何使用gensim制作出特征向量并计算相似度 但能力有限因此没有理解其原理)

Part 3接口设计及实现

主要分为对文本的净化处理和计算相似度。
净化处理使用re.sub去除标点换行等
计算函数分为三种:
1.使用集合计算相似度
2.使用向量和余弦计算相似度
2.调用gensim来计算

Part 4 主要计算相似度代码及结果展示

Jaccrd
def jaccard(word_a, word_b):
    word_a = set(word_a)  # 去除重复项
    word_b = set(word_b)
    full = word_a | word_b
    over = word_a & word_b
    per = float(len(over)/len(full))
    return per
gensim
def cos_gesim(base, cmp):  # 借鉴网上的方法
    texts = [base, '']
    keyword = cmp
    texts = [lcut(text) for text in texts]  # 划分词 (原本尝试在progress后在输入函数,但tfidf模型产生不出向量集)
    dictionary = Dictionary(texts)  # 创立原文字典对应语料库
    corpus = [dictionary.doc2bow(text) for text in texts]
    new_vec = dictionary.doc2bow(lcut(keyword))  # 创建对比文字典对应语料库
    num_features = len(dictionary.token2id)  # 计算原文字典关键词数
    tfidf = TfidfModel(corpus)  # 导入tfidf计算每个词的重要程度
    index = SparseMatrixSimilarity(tfidf[corpus], num_features)  # 相似度计算
    sim = index[tfidf[new_vec]]
    return sim[0]
向量
def cos_distance(word_a, word_b):
    word_a = set(word_a)
    word_b = set(word_b)
    full = word_a | word_b
    vec1 = []
    vec2 = []
    for item in full:
        if item in word_a:
            vec1.append(1)
        else:
            vec1.append(0)
    for item in full:
        if item in word_b:
            vec2.append(1)
        else:
            vec2.append(0)
    vec1 = np.array(vec1)
    vec2 = np.array(vec2)

    cos_sim = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
    return cos_sim

#Part 5总结 由于自身原因作业较晚开始导致部分要求功能没能掌握,后续会继续完善补充。在使用计算相似度的算法过程中发现几个结果差距较大,与所看到的文章结论一致,但对于自己写的余弦向量算法存疑,感觉向量化过于草率,就搜索了gensim来实现更好的向量化。
posted @ 2024-03-14 13:40  idnhtdt  阅读(42)  评论(0)    收藏  举报