fix: dedup only same-author duplicates

중복 제거를 텍스트만 보고 하던 것을 작성자까지 보게 고친다. 저자가 같으면
같은 사람 글이 두 번 적재된 것이라 침해가 아니지만, 저자가 다르면 그 중복
자체가 침해 후보다. 앞서는 이를 구분하지 않아 256건을 모두 뺐고, 그중
17건이 서로 다른 작성자의 글이었다.

같은 작성자 그룹만 제외하도록 목록을 다시 만들어(239건) 재실행하니 검사
대상 6104건, 침해의심 106건이다. 80 -> 106 의 증가분은 되살린 17건 전부와,
그 17건이 색인에 돌아오며 새로 매칭된 9건이다. 빠진 건은 없다.
106건 전수 확인 결과 매칭 상대의 작성자는 모두 다르다.

판정 사유 표기도 바로잡는다. 행 단위 대표값으로 재현하면 서로 다른 후보가
각기 다른 조건을 충족한 3건이 '사유 미상' 으로 빠졌다. 후보 판정재료를
쓰도록 고쳤다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
hbyang 2026-09-03 17:00:05 +09:00
parent 94a660dc35
commit 4e650d59ad
4 changed files with 6359 additions and 1 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,239 @@
seg-d3fbe94228ab881296b6
seg-751c3589b594278c083a
seg-5fc0614ce99a6618c8df
seg-e9d6cfe7d8c32ac76685
seg-5661be946f8b631f15a5
seg-075a0e34ae4297d7a690
seg-50db79ea6d2727c2294b
seg-247b665d9d4ee02b33f9
seg-44984b4a4e98fa4a523c
seg-07581bfbc6837377918b
seg-bff759c20055d96d1f4b
seg-f5c5bca93e58b039a022
seg-f5d329cc2b30ae71f105
seg-4d6b39d38d78d612702c
seg-0edf0ca49a261c64c385
seg-55dde76d300a6ae8c3de
seg-ffdde9a61951d9ebb1a3
seg-410f0ebe300e69c627b9
seg-1245e54f50bc293ccaf6
seg-8331dded31e15a735156
seg-6f4f844cfa81f266abce
seg-8c6cacccd47732ef2df3
seg-0f3197e20379dd548cc3
seg-9a98e4bbf3c132bb9b5b
seg-23ded3d3143f049f3082
seg-e37c0908ca2aa3f55503
seg-24f8107434fc48c067b1
seg-5d4f783c3645437c6070
seg-5274f32e15cf95d178d0
seg-d243f0147bf6b556f572
seg-a467d7d4e7c1fb53da80
seg-cc9363262d7bb9159306
seg-5d7f16828df7db4a2b76
seg-54022db9a1d633a4045d
seg-d0b69f55d3f934f87b5f
seg-bdb4188636fcf0d96ca4
seg-288dc6c99554be21fa18
seg-cf0cdf656e0fb06ef873
seg-eb77d16bc244ad727b84
seg-30d7e35a031a46cc71e0
seg-a42a048a63356af43586
seg-5ff84bb1c602e8410ed7
seg-bbd6204bfd92ce23ae88
seg-d1830d7e5b83dce69c15
seg-bf88dc382fa57030f641
seg-be8c1f14df73996ff3fc
seg-22a696af220d87a59378
seg-ac6d6a1c976b9d03b8a1
seg-d383082fce6037b85412
seg-3ef361f6e3f6d8238949
seg-dde5178ca77977d2af77
seg-430ce38f4aeaec2ee30d
seg-dc3ed111c198333b41a6
seg-62dbfefbb87ae7edffb5
seg-70c32fa5c3fa064d8517
seg-38ce69b80bff6bf91bad
seg-aa5a97c20e56d3e06a18
seg-a538c6ed532265042c2c
seg-8b80b03f94f0ff0a09fc
seg-ef8b9a90adaabae27467
seg-9371d04bedc46ff3307a
seg-2e774b13ce5649bbef44
seg-7a544a5709a515eebe9f
seg-f5b34bfd2d2808b30d57
seg-a5827f00cc888d6bd553
seg-e3e107d84c4705a9cce1
seg-53fe28079bf8e65376da
seg-8c2c713c44ef651f5138
seg-d182c9b4a909dd0a7bbb
seg-93ceac7aa9a9e5a06ce1
seg-a398d393288e13d66de3
seg-52cb8da0dc336319f732
seg-ae11015b4ae9b766d5c3
seg-30b280d1c2859a5ae036
seg-9c13ba45ae839ebfc44d
seg-5600dc312d9effe82322
seg-cd270243863ef7841dfb
seg-cf8f63bf5fe850471401
seg-7507defdcb9416205954
seg-f7e0090d229fc1a308b0
seg-e0d851a207476f87c789
seg-bd5662c91ab35270516b
seg-be04976635524964ce62
seg-fa44f8a2635163b24fb7
seg-62d41db76b35c50fc80c
seg-943fd1f2254a41d56795
seg-9dcd69c2d11e6cca179e
seg-7d35c0b29a378389e352
seg-76b19ec66f94dffaf00a
seg-e66251e5a312bc798e2e
seg-a9b38449e85ed466047e
seg-abf6d9be2a35224b9e09
seg-aab80bc4d6a9f419c723
seg-bd7b1fd2bc26447c9910
seg-8da64f864be5944aedef
seg-587d9bf5b0eca24fe707
seg-9eb5bd09ab63980559b4
seg-ee19e6aaf1b089d3e641
seg-8a7b17ec37d128136ac9
seg-4504aa1d788d212d2df5
seg-b98614064b81140e0fe4
seg-966a6311fb356d92b6d1
seg-bc2e4bb72583ecf07179
seg-576943b2975470189554
seg-f773aa3058f06ae79b47
seg-f4be6c5c541c902d642b
seg-a3fca07ea170e36417e2
seg-c5352306e93499c0a97b
seg-7c843b92edcd5b2a9fd9
seg-81c3bd5d41f4a068de6e
seg-8f78bae75bb369f94503
seg-e0de5524dfe1159eb363
seg-ef54adc86f4a0a297118
seg-bedd4f81482541351bb7
seg-e811cffbcc76695b6e6f
seg-c3b58a34306a6a4e5b59
seg-bf75b74deb39ccf1303a
seg-c8d5a76ff7e035ef22b6
seg-b8637db3c35177137a3f
seg-ccaf5c07904036512566
seg-7419176fd92cceea9686
seg-b72eea0366a31e987386
seg-69ea27fd2881c7627ded
seg-f7a461e0a15fb18ba98f
seg-896990d33e817107c0bc
seg-8cecf2cdee3da79b1b05
seg-f885a8e028dadc75d8e2
seg-e83d73a7381c3c9d52e1
seg-a8facc3763ded9d2ddb1
seg-fafe437f7069e5fd7722
seg-7bf545545753af04309f
seg-af0a392936f76d3f0bbc
seg-5956baedf58f802290ca
seg-8f64481ef86947095f9c
seg-68644acb7b741ed0040f
seg-f5a3280bab5b83a6716b
seg-e00351c4a290824c305c
seg-881fe2194708c84ff2bc
seg-905c5684472d150fbaf8
seg-9977b26f515658764743
seg-f25987b145b277afd1bb
seg-8620bf9b61e70258c169
seg-b94936f18a528d1d1484
seg-78b533ef1ae0d6edae2d
seg-f4dd4bb7814c681310be
seg-ef082f2347172e8cecf4
seg-8ad3bcfb1e19146479aa
seg-d9651090b7a6aa2f0430
seg-e1e78ffdc76fd9ffaf9e
seg-cff3db09ecfb8d7fc0d7
seg-a6355ffad5bd71af53c6
seg-d53dda8d81b2adf120e8
seg-67563b9afa606c5587c7
seg-c43016a4caaf3143cd98
seg-a0837f25f895120a065f
seg-c9da95e71f1e2fabd0ec
seg-fbb309c63c26989c8576
seg-c29909ee9a58cb26b01a
seg-819aecc9f54fd9b55be2
seg-d0a0f26c8be62bfb2d0c
seg-fd26051079a4bf040532
seg-98a5697519e5f97e249a
seg-d2751017aa736359f7d4
seg-74fed19b12664e50be9c
seg-c23c2fc3639889509e9e
seg-c36dff9dde138672ddee
seg-e3c87966f3b3f2bb6841
seg-e4771ac5792eeb914b07
seg-cd775fabaf6cb4994cdf
seg-7a1c0983f84940c7201b
seg-9d79705b707d9e32b117
seg-b0c16c55fa9e8277349d
seg-d57e517755b00919daca
seg-79b6ba59c8781f00ce0a
seg-f6c8922e9d20de2076ff
seg-c93928d4782eb4c6afe8
seg-93bcd6a33398bd7280ec
seg-f832f4d3a11932fd556a
seg-d6810579afc033bd1b14
seg-b6ed3f352a7847b0b8a1
seg-a7358497f1e85ad51ff8
seg-e17e714288dc109c5baa
seg-a1655a23565dc471aa47
seg-d5fe534027eb9c1e85fd
seg-ab243504653f9648e7bf
seg-dfec7d5d1b119a418561
seg-bf99840a40b62052271b
seg-a985637ec6ab3d46d555
seg-a9413062361aa4f345c4
seg-e57636f9636d23ef4039
seg-9554999648a9aadc31bd
seg-c62f06ad5656a4599475
seg-b49e6da1a3a6b0eba049
seg-d7063bf4d41293c25c90
seg-ccf95d993d1c472e27e9
seg-b7f22ef0b4697779bde5
seg-bbce92de4976f5dc93a1
seg-f03532de0097e52edb9f
seg-f70fdab6a38ff5140308
seg-c23074b3203f30fbba5c
seg-d6ea9afd3697d2aaefe1
seg-d07c0d0cd0d0aea3cfc9
seg-eead2327f235ebd6efe7
seg-9fd1b8cd453902242690
seg-a82cd00ce71260f0350a
seg-a5a838ab500c1da7e11a
seg-a311b6e8f8c03dc79c1e
seg-fff1369f0ea4f9f17516
seg-d3dbae3326a84db54529
seg-ed34c62c55263092b07e
seg-d35338514edde20b18b5
seg-aa007367cea2c002f094
seg-d0b236f8748a269bdecc
seg-ed816d3c437985f03ea5
seg-debed50cad3a7946a2cf
seg-eaacca81f4591e799863
seg-fda2d67cf5a23cb91b3e
seg-e7ad9915d5e81d735cb0
seg-df4cfebb17d4574beaf6
seg-c0e7b6315ea41307ea0d
seg-cb9c60dd9ccad9606a72
seg-fb900d525ce3b5fac463
seg-e75049a453021a03ff30
seg-e01166955fe0dadec87d
seg-fccf864c1bd61629218c
seg-d8ecd0403ec0c7ddbdbb
seg-fecff1ad96f117b29fb9
seg-ea129bba581d8ab62b7a
seg-da7ac80c29ff726d58ab
seg-dd7f88929af72ef109e2
seg-fdc6d5861c7d7e2edee9
seg-f923d6974271cb91fb5a
seg-f1c0cf14a231160b7f3e
seg-e97c69c482cd66aa04cd
seg-f552457bdb5adcf726fe
seg-ecbbb6b9ee769091fdb5
seg-f9da50c0714c3e8eca0a
seg-ec05c1d86aacdb87b00f
seg-f97a6835ca56b8bcf03d

