HyperTag
HyperTag为您的所有文件提供了一个表达性强的标签系统和强大的语义搜索引擎。使用标签来表示您的思维方式。通过语义搜索查找您的文本文档(是的,甚至包括PDF)和图像。与其他现有的文件组织工具不同,HyperTag不引入专有文件格式,而是无缝地覆盖在您现有的文件之上,毫不费力。
目标:最小化从产生想法到访问所有相关文件之间的时间。
目录
安装
可在PyPI上获取
$ pip install hypertag
(同时支持仅CPU和CUDA加速执行!)
交流
通过Twitter @SeanPedersen96联系我
概述
HyperTag提供了一个简洁的CLI,但更重要的是,它创建了一个名为HyperTagFS
的目录,这是一个基于文件系统的表示,使用符号链接和目录来表示您的文件和标签。
HyperTag WebApp(实验性):一个简洁的HTML+JS客户端。在HyperTag引擎的支持下,几秒钟内可视化、结构化和搜索您的个人文件。
目录导入:使用$ hypertag import path/to/directory
导入您现有的目录层次结构。HyperTag自动将其转换为使用元标签的标签层次结构。
语义文本和图像搜索(实验性):使用简单的文本查询搜索图像(jpg、png)和文本文档(是的,甚至包括PDF)内容。文本搜索由出色的Sentence Transformers库提供支持。文本到图像搜索由OpenAI的CLIP模型提供支持。目前仅支持英语查询。
HyperTag守护进程(实验性):监视HyperTagFS
和添加到自动导入列表的目录,以检测用户更改(请参阅下面的"启动HyperTag守护进程"部分)。还会启动DaemonService,显著加快语义搜索速度(警告:守护进程占用大量RAM,约2GB)。
模糊匹配查询:HyperTag使用模糊匹配来最小化在不太可能出现拼写错误的情况下的摩擦。
文件类型分组:HyperTag自动创建包含常见文件的文件夹(例如,图像:jpg、png等,文档:txt、pdf等,源代码:py、js等),这些文件夹可以在HyperTagFS
中找到。
HyperTag图:快速概览您的HyperTag图!HyperTag在每次更改时都会可视化元标签图,并将其保存在HyperTagFS/hypertag-graph.pdf
中。
CLI功能
WebApp(实验性)
在localhost:23236上启动HyperTag Web客户端的HTTP服务器
$ python3 -m hypertag.webapi
递归导入现有目录
导入文件,并根据现有目录层次结构推断标签。
$ hypertag import path/to/directory
手动添加文件或URL
$ hypertag add path/to/file https://github.com/SeanPedersen/HyperTag
为文件添加标签(带值)
手动为文件添加标签。快捷方式:$ hypertag t
$ hypertag tag humans/*.txt with human "Homo Sapiens"
为文件的标签添加值:
$ hypertag tag sean.txt with name="Sean Pedersen"
移除文件标签
手动从文件中移除标签。
$ hypertag untag humans/*.txt with human "Homo Sapiens"
为标签添加标签
为标签添加元标签以创建标签层次结构。快捷方式:$ hypertag tt
$ hypertag metatag human with animal
合并标签
将标签A的所有关联(文件和标签)合并到标签B中。
$ hypertag merge human into "Homo Sapiens"
使用集合理论进行查询
打印匹配查询结果集的文件名。查询由标签(带值)和操作符组成。标签进行模糊匹配以提供便利。目前不支持嵌套,查询从左到右评估。
快捷方式:$ hypertag q
使用通配符进行带值查询:$ hypertag query name="Sean*"
打印路径:$ hypertag query human --path
打印模糊匹配的标签:$ hypertag query man --verbose
禁用模糊匹配:$ hypertag query human --fuzzy=0
默认操作符是AND(交集):
$ hypertag query human name="Sean*"
等同于 $ hypertag query human and name="Sean*"
OR(并集):
$ hypertag query human or "Homo Sapiens"
MINUS(差集):
$ hypertag query human minus "Homo Sapiens"
索引支持的图像和文本文件
只有被索引的文件才能被搜索。
$ hypertag index
要解析甚至无法解析的PDF,请安装tesseract:# pacman -S tesseract tesseract-data-eng
仅索引图像文件:$ hypertag index --image
仅索引文本文件:$ hypertag index --text
文本文件语义搜索
结合语义和标记匹配搜索的自定义搜索算法。
打印按匹配分数排序的文本文件名。
运行HyperTag守护进程可显著提高性能。
快捷方式:$ hypertag s
$ hypertag search "your important text query" --path --score --top_k=10
图像文件语义搜索
打印按匹配分数排序的图像文件名。
运行HyperTag守护进程可显著提高性能。
快捷方式:$ hypertag si
文本到图像:
$ hypertag search_image "your image content description" --path --score --top_k=10
图像到图像:
$ hypertag search_image "path/to/image.jpg" --path --score --top_k=10
启动HyperTag守护进程
启动具有三重功能的守护进程:
- 监视
HyperTagFS
目录的用户更改- 将文件(符号链接)和目录删除映射到标签/元标签的移除
- 在创建目录时:将名称解释为集合理论标签查询,并自动填充结果
- 在
Search Images
或Search Texts
中创建目录时:将名称解释为语义搜索查询(添加top_k=42以限制结果大小),并自动填充结果
- 监视自动导入列表中的目录以检测用户更改:
- 将文件更改(移动和重命名)映射到数据库
- 在创建文件时:添加新文件并推断标签,并自动索引(如果是支持的文件格式)
- 启动DaemonService以加载和公开用于语义搜索的模型,显著加快搜索速度
$ hypertag daemon
打印文件的所有标签
$ hypertag tags filename1 filename2
打印标签的所有元标签
$ hypertag metatags tag1 tag2
打印所有标签
$ hypertag show
打印所有文件
打印文件名:
$ hypertag show files
打印路径:
$ hypertag show files --path
可视化HyperTag图
可视化元标签图层次结构(保存在HyperTagFS根目录)。
$ hypertag graph
指定布局算法(默认:fruchterman_reingold):
$ hypertag graph --layout=kamada_kawai
生成HyperTagFS
基于文件和标签使用符号链接和目录生成文件系统表示。
$ hypertag mount
将目录添加到自动导入列表
添加到自动导入列表的目录将由守护进程监控新文件或更改。
$ hypertag add_auto_import_dir path/to/directory
设置HyperTagFS目录路径
默认为用户的主目录。
$ hypertag set_hypertagfs_dir path/to/directory
架构
- Python及其充满活力的开源社区为HyperTag提供支持
- 许多其他优秀的开源项目使HyperTag成为可能(列在
pyproject.toml
中) - SQLite3用作元数据存储引擎(位于
~/.config/hypertag/hypertag.db
) - 添加的URL保存在
~/.config/hypertag/web_pages
(网站)或~/.config/hypertag/downloads
(其他)中 - 使用符号链接创建HyperTagFS目录结构
- 语义搜索:使用hnswlib进行增强
- 文本到文本搜索由DistilBERT提供支持
- 文本到图像和图像到图像搜索由OpenAI的CLIP模型提供支持
开发
- 在此处查找优先级问题:待办事项列表
- 选择一个问题,并在开始之前评论你计划如何解决,以确保不浪费开发时间。
- 克隆仓库:
$ git clone https://github.com/SeanPedersen/HyperTag.git
$ cd HyperTag/
- 安装Poetry
- 安装依赖:
$ poetry install
- 激活虚拟环境:
$ poetry shell
- 运行所有测试:
$ pytest -v
- 运行格式化工具:
$ black hypertag/
- 运行代码检查:
$ flake8
- 运行类型检查:
$ mypy hypertag --no-namespace-packages
- 运行安全检查:
$ bandit --exclude tests/ -r .
- Codacy:仪表板
- 运行HyperTag:
$ python -m hypertag
灵感来源
HyperTag存在的意义是什么? HyperTag提供了许多独特功能,如导入、语义搜索、图形化和模糊匹配功能,使其使用非常方便。同时,HyperTag的代码库保持相对较小,不到2000行代码,与类似项目如TMSU(Go语言超过10,000行代码)和SuperTag(Rust语言超过25,000行代码)相比,更易于修改。
语义搜索替代方案