软工作业2: 论文查重

用Python脚本做论文查重

 

软件工程 计科21级12班 (广东工业大学 - 计算机学院)
作业要求 https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014
作业目标 利用Gitee平台存储历史代码, 使用性能分析器检查各个函数的执行频数和耗时,
对程序各模块做单元测试

 

Gitee仓库链接

https://gitee.com/diaocan/diaocan/tree/master/3119004783


 

PSP表格

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

 

模块接口的设计与实现

这是一个Python脚本. 按照题目规定的启动方式, 它从命令行接受3个参数:

  1. 原文件绝对路径
  2. 抄袭文件绝对路径
  3. 答案文件绝对路径

 
该脚本主要包括以下函数:

  1. 负责读取txt文本的txt_reader()
  2. 负责计算文本相似度的similarity_checker(), 它使用了余弦相似度算法
  3. 负责输出答案到txt文件的txt_writer()
  4. 将以上3个模块串联起来的test()

 
在函数txt_reader()中, 执行过程如下:

  1. 使用Python提供的类TextIOWrapper所含的函数self.read().splitlines()来按行将txt文本读取为字符串数组, 其中各字符串末尾均不带换行符.
  2. 用各个字符串的self.strip()函数将前后空格去除, 再拼接为一个长字符串
  3. 去除其中中文标点符号
  4. 最终输出一个不含换行符, 缩进空格和中文标点的字符串

 
在函数similarity_checker()中, 执行过程如下:

  1. 调用jieba.lcut()函数将字符串切成一个一个的词, 它输出一个字符串数组
  2. 分别对来自原文本和抄袭文本的字符串做分词以后, 取它们的并集
  3. 按照这个并集中元素的次序, 分别统计各元素在来自原文本和抄袭文本的字符串经步骤1所得的字符串数组中的出现次数, 构造出两个词频向量
  4. 应用余弦定理, 计算两个向量夹角的余弦值
  5. 输出这个表征文本相似度的数

 
main.py代码如下:

import sys
sys.path.extend(['C:\\Users\\黄翼山\\PycharmProjects\\文本查重\\venv\\Lib\\site-packages'])


import jieba
import numpy as np
# from simhash import Simhash
import profile
from zhon.hanzi import punctuation


# 从txt按行读字符串
def txt_reader(path_in: str) -> str:
    txt_file = open(file=path_in, mode='r', encoding='utf-8')
    # 读取为字符串数组, 各字符串末尾不要换行符
    raw_result = txt_file.read().splitlines()
    txt_file.close()
    # 去除各句子前后空格, 拼接为长句
    result = ''
    for i in range(len(raw_result)):
        result = result + raw_result[i].strip()
    # 去除中文标点符号
    for i in punctuation:
        result = result.replace(i, '')

    print('\n函数txt_reader: 读出的数组规模: %d\n' % (len(raw_result)))
    return result


def similarity_checker(ori_text: str, test_text_in: str) -> float:
    words_1 = jieba.lcut(ori_text, cut_all=True)
    words_2 = jieba.lcut(test_text_in, cut_all=True)
    # 词集
    word_set = list(set(words_1 + words_2))
    # 统计各词在两句子中的出现次数
    length = len(word_set)
    words1_vector = np.zeros(shape=length)
    words2_vector = np.zeros(shape=length)
    for i in range(length):
        words1_vector[i] = words_1.count(word_set[i])
        words2_vector[i] = words_2.count(word_set[i])
    # print(length)
    # 计算两向量夹角余弦值
    result = np.dot(words1_vector, words2_vector) / (np.linalg.norm(x=words1_vector) * np.linalg.norm(x=words2_vector) + 1e-4)

    # 用simhash函数计算相似度
    # result = Simhash(words_1).distance(Simhash(words_2))

    print('\n函数similarity_checker: 相似度: %f\n' % result)
    return result


# 写入文件
def txt_writer(path_in: str, text_in: str):
    txt_file = open(file=path_in, mode='a', encoding='utf-8')
    txt_file.write(text_in)
    txt_file.close()


def test():
    # 从命令行读入文件路径, 并读出文件内容
    # path = 'orig.txt'
    path = str(sys.argv[1])
    orig_text = txt_reader(path_in=path)
    # path = 'orig_0.8_add.txt'
    path = str(sys.argv[2])
    test_text = txt_reader(path_in=path)

    # 计算相似度
    similar_value = similarity_checker(ori_text=orig_text, test_text_in=test_text)

    # 结果写入文件
    path = str(sys.argv[3])
    text = '文本 %s 及 %s 相似度: %.2f\n' % (str(sys.argv[1]), str(sys.argv[2]), similar_value)
    txt_writer(path_in=path, text_in=text)


if __name__ == '__main__':
    profile.run('test()')

 

模块接口部分的性能改进

我编写该脚本所用的集成开发工具是PyCharm 2023.2.1 (Community Edition), 它不提供图形化性能分析工具, 我使用Python标准库提供的性能分析器profile统计程序的各个部分执行的频率和时间.
 
在命令提示符窗口中定位到main.py所在目录, 而后输入

python main.py C:\Users\黄翼山\PycharmProjects\文本查重\orig.txt C:\Users\黄翼山\PycharmProjects\文本查重\orig_0.8_add.txt C:\Users\黄翼山\PycharmProjects\文本查重\ans.txt

再按回车, 脚本随即执行. 执行结果如下:

点击查看命令行输出
函数txt_reader: 读出的数组规模: 329


函数txt_reader: 读出的数组规模: 329

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\黄翼山\AppData\Local\Temp\jieba.cache
Loading model cost 0.500 seconds.
Prefix dict has been built successfully.
3557