View File

@ -489,7 +489,22 @@ COVERAGE_MIN = 0.30
def judgment_reasons(row: dict, longest_span: int) -> list[str]: def judgment_reasons(row: dict, longest_span: int) -> list[str]:
"""어느 조건으로 의심 판정이 났는지. detector.py 의 OR 조건과 같은 기준.""" """어느 조건으로 의심 판정이 났는지. detector.py 의 OR 조건과 같은 기준.
엔진은 후보 하나하나에 조건을 적용한다. 행 단위 대표값(결합유사도·
union_coverage)으로 재현하면 서로 다른 후보가 각기 다른 조건을 충족한
경우를 놓치므로, 후보 판정재료가 있으면 그것을 쓴다.
"""
candidates = row.get("후보 판정재료")
if candidates:
reasons = []
if any(c["combined"] >= SCORE_MIN for c in candidates):
reasons.append("①유사도")
if any(c["longest"] >= SPAN_MIN for c in candidates):
reasons.append("②연속일치")
if any(c["coverage"] >= COVERAGE_MIN for c in candidates):
reasons.append("③커버리지")
return reasons
reasons = [] reasons = []
if (row.get("결합유사도") or 0) >= SCORE_MIN: if (row.get("결합유사도") or 0) >= SCORE_MIN:
reasons.append("①유사도") reasons.append("①유사도")