semvec/pypi-packages huggingface dataset:
jayden-opensearch-retriever 0.1.1
OpenSearch 기반 검색 및 검색 결과 검색 도구
Requires Python: >=3.8
Keywords: opensearch, search, retriever, elasticsearch

# OpenSearch 벡터 검색 리트리버

OpenSearch 기반 부모-자식 문서 벡터 검색 도구입니다.

## 기능

- OpenSearch 클러스터에 연결
- 임베딩 벡터를 이용한 유사도 검색
- 부모-자식 관계의 문서 검색 (Child 인덱스에서 검색 후 Parent 문서 반환)
- 쿼리 임베딩 생성

## 설치 방법

### 1. 개발 설치 (로컬 개발용)

```bash
# 저장소 클론
git clone https://github.com/nxtcloud-org/opensearch_retriever
cd opensearch-retriever

# 가상환경 생성 (권장)
python -m venv venv
source venv/bin/activate  # Linux/Mac
# venv\Scripts\activate  # Windows

# 개발 모드로 설치
pip install -e .

# 또는 개발 의존성과 함께 설치
pip install -e ".[dev]"
```

### 2. PyPI 설치 (배포 후)

```bash
pip install opensearch-retriever
```

### 3. requirements.txt에서 설치

```bash
pip install -r requirements.txt
```

## 사용법

### 기본 설정

```python
from opensearch_retriever import ParentChildRetriever
from langchain_core.embeddings import Embeddings

# 임베딩 모델 준비 (예: HuggingFace, OpenAI 등)
# embedding_model = YourEmbeddingModel()

# ParentChildRetriever 초기화
retriever = ParentChildRetriever(
    host="localhost",
    port=9200,
    username="admin",  # 선택사항
    password="admin",  # 선택사항
    use_ssl=False,
    verify_certs=True,
    embedding_model=embedding_model
)
```

### 벡터 검색

```python
# 부모-자식 관계 문서 벡터 검색
results = retriever.vector_search(
    child_index="child-documents",    # 자식 문서 인덱스 (벡터 검색 대상)
    parent_index="parent-documents",  # 부모 문서 인덱스 (결과 반환 대상)
    query="검색할 질문이나 내용",
    k=3,        # 벡터 검색에서 고려할 상위 문서 수
    fields=["title", "content"]  # 선택사항
)

# 검색 결과 처리
for document in results:
    print(f"문서 내용: {document}")
```

### 쿼리 임베딩

```python
# 쿼리를 벡터로 변환
query_vector = retriever.embed_query("임베딩할 텍스트")
print(f"임베딩 벡터 차원: {len(query_vector)}")
```

## 인덱스 구조

이 도구는 부모-자식 관계의 문서 구조를 가정합니다:

### Child 인덱스 (벡터 검색용)
```json
{
  "vector": [0.1, 0.2, 0.3, ...],  // 임베딩 벡터
  "metadata": {
    "parent_id": "parent_doc_1",    // 부모 문서 ID
    "chunk_id": "chunk_1"           // 청크 ID
  },
  "content": "실제 텍스트 내용"
}
```

### Parent 인덱스 (결과 반환용)
```json
{
  "title": "문서 제목",
  "content": "전체 문서 내용",
  "metadata": {
    "source": "파일 경로",
    "created_at": "2024-01-01"
  }
}
```

## 검색 과정

1. **쿼리 임베딩**: 입력된 쿼리를 벡터로 변환
2. **벡터 검색**: Child 인덱스에서 KNN 검색 수행
3. **부모 ID 추출**: 검색된 child 문서들에서 parent_id 수집
4. **부모 문서 조회**: Parent 인덱스에서 해당 부모 문서들을 조회
5. **결과 반환**: 최종 부모 문서들을 리스트로 반환

## 개발 환경 설정

### 의존성 설치

```bash
# 개발 의존성 설치
pip install -e ".[dev]"

# 또는 개별 설치
pip install pytest pytest-cov black flake8 mypy pre-commit
```

### 테스트 실행

```bash
# 모든 테스트 실행
pytest

# 특정 테스트 파일 실행
pytest tests/test_retriever.py

# 커버리지와 함께 테스트 실행
pytest --cov=opensearch_retriever
```

## 패키지 빌드 및 배포

### 패키지 빌드

```bash
# 빌드 도구 설치
pip install build

# 패키지 빌드
python -m build
```

### PyPI 배포

```bash
# 배포 도구 설치
pip install twine

# TestPyPI에 배포 (테스트용)
twine upload --repository testpypi dist/*

# 실제 PyPI에 배포
twine upload dist/*
```

## 요구사항

- Python >= 3.9
- requests >= 2.25.0
- opensearch-py >= 2.0.0
- langchain-core (임베딩 모델용)

## 주의사항

- 임베딩 모델(`embedding_model`)을 반드시 제공해야 합니다
- Child 인덱스에는 벡터 필드와 parent_id 메타데이터가 필요합니다
- Parent 인덱스는 실제 문서 내용을 담고 있어야 합니다
- OpenSearch에서 KNN 검색이 활성화되어 있어야 합니다
cryptanalysis-tools 0.1.1
sm crypto or more, cryptanalysis tools, toys
Requires Python: >=3.12