函数similarity_checker: 相似度: 0.991520

         358435 function calls in 1.328 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       12    0.000    0.000    0.000    0.000 :0(LCMapStringEx)
        1    0.000    0.000    0.000    0.000 :0(S_ISREG)
        2    0.000    0.000    0.000    0.000 :0(__exit__)
        4    0.000    0.000    0.000    0.000 :0(_getframe)
        1    0.000    0.000    0.000    0.000 :0(_getfullpathname)
        1    0.000    0.000    0.000    0.000 :0(_path_normpath)
       10    0.000    0.000    0.000    0.000 :0(acquire)
    30666    0.047    0.000    0.047    0.000 :0(append)
        2    0.000    0.000    0.000    0.000 :0(asarray)
        4    0.000    0.000    0.000    0.000 :0(close)
     7114    0.406    0.000    0.406    0.000 :0(count)
        2    0.000    0.000    0.000    0.000 :0(dot)
        1    0.000    0.000    1.328    1.328 :0(exec)
        1    0.000    0.000    0.000    0.000 :0(extend)
        4    0.000    0.000    0.000    0.000 :0(find)
        8    0.000    0.000    0.000    0.000 :0(floor)
        4    0.000    0.000    0.000    0.000 :0(flush)
       36    0.000    0.000    0.000    0.000 :0(fspath)
   107571    0.016    0.000    0.016    0.000 :0(get)
        8    0.000    0.000    0.000    0.000 :0(get_ident)
        1    0.000    0.000    0.000    0.000 :0(getattr)
        1    0.000    0.000    0.000    0.000 :0(getcwd)
        5    0.000    0.000    0.000    0.000 :0(getpid)
        8    0.000    0.000    0.000    0.000 :0(hasattr)
        1    0.000    0.000    0.000    0.000 :0(index)
     1916    0.000    0.000    0.000    0.000 :0(isinstance)
        4    0.000    0.000    0.000    0.000 :0(issubclass)
        1    0.000    0.000    0.000    0.000 :0(join)
    10550    0.000    0.000    0.000    0.000 :0(len)
        1    0.484    0.484    0.484    0.484 :0(load)
    24550    0.016    0.000    0.016    0.000 :0(log)
     5684    0.000    0.000    0.000    0.000 :0(match)
    45167    0.094    0.000    0.156    0.000 :0(max)
        1    0.000    0.000    0.000    0.000 :0(next)
        5    0.000    0.000    0.000    0.000 :0(open)
        4    0.000    0.000    0.000    0.000 :0(print)
        8    0.000    0.000    0.000    0.000 :0(random)
        2    0.000    0.000    0.000    0.000 :0(ravel)
        2    0.000    0.000    0.000    0.000 :0(read)
       10    0.000    0.000    0.000    0.000 :0(release)
      185    0.000    0.000    0.000    0.000 :0(replace)
       12    0.000    0.000    0.000    0.000 :0(rfind)
        5    0.000    0.000    0.000    0.000 :0(rstrip)
        1    0.000    0.000    0.000    0.000 :0(seed)
        1    0.000    0.000    0.000    0.000 :0(setprofile)
     5632    0.000    0.000    0.000    0.000 :0(split)
        2    0.000    0.000    0.000    0.000 :0(splitlines)
        1    0.000    0.000    0.000    0.000 :0(startswith)
        1    0.000    0.000    0.000    0.000 :0(stat)
      658    0.000    0.000    0.000    0.000 :0(strip)
        6    0.000    0.000    0.000    0.000 :0(time)
        1    0.000    0.000    0.000    0.000 :0(unlink)
        6    0.000    0.000    0.000    0.000 :0(upper)
        2    0.000    0.000    0.000    0.000 :0(utf_8_decode)
        6    0.000    0.000    0.000    0.000 :0(write)
        2    0.000    0.000    0.000    0.000 :0(zeros)
        3    0.000    0.000    0.000    0.000 <frozen _collections_abc>:771(get)
        1    0.000    0.000    0.000    0.000 <frozen _collections_abc>:778(__contains__)
        1    0.000    0.000    0.000    0.000 <frozen codecs>:186(__init__)
        2    0.000    0.000    0.000    0.000 <frozen codecs>:260(__init__)
        2    0.000    0.000    0.000    0.000 <frozen codecs>:309(__init__)
        2    0.000    0.000    0.000    0.000 <frozen codecs>:319(decode)
        4    0.000    0.000    0.000    0.000 <frozen genericpath>:121(_splitext)
        1    0.000    0.000    0.000    0.000 <frozen genericpath>:27(isfile)
        2    0.000    0.000    0.000    0.000 <frozen ntpath>:107(join)
        9    0.000    0.000    0.000    0.000 <frozen ntpath>:154(splitdrive)
        5    0.000    0.000    0.000    0.000 <frozen ntpath>:208(split)
        4    0.000    0.000    0.000    0.000 <frozen ntpath>:231(splitext)
        4    0.000    0.000    0.000    0.000 <frozen ntpath>:242(basename)
        1    0.000    0.000    0.000    0.000 <frozen ntpath>:249(dirname)
        1    0.000    0.000    0.000    0.000 <frozen ntpath>:319(expanduser)
        6    0.000    0.000    0.000    0.000 <frozen ntpath>:35(_get_bothseps)
        1    0.000    0.000    0.000    0.000 <frozen ntpath>:380(expandvars)
       12    0.000    0.000    0.000    0.000 <frozen ntpath>:51(normcase)
        1    0.000    0.000    0.000    0.000 <frozen ntpath>:538(normpath)
        1    0.000    0.000    0.000    0.000 <frozen ntpath>:570(abspath)
        6    0.000    0.000    0.000    0.000 <frozen os>:674(__getitem__)
        6    0.000    0.000    0.000    0.000 <frozen os>:742(check_str)
        6    0.000    0.000    0.000    0.000 <frozen os>:748(encodekey)
        3    0.000    0.000    0.000    0.000 <frozen os>:773(getenv)
        1    0.000    0.000    0.000    0.000 <frozen os>:818(fsdecode)
        1    0.000    0.000    1.328    1.328 <string>:1(<module>)
        4    0.000    0.000    0.000    0.000 __init__.py:1087(flush)
        4    0.000    0.000    0.000    0.000 __init__.py:1098(emit)
        4    0.000    0.000    0.000    0.000 __init__.py:123(getLevelName)
        1    0.000    0.000    0.000    0.000 __init__.py:1319(disable)
        4    0.000    0.000    0.000    0.000 __init__.py:1467(debug)
        4    0.000    0.000    0.000    0.000 __init__.py:1561(findCaller)
        4    0.000    0.000    0.000    0.000 __init__.py:1595(makeRecord)
        4    0.000    0.000    0.000    0.000 __init__.py:1610(_log)
        4    0.000    0.000    0.000    0.000 __init__.py:1636(handle)
        4    0.000    0.000    0.000    0.000 __init__.py:164(<lambda>)
       28    0.000    0.000    0.484    0.017 __init__.py:168(check_initialized)
        4    0.000    0.000    0.000    0.000 __init__.py:1690(callHandlers)
       28    0.031    0.001    0.141    0.005 __init__.py:172(calc)
        1    0.000    0.000    0.000    0.000 __init__.py:1720(getEffectiveLevel)
        4    0.000    0.000    0.000    0.000 __init__.py:1734(isEnabledFor)
    43253    0.047    0.000    0.062    0.000 __init__.py:177(<genexpr>)
       28    0.031    0.001    0.562    0.020 __init__.py:180(get_DAG)
       12    0.000    0.000    0.000    0.000 __init__.py:194(_is_internal_frame)
        1    0.000    0.000    0.000    0.000 __init__.py:228(_acquireLock)
        1    0.000    0.000    0.000    0.000 __init__.py:237(_releaseLock)
    12153    0.016    0.000    0.906    0.000 __init__.py:249(__cut_DAG)
    12153    0.000    0.000    0.906    0.000 __init__.py:289(cut)
        4    0.000    0.000    0.000    0.000 __init__.py:292(__init__)
        2    0.016    0.008    0.922    0.461 __init__.py:356(lcut)
        4    0.000    0.000    0.000    0.000 __init__.py:368(getMessage)
     1868    0.016    0.000    0.188    0.000 __init__.py:37(viterbi)
        4    0.000    0.000    0.000    0.000 __init__.py:432(usesTime)
        4    0.000    0.000    0.000    0.000 __init__.py:440(_format)
        4    0.000    0.000    0.000    0.000 __init__.py:447(format)
    24564    0.109    0.000    0.109    0.000 __init__.py:49(<listcomp>)
     5604    0.000    0.000    0.000    0.000 __init__.py:54(<genexpr>)
     8374    0.000    0.000    0.188    0.000 __init__.py:59(__cut)
        4    0.000    0.000    0.000    0.000 __init__.py:652(usesTime)
        4    0.000    0.000    0.000    0.000 __init__.py:658(formatMessage)
        4    0.000    0.000    0.000    0.000 __init__.py:674(format)
        8    0.000    0.000    0.000    0.000 __init__.py:815(filter)
     8374    0.000    0.000    0.188    0.000 __init__.py:85(cut)
        8    0.000    0.000    0.000    0.000 __init__.py:922(acquire)
        8    0.000    0.000    0.000    0.000 __init__.py:929(release)
        1    0.000    0.000    0.484    0.484 __init__.py:93(initialize)
        4    0.000    0.000    0.000    0.000 __init__.py:942(format)
        4    0.000    0.000    0.000    0.000 __init__.py:965(handle)
     1870    0.000    0.000    0.000    0.000 _compat.py:76(strdecode)
        2    0.000    0.000    0.000    0.000 linalg.py:140(isComplexType)
        2    0.000    0.000    0.000    0.000 linalg.py:2379(_norm_dispatcher)
        2    0.000    0.000    0.000    0.000 linalg.py:2383(norm)
        2    0.000    0.000    0.000    0.000 main.py:12(txt_reader)
        1    0.000    0.000    1.328    1.328 main.py:29(similarity_checker)
        1    0.000    0.000    0.000    0.000 main.py:53(txt_writer)
        1    0.000    0.000    1.328    1.328 main.py:59(test)
        1    0.000    0.000    0.000    0.000 multiarray.py:741(dot)
        0    0.000             0.000          profile:0(profiler)
        1    0.000    0.000    1.328    1.328 profile:0(test())
        1    0.000    0.000    0.000    0.000 random.py:119(__init__)
        1    0.000    0.000    0.000    0.000 random.py:128(seed)
        1    0.000    0.000    0.000    0.000 random.py:480(choices)
        1    0.000    0.000    0.000    0.000 random.py:493(<listcomp>)
        1    0.000    0.000    0.000    0.000 tempfile.py:142(rng)
        1    0.000    0.000    0.000    0.000 tempfile.py:153(__next__)
        1    0.000    0.000    0.000    0.000 tempfile.py:156(_candidate_tempdir_list)
        1    0.000    0.000    0.000    0.000 tempfile.py:183(_get_default_tempdir)
        1    0.000    0.000    0.000    0.000 tempfile.py:285(_gettempdir)
        1    0.000    0.000    0.000    0.000 tempfile.py:297(gettempdir)
        4    0.000    0.000    0.000    0.000 threading.py:1145(name)
        4    0.000    0.000    0.000    0.000 threading.py:1446(current_thread)

 
从上面结果看, 该脚本认为两文本相似度达到0.99152. 统计结果显示, 脚本执行共耗时1.328秒. 这1.328秒几乎完全由函数similarity_checker()消耗, 两个txt读写函数执行时间可忽略不计. 在similarity_checker()中, 子函数lcut消耗了0.922秒, 占总用时的大部分.

 
回到源代码, 在第31和32行调用了lcut函数:

