jiangtian616 / JHenTai

A cross-platform manga app made for e-hentai & exhentai by Flutter
Apache License 2.0
3.1k stars 79 forks source link

可选的标签搜索结果排序 #337

Closed mokurin000 closed 11 months ago

mokurin000 commented 11 months ago

需求 / Requirement

以标签链接的作品数量(定期更新)排序标签补全提示

原因 / Reason

搜索标签时如果以部分标签搜索会有大量结果,且无法通过多词的英语搜索标签,需要在大量标签中寻找需要的标签

建议实现 / Suggested implemention

提供设置项允许设置标签的排序方式

备注 / Addition details

No response

自查步骤 / Verify steps

jiangtian616 commented 11 months ago

以标签链接的作品数量(定期更新)排序

EhTagTranslation没有提供这个..没找到哪里可以获取到这个数据

mokurin000 commented 11 months ago

以标签链接的作品数量(定期更新)排序

EhTagTranslation没有提供这个..没找到哪里可以获取到这个数据

https://forums.e-hentai.org/index.php?s=&showtopic=201268&view=findpost&p=5474857

我找到一个四年前的画廊数据库 应该可以凑合用来排序非作品相关的标签

今天下午和老婆买完菜我看看有没有办法自己用rust糊一个标签-数量 统计 用python一两秒就处理完了

mokurin000 commented 11 months ago

tags.json.gz 用四年前的数据整理了一份,现在的排名应该也大差不差 另外附上排序的 tags_sorted.json.gz

https://github.com/ccloli/e-hentai-db 找到一个更新的db

cut -f 2 -d \  gid_tid-2023-03-04_203641.sql |
    tr -cd "[0-9]\n" |
    sort -n |
    uniq -c |
    sort -n -k 2 > count_tid.txt

好像多了一些空行忘了处理

grep -v INSERT tag-2023-03-04_204433.sql |
    tr -d "(),;" |
    sort -n > tid_tag.txt

最后合并一下

join -1 2 -2 1 count_tid.txt tid_tag.txt > tid_count_name.txt

tid_count_name.csv.gz

import csv
import json
import umsgpack

def read_data(csvFilePath):

    data = {}

    with open(csvFilePath, encoding='utf-8') as csvf:
        csvReader = csv.DictReader(csvf)

        for rows in csvReader:
            key = int(rows['tag_id'])
            data[key] = int(rows['count'])
        #     del rows['tag_id']
        #     data[key] = rows

    return data

filePath = 'tid_count_name'
tagData = read_data(filePath + ".csv")

with open(filePath + ".json", "w", encoding="utf-8") as jsonFile:
    jsonFile.write(json.dumps(tagData, indent=4))

with open(filePath + ".mpk", "wb") as messagePackFile:
    messagePackFile.write(umsgpack.packb(tagData))

tid_count.json.gz

tid_count.mpk.gz

jiangtian616 commented 11 months ago

那看来没法做实时更新,只能处理后以静态数据存在了。

mokurin000 commented 11 months ago

那看来没法做实时更新,只能处理后以静态数据存在了。

上游有较严格的反爬措施

问题应该主要是新作品,新角色(很久之后)的排名需要之后更新

mokurin000 commented 11 months ago

https://pub.dev/documentation/messagepack/latest/ 这个不知道怎么样,我需要写一下从数据库访问的更长期可用的转换脚本吗

jiangtian616 commented 11 months ago

这是个工具包?数据解析工作好做,实现思路肯定是读取你这个数据、格式化后写入数据库里,不需要每次用时都去解析。

问题是UI交互和数据更新方面,还在考虑怎么实现,最简单的话就是和现在下载标签翻译数据的交互一致。但EhTagTranslation是有专门的发布地址的,这个没有。

mokurin000 commented 11 months ago

这是个工具包?数据解析工作好做,实现思路肯定是读取你这个数据、格式化后写入数据库里,不需要每次用时都去解析。

mpk会比json解析快一些,不过没必要

问题是UI交互和数据更新方面,还在考虑怎么实现,最简单的话就是和现在下载标签翻译数据的交互一致。但EhTagTranslation是有专门的发布地址的,这个没有。

要不你开个repo或者我开个repo?(其实大半年更新一次的数据库感觉没必要CI……) 用github ci或者手动发release 还是说在客户端这边解析sql代码并更新

mokurin000 commented 11 months ago

这是个工具包?数据解析工作好做,实现思路肯定是读取你这个数据、格式化后写入数据库里,不需要每次用时都去解析。