> :warning: **警告**
> 
> 本项目仅作个人学习使用，不可用于生产环境，否则后果自负。
> 
> This library is only for learning purposes and can ```not``` be used in ```production``` environments. Otherwise, you will be at your own risk.

> :memo: **可参考 tests 中的使用方法**

# Crypto
## SM2
### sign
> **SM2的裸签名，类似ECC，直接用这个签名不符合国标要求，除非自己特意构造的**
> **data即e，没有预处理计算ZA操作，没有SM3，因为在底下的sm2_sm3中有，**
```python
sign(self, data: bytes, private_key: int, k: int | None = None)
```

### verify
```python
verify(self, signature: asn1_str, data: bytes, public_key: Tuple[int, int])
```

### compute_ZA
```python
compute_ZA(self, public_key: Tuple[int, int], ID: str | None = None)
```

### sign_with_sm3
> **符合国标的签名**
> **SM2真正的签名对象如下**
> **tobesign = sm3.hash(ZA + data)， ZA = compute_ZA(public_key, ID)**
```python
sign_with_sm3(self, data: bytes, private_key: int, public_key: Tuple[int, int], ID: str | None = None, randomk: int | None = None)
```

### verify_with_sm3
```python
verify_with_sm3(self, signature: asn1_str, data: bytes, public_key: Tuple[int, int], ID: str | None = None)
```

### encrypt
```python
encrypt(self, msg: bytes, public_key: Tuple[int, int], k: int | None = None)
```

### decrypt
```python
decrypt(self, cipher_txt: asn1_str, private_key: int)
```

### recover_privateKey_by_kAndrs
> **已知秘密随机数k，一组r，s（即签名值）,可恢复sm2私钥。**
```python
recover_privateKey_by_kAndrs(self, k: int, r: int, s: int)
```

### recover_privateKey_by_fixedk_and_2rs
> **无需知道k的具体值，但知道k是固定值，通过两组rs（即签名值），可恢复sm2私钥。**
```python
recover_privateKey_by_fixedk_and_2rs(self, r1: int, s1: int, r2: int, s2: int)
```

### recover_publicKeys_by_eAndrs
> **纯数学公式计算，知道一组签名值rs与e的值，可恢复公钥，满足条件的公钥可能存在多个。e可能是原消息m，或者是经过hash预处理的e，具体看怎么签的名**
```python
recover_publicKeys_by_eAndrs(self, e: int, r: int, s: int)
```

### is_same_k
```python
is_same_k(self, r1, e1, r2, e2)
```

### recover_private_key_by_liner_k
> **如果k的随机性是线性的，k2 = ak1 + bG，且知道线性参数，可通过两组rs，恢复sm2私钥，故固定k是一种特殊情况**
```python
recover_private_key_by_liner_k(self, r1: int, s1: int, r2: int, s2: int, a: int, b: int)
```

### forge_e_signature
> **纯数学公式计算，t是 r + s，伪造e的签名，说是伪造其实是恢复e而已，已知一组签名值rs及公钥，计算对哪个e进行签名。故可以随机产生一组r，s，然后计算得到一个e，使得验签通过**
```python
forge_e_signature(self, public_key: Tuple[int, int], s: int, t: int)
```

## SM3
### hash
> **sm3的hash方法，有点想把str输入移除了**
```python
hash(msg: bytes | str) -> bytes
```

## SM4
> **纯SM4算法加解密实现，不涉及工作模式，所以不存在IV与Padding值**
> **分组密码自身只能加密长度等于密码分组长度的单块数据**
### encrypt
```python
encrypt(plaintext: bytes, key: bytes) -> bytes
```

### decrypt
```python
decrypt(cipher: bytes, key: bytes) -> bytes
```

## utils
### kdf
> **密钥派生函数**

### rotl
> **将x循环左移n位**
```python
rotl(x, n)
```

### types
```python
asn1_str = NewType("asn1_str", str)
base64_str = NewType("base64_str", str)
hex_str = NewType("hex_str", str)
```

# TODO :dart:
- [ ] sm2协同签名
- [ ] CBC-MAC不定长攻击
- [ ] M-D 结构 hash 长度拓展攻击
- [ ] padding oracle 填充攻击
smart-pinyin 0.5.1
Smart Chinese-to-Pinyin converter.
Requires Python: >=3.10

Pinyin
------

Smart Chinese-to-Pinyin converter.

fork from https://github.com/mapix/Pinyin

Getting Started
---------------

    pip install smart_pinyin

Usage
-----

    >>> from pinyin import Pinyin
    >>> pinyin = Pinyin()
    >>> ' '.join(pinyin.get_pinyin('银行行长潘玮柏长了一头乌黑的白发， 睡觉睡的很晚, 道行很深', failure=''))
    >>> u'yin hang hang zhang pan wei bo zhang le yi tou wu hei de bai fa  shui jiao shui de hen wan  dao heng hen shen'
    
    >>> for i in pinyin.get_pinyin_all('自行车'): print list(i)
    [u'zi', u'hang', u'che']
    [u'zi', u'hang', u'ju']
    [u'zi', u'heng', u'che']
    [u'zi', u'heng', u'ju']
    [u'zi', u'xing', u'che']
    [u'zi', u'xing', u'ju']