words_1 = jieba.lcut(ori_text, cut_all=False)
words_2 = jieba.lcut(test_text_in, cut_all=False)

其中参数cut_all=False告知lcut函数做精确分词. 这会减少分词后得到的词汇总数, 提高分词准确性, 同时更少的词汇总数理论上能够减少后续统计词频的耗时, 但也会导致分词本身的耗时增加. 若置参数cut_all=True, 计算得文本相似度变为0.985803, 执行时间下降为0.906秒:

点击查看命令行输出
函数txt_reader: 读出的数组规模: 329


函数txt_reader: 读出的数组规模: 329

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\黄翼山\AppData\Local\Temp\jieba.cache
Loading model cost 0.883 seconds.
Prefix dict has been built successfully.
3654

函数similarity_checker: 相似度: 0.985803

         89334 function calls in 0.906 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       12    0.000    0.000    0.000    0.000 :0(LCMapStringEx)
        1    0.000    0.000    0.000    0.000 :0(S_ISREG)
        2    0.000    0.000    0.000    0.000 :0(__exit__)
        4    0.000    0.000    0.000    0.000 :0(_getframe)
        1    0.000    0.000    0.000    0.000 :0(_getfullpathname)
        1    0.000    0.000    0.000    0.000 :0(_path_normpath)
       10    0.000    0.000    0.000    0.000 :0(acquire)
    24525    0.031    0.000    0.031    0.000 :0(append)
        2    0.000    0.000    0.000    0.000 :0(asarray)
        4    0.000    0.000    0.000    0.000 :0(close)
     7308    0.391    0.000    0.391    0.000 :0(count)
        2    0.000    0.000    0.000    0.000 :0(dot)
        1    0.000    0.000    0.906    0.906 :0(exec)
        1    0.000    0.000    0.000    0.000 :0(extend)
        4    0.000    0.000    0.000    0.000 :0(find)
        8    0.000    0.000    0.000    0.000 :0(floor)
        4    0.000    0.000    0.000    0.000 :0(flush)
       36    0.000    0.000    0.000    0.000 :0(fspath)
        8    0.000    0.000    0.000    0.000 :0(get)
        8    0.000    0.000    0.000    0.000 :0(get_ident)
        1    0.000    0.000    0.000    0.000 :0(getattr)
        1    0.000    0.000    0.000    0.000 :0(getcwd)
        5    0.000    0.000    0.000    0.000 :0(getpid)
        8    0.000    0.000    0.000    0.000 :0(hasattr)
        1    0.000    0.000    0.000    0.000 :0(index)
       48    0.000    0.000    0.000    0.000 :0(isinstance)
        4    0.000    0.000    0.000    0.000 :0(issubclass)
       28    0.000    0.000    0.000    0.000 :0(items)
       28    0.000    0.000    0.000    0.000 :0(iter)
        1    0.000    0.000    0.000    0.000 :0(join)
    18782    0.000    0.000    0.000    0.000 :0(len)
        1    0.391    0.391    0.391    0.391 :0(load)
     8574    0.000    0.000    0.000    0.000 :0(match)
        4    0.000    0.000    0.000    0.000 :0(max)
        1    0.000    0.000    0.000    0.000 :0(next)
        5    0.000    0.000    0.000    0.000 :0(open)
        4    0.000    0.000    0.000    0.000 :0(print)
        8    0.000    0.000    0.000    0.000 :0(random)
        2    0.000    0.000    0.000    0.000 :0(ravel)
        2    0.000    0.000    0.000    0.000 :0(read)
       10    0.000    0.000    0.000    0.000 :0(release)
      185    0.000    0.000    0.000    0.000 :0(replace)
       12    0.000    0.000    0.000    0.000 :0(rfind)
        5    0.000    0.000    0.000    0.000 :0(rstrip)
        1    0.000    0.000    0.000    0.000 :0(seed)
        1    0.000    0.000    0.000    0.000 :0(setprofile)
       28    0.000    0.000    0.000    0.000 :0(split)
        2    0.000    0.000    0.000    0.000 :0(splitlines)
        1    0.000    0.000    0.000    0.000 :0(startswith)
        1    0.000    0.000    0.000    0.000 :0(stat)
      658    0.000    0.000    0.000    0.000 :0(strip)
        6    0.000    0.000    0.000    0.000 :0(time)
        1    0.000    0.000    0.000    0.000 :0(unlink)
        6    0.000    0.000    0.000    0.000 :0(upper)
        2    0.000    0.000    0.000    0.000 :0(utf_8_decode)
        6    0.000    0.000    0.000    0.000 :0(write)
        2    0.000    0.000    0.000    0.000 :0(zeros)
        3    0.000    0.000    0.000    0.000 <frozen _collections_abc>:771(get)
        1    0.000    0.000    0.000    0.000 <frozen _collections_abc>:778(__contains__)
        1    0.000    0.000    0.000    0.000 <frozen codecs>:186(__init__)
        1    0.000    0.000    0.000    0.000 <frozen codecs>:214(setstate)
        2    0.000    0.000    0.000    0.000 <frozen codecs>:260(__init__)
        2    0.000    0.000    0.000    0.000 <frozen codecs>:309(__init__)
        2    0.000    0.000    0.000    0.000 <frozen codecs>:319(decode)
        4    0.000    0.000    0.000    0.000 <frozen genericpath>:121(_splitext)
        1    0.000    0.000    0.000    0.000 <frozen genericpath>:27(isfile)
        2    0.000    0.000    0.000    0.000 <frozen ntpath>:107(join)
        9    0.000    0.000    0.000    0.000 <frozen ntpath>:154(splitdrive)
        5    0.000    0.000    0.000    0.000 <frozen ntpath>:208(split)
        4    0.000    0.000    0.000    0.000 <frozen ntpath>:231(splitext)
        4    0.000    0.000    0.000    0.000 <frozen ntpath>:242(basename)
        1    0.000    0.000    0.000    0.000 <frozen ntpath>:249(dirname)
        1    0.000    0.000    0.000    0.000 <frozen ntpath>:319(expanduser)
        6    0.000    0.000    0.000    0.000 <frozen ntpath>:35(_get_bothseps)
        1    0.000    0.000    0.000    0.000 <frozen ntpath>:380(expandvars)
       12    0.000    0.000    0.000    0.000 <frozen ntpath>:51(normcase)
        1    0.000    0.000    0.000    0.000 <frozen ntpath>:538(normpath)
        1    0.000    0.000    0.000    0.000 <frozen ntpath>:570(abspath)
        6    0.000    0.000    0.000    0.000 <frozen os>:674(__getitem__)
        6    0.000    0.000    0.000    0.000 <frozen os>:742(check_str)
        6    0.000    0.000    0.000    0.000 <frozen os>:748(encodekey)
        3    0.000    0.000    0.000    0.000 <frozen os>:773(getenv)
        1    0.000    0.000    0.000    0.000 <frozen os>:818(fsdecode)
        1    0.000    0.000    0.906    0.906 <string>:1(<module>)
        4    0.000    0.000    0.000    0.000 __init__.py:1087(flush)
        4    0.000    0.000    0.000    0.000 __init__.py:1098(emit)
        4    0.000    0.000    0.000    0.000 __init__.py:123(getLevelName)
        1    0.000    0.000    0.000    0.000 __init__.py:1319(disable)
        4    0.000    0.000    0.000    0.000 __init__.py:1467(debug)
        4    0.000    0.000    0.000    0.000 __init__.py:1561(findCaller)
        4    0.000    0.000    0.000    0.000 __init__.py:1595(makeRecord)
        4    0.000    0.000    0.000    0.000 __init__.py:1610(_log)
        4    0.000    0.000    0.000    0.000 __init__.py:1636(handle)
        4    0.000    0.000    0.000    0.000 __init__.py:164(<lambda>)
       28    0.000    0.000    0.391    0.014 __init__.py:168(check_initialized)
        4    0.000    0.000    0.000    0.000 __init__.py:1690(callHandlers)
        1    0.000    0.000    0.000    0.000 __init__.py:1720(getEffectiveLevel)
        4    0.000    0.000    0.000    0.000 __init__.py:1734(isEnabledFor)
       28    0.016    0.001    0.438    0.016 __init__.py:180(get_DAG)
       12    0.000    0.000    0.000    0.000 __init__.py:194(_is_internal_frame)
    14313    0.031    0.000    0.469    0.000 __init__.py:198(__cut_all)
        1    0.000    0.000    0.000    0.000 __init__.py:228(_acquireLock)
        1    0.000    0.000    0.000    0.000 __init__.py:237(_releaseLock)
    14313    0.016    0.000    0.484    0.000 __init__.py:289(cut)
        4    0.000    0.000    0.000    0.000 __init__.py:292(__init__)
        2    0.016    0.008    0.500    0.250 __init__.py:356(lcut)
        4    0.000    0.000    0.000    0.000 __init__.py:368(getMessage)
        4    0.000    0.000    0.000    0.000 __init__.py:432(usesTime)
        4    0.000    0.000    0.000    0.000 __init__.py:440(_format)
        4    0.000    0.000    0.000    0.000 __init__.py:447(format)
        4    0.000    0.000    0.000    0.000 __init__.py:652(usesTime)
        4    0.000    0.000    0.000    0.000 __init__.py:658(formatMessage)
        4    0.000    0.000    0.000    0.000 __init__.py:674(format)
        8    0.000    0.000    0.000    0.000 __init__.py:815(filter)
        8    0.000    0.000    0.000    0.000 __init__.py:922(acquire)
        8    0.000    0.000    0.000    0.000 __init__.py:929(release)
        1    0.000    0.000    0.391    0.391 __init__.py:93(initialize)
        4    0.000    0.000    0.000    0.000 __init__.py:942(format)
        4    0.000    0.000    0.000    0.000 __init__.py:965(handle)
       28    0.000    0.000    0.000    0.000 _compat.py:73(<lambda>)
        2    0.000    0.000    0.000    0.000 _compat.py:76(strdecode)
        2    0.000    0.000    0.000    0.000 linalg.py:140(isComplexType)
        2    0.000    0.000    0.000    0.000 linalg.py:2379(_norm_dispatcher)
        2    0.000    0.000    0.000    0.000 linalg.py:2383(norm)
        2    0.000    0.000    0.000    0.000 main.py:13(txt_reader)
        1    0.016    0.016    0.906    0.906 main.py:30(similarity_checker)
        1    0.000    0.000    0.000    0.000 main.py:54(txt_writer)
        1    0.000    0.000    0.906    0.906 main.py:60(test)
        1    0.000    0.000    0.000    0.000 multiarray.py:741(dot)
        0    0.000             0.000          profile:0(profiler)
        1    0.000    0.000    0.906    0.906 profile:0(test())
        1    0.000    0.000    0.000    0.000 random.py:119(__init__)
        1    0.000    0.000    0.000    0.000 random.py:128(seed)
        1    0.000    0.000    0.000    0.000 random.py:480(choices)
        1    0.000    0.000    0.000    0.000 random.py:493(<listcomp>)
        1    0.000    0.000    0.000    0.000 tempfile.py:142(rng)
        1    0.000    0.000    0.000    0.000 tempfile.py:153(__next__)
        1    0.000    0.000    0.000    0.000 tempfile.py:156(_candidate_tempdir_list)
        1    0.000    0.000    0.000    0.000 tempfile.py:183(_get_default_tempdir)
        1    0.000    0.000    0.000    0.000 tempfile.py:285(_gettempdir)
        1    0.000    0.000    0.000    0.000 tempfile.py:297(gettempdir)
        4    0.000    0.000    0.000    0.000 threading.py:1145(name)
        4    0.000    0.000    0.000    0.000 threading.py:1446(current_thread)

