소스 정보
- 저장소
- ThomasMoreAI/legal-skills-open
- 최근 소스 활동
- 2026년 6월 1일 17:27
- 감지된 SKILL.md 언어
- 영어
- 스타
- 40
- 포크
- 4
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/ThomasMoreAI/legal-skills-open --skill patent-analysis-guide명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
| name | patent-analysis-guide |
| title | Patent Analysis Guide |
| description | Patent search, classification, landscape analysis, and prior art mining |
| author | wentorai |
| author_url | https://github.com/wentorai/research-plugins/tree/main/skills/domains/law/patent-analysis-guide |
| license | MIT |
| version | 0.1.0 |
| execution_mode | open |
| jurisdiction | general |
| practice | ip |
| language | en |
A skill for conducting patent research, landscape analysis, and prior art searches. Covers patent database APIs, classification systems, citation network analysis, claim parsing, and technology trend mapping for intellectual property research.
| Database | Coverage | API | Cost |
|---|---|---|---|
| USPTO PatentsView | US patents and applications | REST API, bulk download | Free |
| EPO Open Patent Services | EP, WO, and 100+ offices | REST API (OPS) | Free (throttled) |
| Google Patents | 120M+ documents worldwide | BigQuery (Google Patents Public) | Free (BigQuery costs) |
| Lens.org | 130M+ patent records | REST API | Free for researchers |
| WIPO PATENTSCOPE | PCT applications + national | REST API | Free |
import requests
import xml.etree.ElementTree as ET
class EPOClient:
"""Client for the EPO Open Patent Services (OPS) API."""
BASE_URL = "https://ops.epo.org/3.2/rest-services"
def __init__(self, consumer_key: str, consumer_secret: str):
self.token = self._authenticate(consumer_key, consumer_secret)
def _authenticate(self, key: str, secret: str) -> str:
import base64
credentials = base64.b64encode(f"{key}:{secret}".encode()).decode()
resp = requests.post(
,
headers={: },
data={: },
)
resp.json()[]
() -> []:
resp = requests.get(
,
headers={: ,
: },
params={: cql_query, : },
)
resp.json()
The CPC hierarchy has five levels: Section > Class > Subclass > Group > Subgroup.
Example: H04L 9/3247
H = Electricity (Section)
H04 = Electric communication technique (Class)
H04L = Transmission of digital information (Subclass)
H04L 9/ = Cryptographic mechanisms (Group)
H04L 9/3247 = Digital signatures (Subgroup)
def parse_cpc_code(code: str) -> dict:
"""Parse a CPC classification code into its hierarchical components."""
code = code.strip().replace(" ", "")
return {
"section": code[0],
"class": code[:3],
"subclass": code[:4],
"group": code.split("/")[0] if "/" in code else code[:4],
"subgroup": code if "/" in code else None,
"full": code,
}
# Technology domain mapping (top-level CPC sections)
CPC_SECTIONS = {
"A": "Human Necessities",
"B": "Performing Operations; Transporting",
"C": "Chemistry; Metallurgy",
"D": "Textiles; Paper",
"E": "Fixed Constructions",
"F": "Mechanical Engineering; Lighting; Heating",
"G": "Physics",
"H": "Electricity",
"Y": "General Tagging of New Technological Developments",
}
A patent landscape maps the technology and competitive environment in a domain:
import pandas as pd
import numpy as np
from collections import Counter
def patent_landscape_metrics(patents: pd.DataFrame) -> dict:
"""
Compute patent landscape metrics from a patent dataset.
Expected columns: patent_id, filing_date, grant_date,
assignee, cpc_codes (list), claims_count, citations_received
"""
# Filing trend (annual)
patents["filing_year"] = pd.to_datetime(patents.filing_date).dt.year
annual_filings = patents.groupby("filing_year").size()
# Top assignees
top_assignees = patents.assignee.value_counts().head(20)
# Technology distribution (CPC subclass level)
all_cpc = []
for codes in patents.cpc_codes:
all_cpc.extend([c[:4] for c in codes])
cpc_distribution = Counter(all_cpc).most_common(20)
# Citation impact
citation_stats = patents.citations_received.describe()
# Geographic distribution (from assignee country)
geo_dist = patents.assignee_country.value_counts()
return {
"total_patents": len(patents),
"annual_filings": annual_filings.to_dict(),
"top_assignees": top_assignees.to_dict(),
"technology_areas": cpc_distribution,
"citation_stats": citation_stats.to_dict(),
"geographic_distribution": geo_dist.head(10).to_dict(),
}
import networkx as nx
def build_citation_network(patents: pd.DataFrame,
citations: pd.DataFrame) -> nx.DiGraph:
"""
Build a patent citation network.
citations: DataFrame with columns [citing_patent, cited_patent]
"""
G = nx.DiGraph()
# Add patent nodes with attributes
for _, row in patents.iterrows():
G.add_node(row.patent_id, assignee=row.assignee,
year=row.filing_year, cpc=row.cpc_codes[0][:4])
# Add citation edges
for _, row in citations.iterrows():
if row.citing_patent in G and row.cited_patent in G:
G.add_edge(row.citing_patent, row.cited_patent)
return G
def identify_seminal_patents(G: nx.DiGraph, top_n: int = 20) -> list:
"""Find the most influential patents by various centrality measures."""
in_degree = dict(G.in_degree())
pagerank = nx.pagerank(G)
# Combine metrics
scores = {}
for node in G.nodes():
scores[node] = {
"citations_received": in_degree[node],
"pagerank": pagerank[node],
}
ranked = sorted(scores.items(), key=lambda x: x[1]["pagerank"], reverse=True)
return ranked[:top_n]
Patent claims define the legal scope of protection. Independent claims are the broadest; dependent claims narrow them:
def parse_claims(claims_text: str) -> list[dict]:
"""
Parse patent claims text into structured claim objects.
Identifies independent vs dependent claims and extracts dependencies.
"""
# Split on claim numbers
claim_pattern = re.compile(r"\n\s*(\d+)\.\s+", re.MULTILINE)
parts = claim_pattern.split(claims_text)
claims = []
for i in range(1, len(parts), 2):
claim_num = int(parts[i])
claim_text = parts[i + 1].strip()
# Detect dependency
dep_match = re.match(
r"(?:The|A)\s+\w+\s+(?:of|according to)\s+claim\s+(\d+)",
claim_text, re.IGNORECASE
)
is_independent = dep_match is None
depends_on = int(dep_match.group(1)) if dep_match else None
claims.append({
"number": claim_num,
"text": claim_text,
"independent": is_independent,
"depends_on": depends_on,
"word_count": len(claim_text.split()),
})
return claims
Systematic prior art search methodology:
SOC 직업 분류 기준