问题是UI交互和数据更新方面,还在考虑怎么实现,最简单的话就是和现在下载标签翻译数据的交互一致。但EhTagTranslation是有专门的发布地址的,这个没有。

https://github.com/poly000/e-hentai-tag-count/releases/latest

但是 Github REST API 需要 Personal Access Token

或许应该固定文件名,好拿一些

https://github.com/poly000/e-hentai-tag-count/releases/latest 返回的 location 最后就是最新的tag

// https://stackoverflow.com/a/65004778 
import 'package:http/http.dart' as http;

http.Request req = http.Request("Get", Uri.parse("https://github.com/poly000/e-hentai-tag-count/releases/latest"))..followRedirects = false;
http.Client baseClient = http.Client();
http.StreamedResponse response = await baseClient.send(req);
Uri redirectUri = Uri.parse(response.headers['location'])

然后 https://github.com/poly000/e-hentai-tag-count/releases/download/ tag /tid_count_tag.csv.gz

jiangtian616 commented 11 months ago

有个问题,EhTagTranslation的元数据没有tid,我没法用id把标签数据关联起来。。只能用完整的标签名称如female:lolicon

其他地方都是ok的,就是导出的csv列得换成名称+次数。如果你方便的话可以搞搞,没空的话我之后开个repo。

mokurin000 commented 11 months ago

有个问题,EhTagTranslation的元数据没有tid,我没法用id把标签数据关联起来。。只能用完整的标签名称如female:lolicon

其他地方都是ok的,就是导出的csv列得换成名称+次数。如果你方便的话可以搞搞,没空的话我之后开个repo。

啊,那我合并一下 tag.sql

ccloli commented 11 months ago

视奸而来

需要说明一下,上面的数据源可能存在一些问题,因此如果你们需要更准确的数据的话,可能需要评估一下:

  1. 数据里的 tag 仅限抓取时收录的 tag,按照我在服务器上配置的定时任务,一般可以认为最后一次同步的时间为 gallery 发布后 48 小时,再之后的数据理论上不会被更新
  2. EH 的 api.php 很迷,返回的 tag 里可能会包含 weak tag 也可能不包含,且没有字段能指示是否为 weak
  3. tag 表里的 id 是数据库自增的,和 EH 自己维护的 tid 没有关联
  4. EH 曾经对 tag 做过一次重新分类,包括将以前的 misc 替换成了 other,例如将 misc:howto(实际记录在 EH 里的没有 misc: 前缀,只有 howto)在这次更新后替换为了 other:howto,目前上述数据没对 tag 相关的 alias 做任何处理,因此上述分类前后的数据可能会有较大差异
jiangtian616 commented 11 months ago

~视奸而来~

需要说明一下,上面的数据源可能存在一些问题,因此如果你们需要更准确的数据的话,可能需要评估一下:

  1. 数据里的 tag 仅限抓取时收录的 tag,按照我在服务器上配置的定时任务,一般可以认为最后一次同步的时间为 gallery 发布后 48 小时,再之后的数据理论上不会被更新
  2. EH 的 api.php 很迷,返回的 tag 里可能会包含 weak tag 也可能不包含,且没有字段能指示是否为 weak
  3. tag 表里的 id 是数据库自增的,和 EH 自己维护的 tid 没有关联
  4. EH 曾经对 tag 做过一次重新分类,包括将以前的 misc 替换成了 other,例如将 misc:howto(实际记录在 EH 里的没有 misc: 前缀,只有 howto)在这次更新后替换为了 other:howto,目前上述数据没对 tag 相关的 alias 做任何处理,因此上述分类前后的数据可能会有较大差异

感谢提醒,目前看来问题不大,基本要求是常见的标签能排在前面就行。 1、48h内画廊的主要标签应该差不多已经打完。 2、weak tag不太影响标签排序,如果一个标签被打成weak的次数多也说明比较常见。 4、这种的话只能暂时忽略,也不影响整体。

mokurin000 commented 11 months ago

~视奸而来~

需要说明一下,上面的数据源可能存在一些问题,因此如果你们需要更准确的数据的话,可能需要评估一下:

  1. 数据里的 tag 仅限抓取时收录的 tag,按照我在服务器上配置的定时任务,一般可以认为最后一次同步的时间为 gallery 发布后 48 小时,再之后的数据理论上不会被更新
  2. EH 的 api.php 很迷,返回的 tag 里可能会包含 weak tag 也可能不包含,且没有字段能指示是否为 weak
  3. tag 表里的 id 是数据库自增的,和 EH 自己维护的 tid 没有关联
  4. EH 曾经对 tag 做过一次重新分类,包括将以前的 misc 替换成了 other,例如将 misc:howto(实际记录在 EH 里的没有 misc: 前缀,只有 howto)在这次更新后替换为了 other:howto,目前上述数据没对 tag 相关的 alias 做任何处理,因此上述分类前后的数据可能会有较大差异