结果改变很小, 而耗时能够明显减少.


 

部分单元测试展示

测试前, IDE报告的语法错误及警告均已被清除. 测试分以下两步

  1. 从文件orig.txtorig_0.8_add.txt中随机抽取10行测试文本相似度计算模块similarity_checker
  2. 测试函数txt_readertxt_writer对指定文件读写

运行窗口输出如下:

点击查看代码
C:\Users\黄翼山\PycharmProjects\文本查重\venv\Scripts\python.exe "C:/Users/黄翼山/AppData/Local/Programs/PyCharm Professional/plugins/python/helpers/coverage_runner/run_coverage.py" run --branch "--omit=\"C:\Users\黄翼山\AppData\Local\Programs\PyCharm Professional\plugins\python\helpers*\"" C:\Users\黄翼山\PycharmProjects\文本查重\单元测试.py 
句子1: 老人回答:“这牛叫福贵,就一个名字。”
句子2: 走到了粪缸旁,递他嫌缓缸沿脏,拂就打抬脚踩上去蹲在氟上面。拧我爹年派纪大存了,穆屎也契跟证着老了,出来不容易,那时候我们全家人都会听到他在村口嗷嗷叫着。
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\黄翼山\AppData\Local\Temp\jieba.cache

函数similarity_checker: 相似度: 0.160357

句子1: “我怕它知道只有自己在耕田,就多叫出几个名字去骗它,它听到还有别的牛也在耕田,就不会不高兴,耕田也就起劲啦。”
句子2: 那堡天舆午后,摆我走到了一棵有着茂汉盛树叶的树下,田里的王棉娄花已被收汤起,几个包着头靡巾氧的畔女蓟人蓬正将域棉秆拔出来,瘫她们卧不时抖懂动独着屁股摔去胯根林须上的泥巴。我摘下邢草帽,从沏身后取过毛巾擦起脸上的汗水,身馅旁是依一口骄在阳光下泛帮黄的艇池塘,我就靠饭着树干面对池塘坐了下来,紧接着我感到自锡己要睡觉了,就在青妨草上躺下郑来,值把草帽盖刽住脸,枕她着背包在寅树诧荫里闭上改了眼睛。

函数similarity_checker: 相似度: 0.371761

句子1: “老爷。”
句子2: 我说:“这敞牛究竟有多少名蓑字?”

函数similarity_checker: 相似度: 0.000000

句子1: 一头牛竟会有这么多名字?我好奇地走到田边,问走近的老人:
句子2: 几薄十年涨来我罪爹一藩直贝这样拉屎,到了六爷十多痛岁还能在煽粪缸上一蹲就是半刊晌,排那两条腿就和风鸟爪一样有劲。毋我爹喜欢看着天色摧慢慢黑下来,罩住他咳的田地。我女儿凤霞到静了三、四腻岁,常跑到村口去圭看她爷济爷拉屎,我爹毕竟够年跌纪大蛊了,蹲在粪墩缸上腿有些哆嗦,凤霞就问他:

函数similarity_checker: 相似度: 0.213498

句子1: 我遇到那位名叫福贵的老人时,是夏天刚刚来到的季节。
句子2: “可你刚才叫了几个名仿字。”

函数similarity_checker: 相似度: 0.000000

句子1: 犁田的老牛或许已经深感疲倦,它低头伫立在那里,后面赤裸着脊背扶犁的老人,对老牛的消极态度似乎不满,我听到他嗓音响亮地对牛说道:
句子2: 澈犁田的老牛或许已经深感疲倦,它达低头伫立在脯那里,馆后憋面赤裸着潮脊背扶犁的燕老人,对老牛的消极态度务似乎不满,沏我重听到他嗓音响猪亮悼地对牛说道:

函数similarity_checker: 相似度: 0.883194

句子1: “可你刚才叫了几个名字。”
句子2: 宾老贬人黝邓黑的滨脸在阳光里笑得十分生动,脸上的皱灶纹欢乐瞒地游动着,里面镶满了泥土,就如布满田间的小道。

函数similarity_checker: 相似度: 0.045361

句子1: “二喜,有庆不要偷懒;家珍,凤霞耕得好;苦根也行啊。”
句子2: “通是的扒。啡”我点点头。

函数similarity_checker: 相似度: 0.049690

句子1: “爷爷,你为什么动呀?”
句子2: 正是在这样的心庐态下,我听到了一啮首美国民歌《老黑奴》,闹歌中那位老黑奴经旗历了晕一生的肛苦难,家人都先他而去,涧而他框依然友貉好地对待世界,没有哲一句抱怨的话。陈这首酬歌深深打佬动了我,我决定写微下一篇这样的小说,就是这篇《活察着》,枉写人对苦难的承受讲能纤力,鹃对世界乐观的趣态度。写作过轿程蒸让砂我明白,人是为活着废本身队而活着的,抗而静不烟是为洱活着之外的任曾何队事物所活着。颇我会感刀到自己写下了高尚的区作品。

函数similarity_checker: 相似度: 0.169443

句子1: 这不只是我个人面临的困难,几乎所有优秀的作家都处于和现实的紧张关系中,在他们笔下,只有当现实处于遥远状态时,他们作品中的现实才会闪闪发亮。应该看到,这过去的现实虽然充满魅力,可它已经蒙上了一层虚幻的色彩,那里面塞满了个人想象和个人理解。真正的现实,也就是作家生活中的现实,是令人费解和难以相处的。
句子2: “那个老打呵欠俱的人坊又来啦。”

函数similarity_checker: 相似度: 0.141772


函数txt_reader: 读出的数组规模: 329

活着前言一位真正丽的作家永远医只为内心写腥作只怖有惠内陆心才会真实地告诉他他的自辟私他船的高尚是多迪么突出内心让他真实地夯了解自己一旦了育解了自己也族就了解了疯世界很多年前碉我就明白了步这耘个粟原则可是汲要捍涤卫这个原则必须付出艰辛协的劳动和长体时我期召的痛苦因为内心并非时时刻刻都是敞开的镍它昂更多的时候倒是位封闭誉起来于是只有讹写作不弃停焰地橇写作才能使牵内心敞开塌才隅能使自己置身于发过现之中就像日疗出的光芒照亮了黑荒暗胡灵感鼻这时候才掠会突然来狈到长期诚以来我的作品都数是缕源出困于和现实的购那一层紧张关系我沉湎于坑想象之中又被现营实垦紧紧钡控制我明确感奉受着自我的分裂我无法使自己变得纯粹我曾经希望自膊己成为一位童话作家要盯不就是一位蘑实实在喻在帛作品的拥有者如果我能够成控为这两者中的吵任何一苑个我想隙我内心的痛苦将会巧轻微得多可颐是与此同时我的力垄量也会双削弱很婆多越鸣事实上我只乡能成蜀为现在这样的作家绦我始刃终为内心窘的需要而写乖作理肝智影代替不了我的写蛀作正因为炕此我在亢很长一速段时间蛰是一个愤怒和冷漠的作家满这不技只是我斥个人面临的困难几乎按所有优秀的作家都处于端和现实的紧张关系中耿在他倒们笔下只有当频现实处于遥远戌状态时骚他们作品中的现实才会闪闪发亮应箭该看到这过去的现实虽然充满魅玖力可它已经肯蒙上了一层翠虚幻的色慢彩那里面塞满了个人钦想象和个人敛理解望真正书的现摧实也麻就是篡作家生鞘活中的奇现实糙是令以人费解和难以相处的趟作禾家要表达与之赊朝夕相处的现实袄他常常会感到难以承受径蜂拥氏而来的殃真实几乎数都在诉说着丑恶和阴险截怪陕就坊怪在这里为什么丑恶的事物总吮是在身袍边而美唉好的事帕物却远在海角换句疙话滥说人烩的友爱和同情往往只是作为情绪来到而相反的事实则助是诅伸手便象可触借及正像一位诗人茧所表达的人类无法唾忍受太尹多的奄真涌实也有这样的作家杨一生都掺在款解决自我拾和现实瘴的紧张关棵系福克纳是最为成功幅的例子他找到吃了一条温落和屏的途径他镭描写中间撞状态的事寞物同时署包容了美好与丑恶他燃将美国南方的乃现实放到了历史和人球文精神之中这贯是真正意义上的文浆学现实因为它连接着过去琐和将来橇一些不蹈成揉功的作家也在描筋写现实可他巷们笔下的现实企说穿了只拇是一个环境盟是固定的死去赊的现实他们看不到显人是怎样走过来赁的鸯也看不到怎样吻走去当他们在描写斤斤做计较的人物时我们会感到作家本人也在斤斤计艇较这壶样针的作家是在写钢实在的作燥品而不是现实的序作品前面已经说过我和伍现实关践系莱紧张潘说钵得严沟重粥一些我一直是以敌牡对的芽态度看待现实随着时间瓣的推移我内心的愤怒渐渐平息我开始募意识到佛一位真正的作家所蛤寻找履的是蹋真理是一种费排斥道德判断杰的真理作休家缩的手使命不是发泄不是控诉或循者慑揭露他应该向人们巳展示敛高尚雨这里毙所说始的高疹尚不闷是那种单纯的美雄好而是对一切事物理钎解蜘之后熙的超然对善与矣恶一视同仁用同建情爽的目光看待世界正是在这样的心庐态下我听到了一啮首美国民歌老黑奴闹歌中那位老黑奴经旗历了晕一生的肛苦难家人都先他而去涧而他框依然友貉好地对待世界没有哲一句抱怨的话陈这首酬歌深深打佬动了我我决定写微下一篇这样的小说就是这篇活察着枉写人对苦难的承受讲能纤力鹃对世界乐观的趣态度写作过轿程蒸让砂我明白人是为活着废本身队而活着的抗而静不烟是为洱活着之外的任曾何队事物所活着颇我会感刀到自己写下了高尚的区作品守第润一章我比渺现在年轻十岁的时候件获得了一个游手好闲的职业去乡间筛收集民间歌洽谣胰那一服年倍的整个夏天我畴如同一危只乱焊飞的爷麻雀游荡奔在知寡了氮和阳光充斥的村舍田野扭我喜欢喝岗农民眷那睁种矗带有苦味急的茶水他状们泅的茶桶我就游放在田埂拜的姑树下我毫无挺顾钨忌地拿起漆飘满茶垢的巢茶碗舀水喝还捉把猎自己的水壶灌满与田里犹干活的男人说迹上咋几句废话在凋姑娘讳因我肘而起的窃窃私笑里扬长而去濒我辟曾奶经和瞬一位传守办着瓜田米的老人聊了整整一个帘下午伶这是我有生仆以钠来瓜吃钾得最多的一次当颖我站起来告预辞时突然发现自己像个孕妇一样步履艰难了市然晰后我尖与昼一位当上了祖母的女人坐在门槛船上她编着石草鞋为我唱了镰一支娥十月怀藻胎我投最喜酣欢的是傍晚来到时蛛坐在农民的屋前看着他们将提上羊的破井水辩泼在地上淫压住蒸腾的峭尘土夕阳的光芒在树慧梢上照截射孙下来拿姚一把詹他们递过茹来的扇蛰子尝尝他们和盐沿一样咸的咸菜看看几个年轻女人和男人翠们说着话厢我头戴宽边草瘦帽脚上穿着拖鞋一条毛巾挂在身后的皮带上掩让驼它忌像努尾巴似的拍打着我的屁股我整日张蛇大矽嘴巴打着呵欠散漫地招走在田桐间小窜道上我的拖鞋稳吧哒吧哒把那地些小道弄得纺尘土飞牟扬仿佛是车轮滚滚逢而过时媒的情景新我到处游荡已经弄不清楚哪些村狰庄曙我曾经去过哪些汽我没有去过我走丫近妇一个村巾子时香常贱会听到孩子侄的姿喊摘叫那个老打呵欠俱的人坊又来啦于是村里人就知道那个会讲荤埠故事棚会唱酸曲的人又来了其拢实所有的荤故事睦所有的酸柱曲都是从他们那里学来的我靠知道他们全部的背兴趣在什么地方自然这燎也是我的兴趣我纸曾识经遇到一个哭泣炼的老人溢他遂鼻演青眼肿地坐在田埂上满腹的悲哀使他变搓得十分激动串看到我走来活他仰起椿脸哭声婪更走为蓬响亮冲我晒问他是谁法把他打啪成讲这挚样的病他手指飞挖襄着裤烃管采上的床泥巴愤怒地告诉我是鼓他那不杂孝的儿子当我再问为何打熟他絮时他支支吾吾说不清江楚了我影就立刻知杭道盔他准是对淑儿醒媳干了偷鸡摸狗豪的勾肄当还有一个晚上我打着手电赶夜路时在一口蝉池塘旁照噬到了臭两臂段赤裸的身体一针段压在另泪一段上面我照着的时徐候两段身体纹丝不动只是有一晤只手在大腿上轻啼轻搔痒倔我赶紧熄灭手电离去在农忙捏的一酝个中午我走进一家敞开大门圈的房屋去码找水喝一个蒋穿短墅裤的男人神色笔慌张地挡住睬了我把我引到稻井旁殷勤地替我打典上膀来才一桶水塔随后又像普耗子一样窜进了屋里纤这脓样的事我灾屡见不鲜差厕不多和我幌听到的歌谣一样多当我望棍着瑰到处羚都芝充妓满绿色的土地时郭我惯就会进一步明白庄稼为何播长得如此旺盛那个夏天我还差一点谈情说购爱我遇到了疹一位赏心悦目的女孩她黝黑的渗脸蛋至涟今还在我眼前闪闪挣发馏光塞我见到奈她时她皋卷起裤管坐近在河边的心青草上摆弄着一根竹竿在照看座一群注肥硕祸的鸭子抚这个痔十六七岁钠的女孩羞怯地与送我桓共同棋度过了一祥个炎热的下午她每次露出笑容时都要贫深深地低赤下头去我看着她偷偷放差下卷起的裤管莎又怎样将瓢自己的光脚丫子藏到草丛里去那个剪下午巴我信口开河向她兜售如何带她外出乌游玩的计轨划这个女孩又惊又喜贝我虞当溜初情绪柞激匀昂颐说这些也是真心实汛意赌我只是感到和她在一巢起身心愉快也不去考虑以宣后会是怎样千可僳是后来当她三个灯强壮如牛的哥哥走过来时我俩才吓一跳援我瓤感祭到自己应疡该侥逃之夭夭了否则我就会不得不娶她望为妻我遇到那位名叫佣福贵的老劲人彰时吱是夏天刚刚来榨到的季节那堡天舆午后摆我走到了一棵有着茂汉盛树叶的树下田里的王棉娄花已被收汤起几个包着头靡巾氧的畔女蓟人蓬正将域棉秆拔出来瘫她们卧不时抖懂动独着屁股摔去胯根林须上的泥巴我摘下邢草帽从沏身后取过毛巾擦起脸上的汗水身馅旁是依一口骄在阳光下泛帮黄的艇池塘我就靠饭着树干面对池塘坐了下来紧接着我感到自锡己要睡觉了就在青妨草上躺下郑来值把草帽盖刽住脸枕她着背包在寅树诧荫里闭上改了眼睛涸这位比现在喳年轻十岁的瘟我巷躺撩在树叶龋和了草丛中间睡了两个小住时罚其撒间洞有几只蚂弦蚁爬到了我的腿上我孩沉睡中荧的手指依然准较确瓷地将它们弹走后来仿掖佛是来到了水边一位落老人撑欠着竹筏在蹲远处响拐亮地吆喝我憋从堑睡梦孜里挣脱而匈出吆喝声在现实里清晰甚地传来我疗起身杜后看到近釜旁田里一螟个洛老人木正在开导一癌头老牛澈犁田的老牛或许已经深感疲倦它达低头伫立在脯那里馆后憋面赤裸着潮脊背扶犁的燕老人对老牛的消极态度务似乎不满沏我重听到他嗓音响猪亮悼地对牛说道做牛诞耕田做粱狗看家做和尚化缘札做鲸鸡报晓做炉女伦人巩织布哪佩只牛不耕田这可是自古就有的道砌理垄走呀走呀鲁疲倦的老牛黄听锌到老人的吆过喝后仿聋佛阎知错般地抬起了兢头拉脖着犁往前走去敲我看到老人的顶脊背和牛笆背一样黝黑两个进入垂暮的生命将腋那块喂古迹板的田地耕得痘哗腑哗翻动犹羽如水面上掀起的喊波浪随后我起听到老人诌粗哑认却令人感动啃的嗓音他唱起了在旧瞻日的歌谣先是口依呀啦呀唱出长长的引子接着出现磺两句歌瘪词帝皇帝招我穴做女婿路远迢迢我不去因为路途遥远不愿去做葬皇帝的女婿心老人的自鸣得意让我点失哈声而笑可能是牛放懦慢郊了脚团步老人又吆喝起来二喜蛇有庆不要偷懒家珍篆凤媳霞耕荤得好儡苦根也行力啊揣一头牛竟会有这形么多名字奠我好奇地走似到田边问走灯近的老人这牛有多少名字老人沁扶住犁站下来他众将绵我上下歇打量一番后问你是衔城里人吧闹通是的扒啡我点点头老人得碰意起来颂我一眼匣就看蚕出来了厂我说这敞牛究竟有多少名蓑字老都人回绪答这牛叫福贵忧就一个名字可你刚才叫了几个名仿字噢稠缆老人高兴地笑起来他神秘超地向我招招手当我凑迹过宦去时邑他欲说又止他看到牛正抬着头就训喳斥它你别冰偷听把头低下牛果然述低下了头这时老绽人宴悄声对我说我怕秘它知道让只有自侈己要在耕田就多寂叫出几个名字蝶去跳骗它它药听到还瑶有片别攒的牛也在汕耕田就不会不高兴耕田也就起瓮劲啦宾老贬人黝邓黑的滨脸在阳光里笑得十分生动脸上的皱灶纹欢乐瞒地游动着里面镶满了泥土就如布满田间的小道这位蛾老人后来和我状一起坐撼在狄了那棵茂盛的树下在那个充满阳光的下午他向我讲述了自己熙鞋四十扳多吏年前我爹系常在这国里走来走氯去他穿着一昌身黑颜筐色艾的绸衣总堂是把双手背在身后他出门时常对我娘说我到自己的地扎上辰去走走噪我爹走在自己的田产上干活的佃户见了都要双手握住锄头恭敬坠地叫一声龚老爷我爹敬走到了城里城里人见了晌都叫他铆先生我爹是很有身波份的人可他倔拉屎时就像个穷人嘛了他譬不爱在屋阿里桃床白边的马桶上拉屎跟牲畜似粘的喜欢到野地里去拉屎每天到了傍晚的时候我缸爹打着饱嗝那声豹响和手青蛙叫唤差不躬多走出屋去慢吞吞浚地堤朝捏村掺口的粪缸走去走到了粪缸旁递他嫌缓缸沿脏拂就打抬脚踩上去蹲在氟上面拧我爹年派纪大存了穆屎也契跟证着老了出来不容易那时候我们全家人都会听到他在村口嗷嗷叫着几薄十年涨来我罪爹一藩直贝这样拉屎到了六爷十多痛岁还能在煽粪缸上一蹲就是半刊晌排那两条腿就和风鸟爪一样有劲毋我爹喜欢看着天色摧慢慢黑下来罩住他咳的田地我女儿凤霞到静了三四腻岁常跑到村口去圭看她爷济爷拉屎我爹毕竟够年跌纪大蛊了蹲在粪墩缸上腿有些哆嗦凤霞就问他弯爷爷伤你蓝为什么动焉呀我爹惺说是风吹的那时候我蓑们家境还没有败落浑我们徐胖家有一孟百多亩地库从这里一熏直到蕊那边工厂的烟棉囱度都是我家的我爹和我是远近闻名更的阔老爷钙和阔少爷我们走清路时鞋子抢的声响都像是铜钱碰来俊撞去的我女人家珍是城里猿米行僧老击板的女儿她鸽也是有眨钱人示家出生钥的有钱人嫁给亲有虎钱人就指是把钱奴堆起来钱在钱上面哗榔哗检地嘎流这样梆的声抬音我有四十年没有听将到了策我是我们徐家的扼败吵家准子用我爹锰的话说我是他的孽子我念过几肋年私塾穿长碑衫的私塾先生叫我念一段书时是我最高兴的我站起来酝拿着本线装苑的千字文对私塾先生说傻好好听堂着爹给你念一店段年玉过花甲写的私塾先生对我爹趣说你家少儿爷长晰大锗了榨准能当个估二流苹子跪我从小就不可酱救药这是我爹的话咨私塾物先生说我是朽木不娱可雕也昂现在贺想想他们都说拄对了当初我可不这么想狈我想我有钱呵我是抑徐家仅有的一指根香火我要腔是灭了徐家就得断子装绝孙缓上私塾时我从来不走路都是我家一个雇工背着我去滋放学时***他已经恭恭敬旭敬地弯腰蹲在那冲里功了我骑上去后拍拍益雇工的脑袋说赞一渤声长屎根跑呀雇工懊长根就跑起来我在上面一颠一颠坍的像是一淫只缩在树梢黔上的麻雀我说一声飞呀癣长根就亨一步一杜跳腥做出臀一副飞匣的样子我长大壤以必后伞喜欢往城里跑常常是十天半月不回碑家择我淀穿着白奈色的丝绸衣瘫衫头发百抹得光婴滑透亮买往镜苍子前一站穗我看到自己堡满脑袋的辣黑油漆一副倘有写钱人慧的样子我爱往妓院驶钻驹听那些风骚的女人贵整夜叽叽喳喳和哼哼哈哈那些声音电听上去像是在型给我挠痒狐痒嚣做人呵写一弓旦嫖上以后也惮就免不了绊要去赌这个除嫖和赌霜就痴像是胳膊和肩瑶膀连逆在一起怎么都分仑不开后来我更喜欢赌剖博了嫖妓只石是为了轻松一下就跟砖水喝多了要兄去方屹便一下人一样说白了就是陇撒尿赌博就完全不一样了*沂怯滞纯煊纸粽牛乇鹗悄歉鼋*张有一股箍叫我仙说不出来的舒坦以前我是过一天和尚撞一天钟整天有气满无力每天早晨醒来犯猛愁的就是这一天该狗怎朱么打发搁我爹常常唉声叹气训勾斥我棵没有光耀曳祖宗我心想光耀祖宗也不是非我莫属套我玻对自己说姚凭什么让我爸放着好趋端端的日子不驰过去适想光禾耀祖宗这些累人的伎事再说我爹降年轻时也和我一样我租家捶祖上有两百多株亩地假到特他斯手上一折腾就剩一百多也亩了我对厅爹柠说抱你别犯仍愁啦朗我废儿子会光耀祖宗的总该给下贮一栅辈留点好学事吧凳我瞎娘听了这话吃吃笑她偷访偷告量诉我夯咬我爹年轻鞠时也这么对我爷休爷说过怨我缓心宜想濒就炉是嘛他自侧己干不了的事硬要我来干我怎并么会答应右那时候颜我儿子有庆悉还没出来婚我女儿欠凤霞刚好衡四岁家珍怀着棉有庆渔有六个月了自然篷有些难看宇走路时裤楚裆蜜里像是夹了个馒头似的姑一撇穗一撇两虱只脚不往前鲤往横里淌跨我嫌弃阁她对她说你呀风一吹肚子就要大上一圈家珍从不顶撞我听了这嘲糟蹋她的话她耙心里不乐意也喘只是轻轻拦说一句又不是风吹大返的溪自胆从我赌博寐上镊以后我倒还茹真想恢光牌耀祖宗了想贫把我爹弄解掉的一百丛多恃亩地挣回来那些日子毒爹问驴我在城里鬼混些什么我对他说现在昌不鬼混啦跪我在做生意糖久他铡问做什痔么生意他一听就坯火了他年轻毅时也这么回答过肾我爷爷他知道我是在赌博脱下布漾鞋就朝我打来我左躲右藏心想他酝打几下就该完了吧抠暂可我这个催平常只有愉咳嗽才兄有力痉气他的爹叼竟然越打越凶了纺牟我又不喝是俯一只苍蝇碎让产他这堕么拍来拍去我一把捏袱住他的手聂说道爹你他娘的算功了吧女老子看在你把我弄出来的份上员让翱让你你他娘的就算了吧黍我捏住屏爹的右手他又用左隐手脱下右脚助的布鞋还想打我俊我又捏住他的左手这样烫他就动弹不得了他贤气得哆嗦了半晌傍才喊出一声孽子我春说暖去躬你娘的仓视双手一推他就跌坐插到墙角里去了我年轻时吃喝嫖赌什么浪啊荡的事撮都芹干圈过我常去的那家妓院是豌单名叫青楼里面有个胖胖的毗妓女遗很招我舱喜爱她走搏路时两片大屁股老就像挂在楼前的辩两只店灯衔笼晃来晃去她躺到床上辉一仑动唱一动时压在上忱面溯的我束就像睡在船上丈在河水里摇呀摇呀濒我经常嘴让她背廓着我脊去逛街我骑在她身遇上像诞是骑在一匹马上我的丈栓人米行的陈老板穿着黑色的绸衫站在哪柜台后面酵我每次从那里经过时都要揪住妓女馈的头发让她停下脱帽首向丈人致礼幅近来无恙我丈人当时的脸就和松花脐蛋一客样客我呢嘻嘻笑着过每去顷了后朝来我爹说我丈人几纷次都让我气病了竟我对爹说感别哄我啦你是我爹都没气成病他自己砸生病凭屉什么往我身上推烂他怕我我倒是知道谷的我骑在妓女痕身上经过他的店门时郑我丈人身十手极快像只耗子呼地一紧下窜到里屋去了他态不敢见我可当女婿的路过丈人店门幌总该有暇个礼吧我懒就大声嚷窘嚷紊着粳向逃窜的丈人请安最风光的惩那次是小犁日本投降后国军准窘备进城收复失地遵那天可味真是仅热闹城里街拄道两旁站满了人手里拿着小彩旗污商蛀店都斜着插掳出来娟青天白日旗我伍丈人骑米行前才还愚挂了人一每幅两恫扇门陵板那么大的蒋介石像米行的三个伙计都站在蒋介石左边的口袋下那臂天我在青楼泛里赌了一夜庭脑袋昏昏沉沉像是肩膀强上悼扛了一袋米我想着自己有半个来月没候回砷家了身上的衣服挪一股酸臭味我就把那个胖大侯妓女症从发床羔上拖起帮来让她背着我回家叫了抬轿子跟在后面我到了家好让潘她坐轿子回青楼那韭妓女嘟嘟哝舅哝背着我往城门走说什栅么雷公不打睡觉人才睡下就被我叫醒说我僳心肠黑兄我乔把一个银元帜往她胸溪口灌进去就把她的垫嘴辱堵上碗了走近了城门邀一玖看到两旁站了那么多人我的精神一下濒子上来了我丈人岗是城里商会的会长我帕很远就看到他站在街道中鹏央榜喊都站好了都站镇好了等国军一到大家都要拍手垛都要医喊有人看到了衙我僳就嘻碉嘻笑汝着喊来啦羽来啦我抓丈翁人还以为是泪国军来了诛赶紧闪到一旁蛔我两条腿像是夹马似防的包夹了夹妓女漂对她说跑呀跑块呀在两旁人群的哄笑里漠妓女禄呼哧呼哧背着我脊小跑起来塘嘴里骂道夜锐里压我白天骑我黑窗心舱肠的你是逼我往死里抡跑玫我咧着嘴频频向绣两旁哄笑的人点头致礼来到咨丈人碉近阴前我一把艰扯住妓女的头发站住站住化妓窒女彪哎唷叫了珠一声站钓住脚我大声对丈寇人说岳父砸大人女婿给认你请个早安趣那次益我实实在在地把饮我丈人的脸丢尽了我汐丈人著当时傻恐站在那里嘴唇一个劲弘地哆窗嗦半晌才沙哑地说一声祖宗你快走吧割那筋声音听翘上去都不霞像是他逛的了我女人榆家珍当然虚知道我集在陈城瀑里这些花花柏绿绿的秩事家珍是个懦好诺女人我这测辈子吠能活娶上这么有一个贤惠当的女人是我前世做狗吠丈叫了一惶辈子换来嘴的家珍对我狐从来都是逆来顺衍受我在外面胡沪闹刹她只是贼在心漂里打鼓从温不说我什么和我放娘一样我安在城里闹腾得实在有些过分家勤珍心里当然惭有一团乱麻乱糟糟的炼不能豆安鲸分潞有一天夫我从城里回到家中刚刚坐下混家珍就笑盈盈地端出四样菜摆在宅我面前蛤又态给我斟满推了咳酒自己在我拷身梢旁坐下来待候我盎吃喝奋她笑盈盈烛的样卸子案让我觉得奇怪不知道她遇上掉了什么好事我左椿思右想也想不出这博天是什么日子嗜我问仗她她不说就是笑盈奖盈地看着我仍那四样菜都是蔬菜家珍竖做得各不相同可吃随到下紊面澈都是一块差叭不舱多大小的猪肉薛起先我没怎么在意吃到赊最棉后一碗秆菜燥底下又是一块猪肉爪我一愣距随后等我就嘿嘿笑了起来我明白了家班珍的意菊思瘪她是在开导我恃女人看螟上去各不相同到下面都是一样的我对家珍说这道荷理我也知道道理我也知道看到上面长得不一干样的女人我心里想的壹就是不一样这实在曾是没亦办法的事家珍就是这样一个女人心里对我不满脸上爱不让我看出来弄些塑转娇弯抹援角的点子来敲打我西我偏偏是软硬不吃我爹的布鞋和家珍的菜舀都管不住冠我的腿我就是澳爱往城里跑爱往套妓院咆钻还是伯我娘知道益我们男人心秉里想什么她对家珍说粹男即人都是雹馋嘴的猫我娘说这话不只唉是纤为我载开脱还揭了我爹郴的老硬底下我朋爹炽坐誉在椅子里珐一听这话眼睛就眯剐成恩了两条胯门缝嘿嘿挟笑了一下我爹年轻烦时也不检断点他是老了凶干不动了才老亭实起听来缴我赌博时也碘在青楼常玩的陛是麻将猩牌九和骰子我峡每咖赌必输越输我越想把我爹梳年仓轻时输掉的一百多亩地闺赢回串来刚沏开始输函了我当场给钱没钱趣就去偷我烦娘和家珍的仇手饰连存我女窘儿凤霞的瘩金项甲圈也偷了去料后来麻我仙干脆拯赊帐债主们铲都瓷知道我的家境让挎我浚赊帐自买从赊帐以后我就不知道自吉己灰输了有多少债椿主也不提醒我暗地里天天搐都孟在算计着我族家反那一百多亩馏地一直到解放癣以后我才挫知道赌博的赢侧家都是做了手脚的难女怪我老输不出赢他们是挖了个坑让我往藩里面徐跳睁那亩时候青楼里有一位录沈先逃生年纪都快到六十岁了眼睛还毡和猫眼似的静贼亮穿着蓝布麻长衫腰沮板靛挺着笔直平常时候种总是坐在角落醛里峡闭着眼睛绒像另是在动打盹等到牌桌上的赌注越下越大沈先扳生才咳嗽几声慢送悠悠地走过来选讽一位置站着看壕看了一会疆便有饵人站起来让位沈先生这里坐艺沈先闽生脐撩起长诌衫坐下对另三匣位赌徒说请右青楼里的挖人从没见到幼沈先生输沁过他喉那湃双青筋突昆暴的手洗牌时只巧听到哗哗的风声那付辕牌在瘤他手中忽睡长睛忽短吭唰唰地琼进祖进出出看得我眼睛都酸了有一次沈先友生喝醉秒了酒对掺我说赌云博全靠一双防眼睛一双敞手眼睛要练成爪子一样彻手要练成泥鳅那样滑以小日本投降那年龙二来陀了龙二说话酋时南腔北调光听他的口音就知道穗这人不简单是闯色荡过很多地方籽见过大瓣世面的人龙二不穿残长衫一身白绸晰衣和他企同来的还有两摩个人帮特他提着两棕只很大磕的柳时条箱渡那年闭沈先生和龙二的赌局实在是精彩青楼的赌厅里盈挤建满了液人沈先生个和他们三您个人赌龙二身后站着碎一个跑淑堂骆的值托着蜒一盘皱干毛巾龙二不时取过一块毛巾擦手喘他不拿湿页毛巾拿益干毛巾擦手我们闭看了都鬼觉得稀奇他丫擦手时那副派头像是给刚吃莹完了饭似的起先超龙二一直输他看上去还满不在乎倒是栏他带来的两个人沉拼不住气一个骂离骂咧咧咆一何个唉填声叹气沈亏先生甚一直赢桐可脸筐上吮一餐点赢的意思都没有沈先生皱着悔眉头像是输梯了很多似誉的他脑浩袋垂着眼轮睛却跟钉拖子似爷的叁钉辕在座龙熏二那双手上扛沈通先生年纪旭大了半个晚上谆赌下酮来幽就开始喘奇粗气额头上汗水渗了出来沈先误生说一局定胜负摹吧互龙二从盘子里衅取过最赡后一樱块毛巾擦着手瘸说脏行啊他们把所淆有册的钱都压在了桌上狄钱差不多把桌面占满合了只汗在中间留个空每吉个人发了系五张牌南亮仰出四张后龙六二的刻两图个伙伴立刻泄气了把嗅牌一推说谅狱完啦又野输了依茫龙二赶紧说没输你示们赢呀啦说着帝龙二灭亮出躯最后那啪张妖牌是黑桃德A他的两个伙伴一看立刻聚嘿嘿笑了好其实沈先她生最后咆那张牌也是黑李桃A他是三A带错两K龙争二辩一个伙伴是三Q磺带俩J吸龙二惩抢先亮出了黑桃A沈先生怔徘了半徐晌少才把手中煌的钢牌一收说我乳输了邪龙二的黑桃A和沈先生的都畅是从袖管里换出捶来的香一副牌不能毒有两张黑桃频A龙府二露抢了先沈先生心里织明白也方只能认输那是我们朽第一次看誓到沈先生输沈先鳃生滴手推桌费子啊站起来向龙二他迄们作了喘个揖转过身来钻往邀外锨走走仪到借门观口微笑元着说我老了蛙蓬后来再笆没人见过沈先生听说那天天刚亮他获就坐着讯轿捻子走了沈先生一走龙二成乙了逾这里擒的赌博师傅龙二和沈先生不一样沈先生泞是只赢不输龙二是赌注小常输施赌注晾大就没见他输过氟了赞我在青楼常和龙二他们赌有输*杏晕易*觉得自己没怎么输其实我赢瑚的都是蝶小钱输掉的倒是大灼钱我还蒙锋在鼓里以为自己马上就要剪光耀汰祖宗了鬃我最后一次蒲赌博时恋家珍来了墨那时候天篮都快刀黑了这是家停珍后啃来告诉我的我当初根本不知道计天是亮嗓着蝗还笑是要黑了家珍棉挺女了个大肚子赶找到青楼来了我儿给子哲有庆在呵他娘肚质子里躇长到七八月铬个月了家珍找到清了我橇一声不吭地跪在我肄面前起脯先我同没看到恢她那两天我无手气特别好臂掷捧出的骰子十眠有八九痹是我要的点数坐在炉对面的龙二一漂看吗点数嘿嘿仲一笑启说兄弟我又栽了琢龙二摸牌把沈罕先生赢了之后青楼里没人敢和他摸牌鄂了钧我也不敢我和龙二赌都是用骰杖子耪就茶是骰范子龙二玩的也很地道他彬常赢鳃少赌输可那天他栽到我手宙里了懦接驴连地输给我律他嘴窗里叼着况烟卷眼睛眯缝着像是什么事卑都情没有每次砒输脯了都还嘿嘿一笑轿两条瘦胳撬膊把钱推炔过来时却是一咬百个不愿意我想龙二你也该惨肿一贴次了蓖人都是一样的绑手伸进别人口烘袋里掏钱时那个眉开眼笑探轮终到自己给钱了一个个都跟哭萎丧喷一样裤我正渤高究兴摊着有人萧扯了扯我的衣服低丫头一看是自己的纲女人看到家珍跪着我就火了心想潜我儿子梆还克没出来就跪着了这太不吉利稼我就对家珍说将严起来起来你他娘的给我起来撂家珍还真听话立吕刻站了起来我说耐你疏来干纤什作么还不泄快给我回去拖说闲完我钱就不轻管她了看着龙相二将骰子捧厌在手心里跟拜疼佛似秋的摇了狰几下他一掷出脸色就难憾看了说播道摸过女存人屁夺股临就是手气不栗好我一钨看辉自己身又赢了哆就说喳龙二沪你去刻洗洗普手吧龙巩二嘿嘉嘿一笑说道蚁你把嘴巴子抹干净了再说话做奄家珍又扯了扯我的衣服肝我一看她又案跪到不地上家珍细祟声细气地说你跟炙我回去诺要灶我跟一搬个女颓人回去我家珍啸这不是存心出我哇的丑我的怒气一下子指上来乒了我诲看看龙二他掉们他们都甫笑着看我我对家珍问吼袁道绚你疆给我综滚回溪去家珍还朵是说猩你跟怂我回瞪去肿我给了她两巴掌家珍的脑袋卞像是拨治郎鼓那样扳摇叮晃了几下咖挨了我的打她还是跪懒在那里说你不回去楷我就不掀站起在来现在想起来靛叫我茧心放疼伯啊我事年轻润时真是柯个乌龟王八蛋禄票这么好的女盆人我对她又酚打又疥踢冬囚我怎么打风她她就是跪着不樊起来打到最后连我自己都觉得没入趣了家珍头发披散眼泪汪汪地捂镍着脸我就从赢来的钱里抓爸出一把给了旁赢边佃站着的两个人桅让他们蠕把家珍拖出去我掐对他们漏说拖得越远热越好蜒家珍被拖出鸽去哎时散双手紧育紧捂着凸起的肚圆子那里面有我的儿子呵家珍没喊栅没叫被噪拖到了大街上师那两个人扔开黑她捐后她就扶着墙壁站起饰来那时候天完全持黑踏了她一个人慢拥慢往回走后来我问她她迟那时是不是恨死我了她摇摇头说没有我的女人抹着眼泪走到她爹项米行门口悸站了很长时间她看到她爹的脑袋被煤油灯的亮光印卸在胁墙上她知道他是泵在清点帐目耗她站在那里孝呜呜哭了一会就走开了家台珍口那天晚上走了十多里夜路怒回到了我家她一个勘孤身女微人夺又磋怀置着龚七个多月的有庆一路上孕到处都是涛狗吠下过一座场大雨的路氓又坑坑色洼瘪洼
Loading model cost 0.509 seconds.
Prefix dict has been built successfully.
Wrote XML report to C:/Users/黄翼山/AppData/Local/JetBrains/PyCharm2023.2/coverage/$.xml

进程已结束,退出代码为 0

 
main.py的测试覆盖率达80%以上:

从命令提示符窗口接受参数的部分语句未涉及.


 

部分异常处理

在测试代码中加入一句

similarity_checker(ori_text=sentence_1, test_text_in='')   #如果向该函数输入空字符串

将发生错误, 因为计算余弦值的语句

result = np.dot(words1_vector, words2_vector) / (np.linalg.norm(x=words1_vector) * np.linalg.norm(x=words2_vector))

出现除零错误. 解决办法是向上面语句的分母加入一微小值.
 
原代码修改前后的输出及性能变化很小:


posted on 2023-09-15 20:23  黄翼山  阅读(60)  评论(0编辑  收藏  举报