欸?gid-tid关系表的id和tag表是无关的吗

ccloli commented 11 months ago

欸?gid-tid关系表的id和tag表是无关的吗

是有关系的,我指的是 EH 官方维护的 tag 是有一个 id 值的(毕竟都是数据库),而这个 id 和我的数据表里的 tag id 不是同一个

顺带曾经误打误撞,看到过 EH 有一个列出了所有 tag 列表的页面(不是 wiki),但我现在找不到了,有可能可以从那个页面找到所有 alias 的 tag

另外也可以参考这个数据集 https://sukebei.nyaa.si/view/3914574

mokurin000 commented 11 months ago

欸?gid-tid关系表的id和tag表是无关的吗

是有关系的,我指的是 EH 官方维护的 tag 是有一个 id 值的(毕竟都是数据库),而这个 id 和我的数据表里的 tag id 不是同一个

顺带曾经误打误撞,看到过 EH 有一个列出了所有 tag 列表的页面(不是 wiki),但我现在找不到了,有可能可以从那个页面找到所有 alias 的 tag

另外也可以参考这个数据集 https://sukebei.nyaa.si/view/3914574

https://repo.e-hentai.org/tools/taggroup?show=2 难道是这个

ccloli commented 11 months ago

啊,也就是说ehentai那些废弃掉的没有命名空间的id都是有alias的吗?那样子现在我这里的统计应该会有一些标签被分开了?……

是的,比如 766031/7fc94d0041 ,现在在 EH 里标记的 tag 是 other:how to,但是在我的数据里是 how to,就是因为 EH 做了 alias,让返回的数据都归类为新的 tag 了

顺带在 EH 上搜索 "how to$" misc:"how to$"other:"how to$" 应该返回的都是同样的结果

https://repo.e-hentai.org/tools/taggroup?show=2 难道是这个

啊对,确实是这个,感谢指点。如果你们需要用我的那份数据,可以考虑把这个页面里的 alias 算上……如果你们确实要做这么精细的话

mokurin000 commented 11 months ago

啊,也就是说ehentai那些废弃掉的没有命名空间的id都是有alias的吗?那样子现在我这里的统计应该会有一些标签被分开了?……

是的,比如 766031/7fc94d0041 ,现在在 EH 里标记的 tag 是 other:how to,但是在我的数据里是 how to,就是因为 EH 做了 alias,让返回的数据都归类为新的 tag 了

顺带在 EH 上搜索 "how to$" misc:"how to$"other:"how to$" 应该返回的都是同样的结果

https://repo.e-hentai.org/tools/taggroup?show=2 难道是这个

啊对,确实是这个,感谢指点。如果你们需要用我的那份数据,可以考虑把这个页面里的 alias 算上……如果你们确实要做这么精细的话

欸 我刚刚在 e-hentai-db 的 tags搜索 male:absorb的几个alias好像只搜索到了master

howto的话,10395/138085 都是

之后看看有没有办法把这里的master关系全部爬下来,然后tags处理一下统一替换成master tag id,应该可以提高一点精确

今天先咕了

mokurin000 commented 11 months ago

啊对,确实是这个,感谢指点。如果你们需要用我的那份数据,可以考虑把这个页面里的 alias 算上……如果你们确实要做这么精细的话

等等, how to 怎么不在 https://repo.e-hentai.org/tools/taggroup?mastertag=22072 里 这种情况是标签直接改名?……

image

e-hentai-db dump下来的是 'how to',但是这个标签自己变成了 o:how to

{
    "gmetadata": [
        {
            "archiver_key": "473473--81e48399b5e9edbc093088ba3310a712578a071f",
            "category": "Manga",
            "expunged": false,
            "filecount": "127",
            "filesize": 6597634,
            "gid": 23368,
            "posted": "1205002329",
            "rating": "4.38",
            "tags": [
                "language:english",
                "artist:hayashi\r\nhikaru",
                "other:how to"
            ],
            "thumb": "https://ehgt.org/85/86/858614f3bb32a2cb3bfdbb5db41026bb60a60ec6-139468-723-1024-png_l.jpg",
            "title": "Hikaru Hayashi - Techniques For Drawing Female Manga Characters",
            "title_jpn": "",
            "token": "04a95eacdc",
            "torrentcount": "0",
            "torrents": [
            ],
            "uploader": "abp10"
        }
    ]
}
mokurin000 commented 11 months ago

啊,也就是说ehentai那些废弃掉的没有命名空间的id都是有alias的吗?那样子现在我这里的统计应该会有一些标签被分开了?……

是的,比如 766031/7fc94d0041 ,现在在 EH 里标记的 tag 是 other:how to,但是在我的数据里是 how to,就是因为 EH 做了 alias,让返回的数据都归类为新的 tag 了

顺带在 EH 上搜索 "how to$" misc:"how to$"other:"how to$" 应该返回的都是同样的结果

https://repo.e-hentai.org/tools/taggroup?show=2 难道是这个

啊对,确实是这个,感谢指点。如果你们需要用我的那份数据,可以考虑把这个页面里的 alias 算上……如果你们确实要做这么精细的话

好奇怪,这些别名在前端都显示为主tag,api也返回主tag名,但是 e-hentai-db 这里拿到的却是别名?……

10395) 有1116次匹配,这些匹配分散在不同时间,但是我这里给 api.php 发请求拿到的都是 other:how to

直到 2072054 前 how too:how to 共存

ccloli commented 11 months ago

好奇怪,这些别名在前端都显示为主tag,api也返回主tag名,但是 e-hentai-db 这里拿到的却是别名?……

参考我之前说的:

EH 曾经对 tag 做过一次重新分类,包括将以前的 misc 替换成了 other,例如将 misc:howto(实际记录在 EH 里的没有 misc: 前缀,只有 howto)在这次更新后替换为了 other:howto,目前上述数据没对 tag 相关的 alias 做任何处理,因此上述分类前后的数据可能会有较大差异

比如 766031/7fc94d0041 ,现在在 EH 里标记的 tag 是 other:how to,但是在我的数据里是 how to,就是因为 EH 做了 alias,让返回的数据都归类为新的 tag 了

EH 现在只会返回最终 alias 的 master tag,但是在以前,这些 tag 可能是没有 alias 的,或者这些 tag 以前的 master tag 是另一个名字。上述数据只保证抓取当时 api 返回的是什么内容(而绝大多数数据都是 19 年的 gdata.json 贡献的),我记得 misc 改成 other 好像是 21 年的事

mokurin000 commented 11 months ago

好奇怪,这些别名在前端都显示为主tag,api也返回主tag名,但是 e-hentai-db 这里拿到的却是别名?……

参考我之前说的:

EH 曾经对 tag 做过一次重新分类,包括将以前的 misc 替换成了 other,例如将 misc:howto(实际记录在 EH 里的没有 misc: 前缀,只有 howto)在这次更新后替换为了 other:howto,目前上述数据没对 tag 相关的 alias 做任何处理,因此上述分类前后的数据可能会有较大差异

比如 766031/7fc94d0041 ,现在在 EH 里标记的 tag 是 other:how to,但是在我的数据里是 how to,就是因为 EH 做了 alias,让返回的数据都归类为新的 tag 了

EH 现在只会返回最终 alias 的 master tag,但是在以前,这些 tag 可能是没有 alias 的,或者这些 tag 以前的 master tag 是另一个名字。上述数据只保证抓取当时 api 返回的是什么内容(而绝大多数数据都是 19 年的 gdata.json 贡献的),我记得 misc 改成 other 好像是 21 年的事

欸.. 看样子那个页面有些alias是拿不到的

(42126, 'akiba cute star'), (48116, 'akibacutestar'),

image 这里直接多了cosplayer: 命名空间

不过 (131, 'ffm threesome'), (137861, 'mixed:ffm threesome'), image

要不要移步 https://github.com/poly000/e-hentai-tag-count/ 讨论,感觉在这里会有点ot

mokurin000 commented 11 months ago

遇到了一个小问题( 我看了一下, JHentai 是通过 latest tag 判断所使用版本 如果之后还有加入新的手动添加的tag更新,可能会进行同tag的微改合并 不过可以确定,这些精确调优对tag排序的影响不大

jiangtian616 commented 11 months ago

数据有更新的话,重新打个tag发个新的release就行,目前和标签翻译数据一样,应用启动时会自动去更新。

jiangtian616 commented 11 months ago

最新的CI版本偏好设置中已经支持了,目前count<5的tag会暂时忽略,减小一些存储量。