{"id":2817,"date":"2026-02-03T16:04:53","date_gmt":"2026-02-03T07:04:53","guid":{"rendered":"https:\/\/www.insilico.jp\/blog\/?p=2817"},"modified":"2026-03-26T13:57:21","modified_gmt":"2026-03-26T04:57:21","slug":"smarts-rx","status":"publish","type":"post","link":"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/","title":{"rendered":"SMARTS-RX\u306b\u3088\u308b\u53cd\u5fdc\u6027\u89e3\u6790\u306e\u305f\u3081\u306e\u5b98\u80fd\u57fa\u30de\u30c3\u30d4\u30f3\u30b0"},"content":{"rendered":"\n<p>\u7406\u8ad6\u5275\u85ac\u7814\u7a76\u6240\u306e\u91d1\u5b50\u4fe1\u4eba\u3067\u3059\u3002<br>\u4eca\u56de\u306fSMILES\u3092\u3082\u3068\u306b\u5206\u5b50\u306e\u53cd\u5fdc\u6027\u3092\u4e88\u6e2c\u3059\u308b\u305f\u3081\u306e\u5b98\u80fd\u57fa\u60c5\u5831\u3092\u30de\u30c3\u30d4\u30f3\u30b0\u3059\u308bSMARTS-RX\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u53c2\u8003\u8ad6\u6587<br>SMARTS-RX: a SMARTS-based representation of chemical functions for reactivity analysis<br>\uff08Thierry Kogej, Christos Kannas, Samuel Genheden, Eike Caldeweyher &amp; Mikhail Kabeshov, <em>Journal of Cheminformatics<\/em>, <strong>2025<\/strong>, <em>17<\/em>, 177.\uff09<br><a href=\"https:\/\/doi.org\/10.1186\/s13321-025-01136-8\">https:\/\/doi.org\/10.1186\/s13321-025-01136-8<\/a><\/p>\n\n\n\n<p>SMILES\uff08Simplified Molecular Input Line Entry System\uff09\u306f\u5206\u5b50\u69cb\u9020\u3092\u6587\u5b57\u5217\u3068\u3057\u3066\u8868\u8a18\u3059\u308b\u65b9\u6cd5\u306e\u4e00\u3064\u3067\u3059\u304c\u3001\u539f\u5b50\u540c\u58eb\u306e\u96a3\u63a5\u95a2\u4fc2\u3068\u7d50\u5408\u6b21\u6570\u306e\u307f\u3067\u8868\u8a18\u3055\u308c\u307e\u3059\u3002\u3057\u304b\u3057\u306a\u304c\u3089\u3001\u5408\u6210\u53cd\u5fdc\u306b\u304a\u3051\u308b\u53cd\u5fdc\u6027\u306e\u8a55\u4fa1\u3067\u306f\u5b98\u80fd\u57fa\u304c\u3069\u306e\u3088\u3046\u306a\u4f4d\u7f6e\u95a2\u4fc2\u306b\u3042\u308b\u304b\u3067\u53cd\u5fdc\u6027\u304c\u5927\u304d\u304f\u5909\u308f\u3063\u3066\u304d\u307e\u3059\u3002\u305d\u3053\u3067SMILES\u306b\u3088\u308a\u591a\u304f\u306e\u60c5\u5831\u3092\u8a18\u8f09\u3067\u304d\u308b\u3088\u3046\u306b\u62e1\u5f35\u3057\u305f\u3082\u306e\u304cSMARTS\uff08SMiles ARbitrary Target Specificaion\uff09\u3067\u3042\u308a\u3001\u90e8\u5206\u69cb\u9020\u691c\u7d22\u306a\u3069\u3067\u7528\u3044\u3089\u308c\u3066\u3044\u307e\u3059\u3002\u4eca\u56de\u7d39\u4ecb\u3059\u308bSMARTS-RX\u306fSMARTS\u3092\u30d9\u30fc\u30b9\u306b\u5b98\u80fd\u57fa\u3092\u8a73\u7d30\u306b\u5206\u985e\u3057\u3001\u53cd\u5fdc\u89e3\u6790\u306b\u6d3b\u7528\u3059\u308b\u3068\u3044\u3046\u3082\u306e\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u52d5\u4f5c\u74b0\u5883<br>Intel Core i7-1265U<br>Windows 11 Pro<br>conda 25.7.0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SMARTS-RX\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h2>\n\n\n\n<p>Python\u306e\u4eee\u60f3\u74b0\u5883\u3092\u4f5c\u6210\u3057\u3001SMARTS-RX\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<br>\u63a8\u5968\u74b0\u5883\u3068\u3057\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u308bPython 3.10\u3067\u4eee\u60f3\u74b0\u5883\u3092\u4f5c\u6210\u3057\u3001poetry\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<br>\u307e\u305f\u3001\u5f8c\u7a0b\u4f7f\u7528\u3059\u308b\u306e\u3067pandas\u3082\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u304a\u304d\u307e\u3059\u3002<br>git clone\u3057\u305f\u30d5\u30a9\u30eb\u30c0\u304b\u3089poetry\u3067SMARTS-RX\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3057\u305f\u3002<br>\u6700\u5f8c\u306b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210\u3057\u3066\u5b8c\u4e86\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ conda create -n smartsrx python=3.10 -y\n$ conda activate smartsrx\n$ conda install poetry=2.1.3 pandas\n$ git clone https:\/\/github.com\/MolecularAI\/smartsrx.git\n$ cd smartsrx\n$ poetry install\n$ python -m smartsrx.create_json<\/code><\/pre>\n\n\n\n<p>\u6b63\u3057\u304f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308c\u3070Database created successfully!\u3068\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SMARTS-RX\u306e\u5b9f\u884c<\/h2>\n\n\n\n<p>SMARTS-RX\u306fRDKit\u306eHasSubstructMatch\u307e\u305f\u306fGetSubstructMatches\u95a2\u6570\u3092\u4f7f\u3063\u3066\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002<br>\u4f5c\u6210\u3057\u305f\u4ee5\u4e0b\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u3092smartsrx.py\u3068\u3057\u3066\u4fdd\u5b58\u3057\u3001\u5b9f\u884c\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import json\nimport os\nfrom rdkit import Chem\nfrom smartsrx import ReactiveFunctionDatabase\n\ndef load_database(json_path='smartsrx.json'):\n    \"\"\"JSON\u304b\u3089\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u8aad\u307f\u8fbc\u3080\"\"\"\n    if not os.path.exists(json_path):\n        raise FileNotFoundError(f\"{json_path} \u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002'python -m smartsrx.create_json' \u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002\")\n    \n    with open(json_path, 'r', encoding='utf-8') as f:\n        data = json.load(f)\n    \n    return ReactiveFunctionDatabase(**data)\n\ndef get_molecule_class(mol, db):\n    \"\"\"\n    RDKit\u306e\u5206\u5b50(mol)\u306b\u5bfe\u3057\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u5185\u306e\u5168SMARTS\u3092\u9069\u7528\u3057\u3001\u30de\u30c3\u30c1\u3057\u305f\u5b98\u80fd\u57fa(ReactiveFunction)\u306e\u30ea\u30b9\u30c8\u3092\u8fd4\u3059\n    \"\"\"\n    matches = &#091;]\n    \n    # \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u5185\u306e\u5168\u5b9a\u7fa9(data\u30ea\u30b9\u30c8)\u3092\u8d70\u67fb\n    for entry in db.data:\n        if not entry.smarts:\n            continue\n            \n        # SMARTS\u30d1\u30bf\u30fc\u30f3\u3092\u4f5c\u6210\n        pattern = Chem.MolFromSmarts(entry.smarts)\n        \n        # RDKit\u3067\u90e8\u5206\u69cb\u9020\u30de\u30c3\u30c1\u30f3\u30b0\u5224\u5b9a\n        if pattern and mol.HasSubstructMatch(pattern):\n            matches.append(entry)\n            \n    return matches\n\n# \u30e1\u30a4\u30f3\u51e6\u7406\nif __name__ == \"__main__\":\n    # 1. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30ed\u30fc\u30c9\n    try:\n        db = load_database()\n        print(f\"Database loaded (Version: {db.version})\")\n        print(f\"Total definitions: {len(db.data)}\")\n    except Exception as e:\n        print(f\"Error loading database: {e}\")\n        exit()\n\n    # 2. \u5224\u5b9a\u3057\u305f\u3044\u5206\u5b50\n    smiles_list = &#091;\n        (\"Benzoic Acid\", \"c1ccccc1C(=O)O\"),  # \u82b3\u9999\u65cf\u30ab\u30eb\u30dc\u30f3\u9178\n        (\"Ethanol\", \"CCO\"),                  # \u7b2c\u4e00\u7d1a\u30a2\u30eb\u30b3\u30fc\u30eb\n        (\"Acetone\", \"CC(=O)C\")               # \u30b1\u30c8\u30f3    \n        ]\n\n    for name, smiles in smiles_list:\n        print(f\"\\n--- Analyzing: {name} ({smiles}) ---\")\n        mol = Chem.MolFromSmiles(smiles)\n        \n        if not mol:\n            print(\"Invalid SMILES\")\n            continue\n\n        # \u5b98\u80fd\u57fa\u3092\u53d6\u5f97\n        found_roles = get_molecule_class(mol, db)\n        \n        if found_roles:\n            for role in found_roles:\n                # \u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306b\u3042\u308b\u5c5e\u6027\u540d\u3092\u4f7f\u3063\u3066\u8868\u793a\n                print(f\"MATCH FOUND:\")\n                print(f\"  Class    : {role.category}\")\n                print(f\"  Subclass : {role.subcategory}\")\n                print(f\"  SMARTS-RX : {role.specific_type}\")\n                print(f\"  SMARTS      : {role.smarts}\")\n        else:\n            print(\"No reactive classs found.\")<\/code><\/pre>\n\n\n\n<p>\u5b9f\u884c\u7d50\u679c\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u8868\u793a\u3055\u308c\u307e\u3059\u3002<br>\u305d\u308c\u305e\u308c\u306e\u5316\u5408\u7269\u306b\u3064\u3044\u3066\u30d2\u30c3\u30c8\u3057\u305fClass, Subclass, SMARTS-RX\u3068\u8a72\u5f53\u3059\u308b\u539f\u5b50\u306eSMARTS\u304c\u8fd4\u3055\u308c\u307e\u3059\u3002<br>\u5b89\u606f\u9999\u9178\u306f\u82b3\u9999\u65cf\u30ab\u30eb\u30dc\u30f3\u9178\u3001\u30a8\u30bf\u30ce\u30fc\u30eb\u306f\u7b2c\u4e00\u7d1a\u30a2\u30eb\u30b3\u30fc\u30eb\u3001\u30a2\u30bb\u30c8\u30f3\u306f\u30b1\u30c8\u30f3\u3068\u3057\u3066\u8a8d\u8b58\u3055\u308c\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Database loaded (Version: 1.0.0)\nTotal definitions: 406\n\n--- Analyzing: Benzoic Acid (c1ccccc1C(=O)O) ---\nMATCH FOUND:\n  Class    : Acid\n  Subclass : Acid_Aromatic\n  SMARTS-RX : Acid_Aromatic\n  SMARTS      : &#091;O;D1;$(OC(=O)&#091;c;$(c1ccccc1)])]\n\n--- Analyzing: Ethanol (CCO) ---\nMATCH FOUND:\n  Class    : Alcohol\n  Subclass : PrimaryAlcoholAliphatic\n  SMARTS-RX : PrimaryAlcoholAliphatic\n  SMARTS      : &#091;O;H1;D1;$(O&#091;C;D2,D1;!$(C&#091;a])]);!$(OC=*);!$(OC#*)]\n\n--- Analyzing: Acetone (CC(=O)C) ---\nMATCH FOUND:\n  Class    : Ketone\n  Subclass : KetoneAliphaticAcyclic\n  SMARTS-RX : KetoneAliphaticAcyclic\n  SMARTS      : &#091;#6;!R;$(&#091;#6;D3;$(&#091;#6](=O)(&#091;#6;A;!$(*=*)])&#091;#6;A;!$(*=*)])]);!$(&#091;#6](=O)&#091;C;D2]&#091;F,Cl,Br,I,$(OS(=O)(=O)C(F)(F)F)])]<\/code><\/pre>\n\n\n\n<p>\u7d9a\u3044\u3066\u3001csv\u304b\u3089SMILES\u3092\u53d6\u5f97\u3057\u3001\u4efb\u610f\u306e\u5b98\u80fd\u57fa\u3092\u6709\u3059\u308b\u5316\u5408\u7269\u3092\u62bd\u51fa\u3059\u308b\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002<br>input.csv\u3092\u4ee5\u4e0b\u306e\u30c7\u30fc\u30bf\u3068\u3057\u3066\u5b9f\u884c\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>ID<\/td><td>SMILES<\/td><\/tr><tr><td>1<\/td><td>CCO<\/td><\/tr><tr><td>2<\/td><td>c1ccccc1C(=O)O<\/td><\/tr><tr><td>3<\/td><td>CC(=O)C<\/td><\/tr><tr><td>4<\/td><td>CC(C)O<\/td><\/tr><tr><td>5<\/td><td>CC(C)(C)O<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>import pandas as pd\nimport json\nimport os\nfrom rdkit import Chem\nfrom smartsrx import ReactiveFunctionDatabase\n\nJSON_DB_PATH = 'smartsrx.json'\nINPUT_CSV = 'input.csv'\nOUTPUT_CSV = 'output.csv'\n\ndef load_database(json_path):\n    \"\"\"\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9JSON\u3092\u8aad\u307f\u8fbc\u3080\"\"\"\n    if not os.path.exists(json_path):\n        print(f\"\u30a8\u30e9\u30fc: {json_path} \u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\")\n        print(\"'python -m smartsrx.create_json' \u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002\")\n        return None\n    \n    with open(json_path, 'r', encoding='utf-8') as f:\n        data = json.load(f)\n    return ReactiveFunctionDatabase(**data)\n\ndef find_matching_class(mol, db):\n    \"\"\"\u5206\u5b50\u306b\u5bfe\u3057\u3066\u30de\u30c3\u30c1\u3059\u308b\u5168\u3066\u306eClass\u30ea\u30b9\u30c8\u3092\u8fd4\u3059\"\"\"\n    matches = &#091;]\n    # db.data \u306f\u30ea\u30b9\u30c8\u5f62\u5f0f\n    for entry in db.data:\n        if not entry.smarts:\n            continue\n        \n        # SMARTS\u30d1\u30bf\u30fc\u30f3\u4f5c\u6210\n        pattern = Chem.MolFromSmarts(entry.smarts)\n        \n        # \u30de\u30c3\u30c1\u30f3\u30b0\u5224\u5b9a\n        if pattern and mol.HasSubstructMatch(pattern):\n            matches.append(entry)\n    return matches\n\ndef main():\n    # 1. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30ed\u30fc\u30c9\n    print(f\"\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 ({JSON_DB_PATH}) \u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059...\")\n    db = load_database(JSON_DB_PATH)\n    if db is None:\n        return\n\n    # 2. \u30e6\u30fc\u30b6\u30fc\u5165\u529b (\u691c\u7d22\u30ad\u30fc\u30ef\u30fc\u30c9)\n    print(\"-\" * 50)\n    query = input(\"\u691c\u7d22\u3057\u305f\u3044 Class \u307e\u305f\u306f Subclass \u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044 (\u90e8\u5206\u4e00\u81f4): \").strip()\n    \n    if not query:\n        print(\"\u691c\u7d22\u30ef\u30fc\u30c9\u304c\u7a7a\u306e\u305f\u3081\u7d42\u4e86\u3057\u307e\u3059\u3002\")\n        return\n    \n    print(f\"\u691c\u7d22\u30ad\u30fc\u30ef\u30fc\u30c9: '{query}' \u3067\u89e3\u6790\u3092\u958b\u59cb\u3057\u307e\u3059...\")\n\n    # 3. CSV\u306e\u8aad\u307f\u8fbc\u307f\n    if not os.path.exists(INPUT_CSV):\n        print(f\"\u30a8\u30e9\u30fc: {INPUT_CSV} \u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\")\n        return\n\n    try:\n        df = pd.read_csv(INPUT_CSV)\n    except Exception as e:\n        print(f\"CSV\u8aad\u307f\u8fbc\u307f\u30a8\u30e9\u30fc: {e}\")\n        return\n\n    # SMILES\u5217\u3092\u7279\u5b9a\u3059\u308b (\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u305b\u305a 'smiles' \u3092\u63a2\u3059\u3001\u306a\u3051\u308c\u30701\u5217\u76ee)\n    smiles_col = None\n    for col in df.columns:\n        if col.lower() == 'smiles':\n            smiles_col = col\n            break\n    \n    if smiles_col is None:\n        smiles_col = df.columns&#091;0] # \u898b\u3064\u304b\u3089\u306a\u3051\u308c\u30701\u5217\u76ee\u3092\u4f7f\u7528\n        print(f\"\u8b66\u544a: 'SMILES'\u3068\u3044\u3046\u5217\u540d\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u30021\u5217\u76ee '{smiles_col}' \u3092\u4f7f\u7528\u3057\u307e\u3059\u3002\")\n\n    # 4. \u89e3\u6790\u3068\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\n    results = &#091;]\n    hit_count = 0\n    total_mols = len(df)\n\n    print(f\"\u5168 {total_mols} \u4ef6\u306e\u5206\u5b50\u3092\u51e6\u7406\u4e2d...\")\n\n    for index, row in df.iterrows():\n        smiles = row&#091;smiles_col]\n        \n        # \u7a7a\u30c7\u30fc\u30bf\u306e\u30b9\u30ad\u30c3\u30d7\n        if pd.isna(smiles) or str(smiles).strip() == \"\":\n            continue\n\n        mol = Chem.MolFromSmiles(str(smiles))\n        if not mol:\n            # print(f\"Invalid SMILES at row {index}: {smiles}\")\n            continue\n\n        # \u5168\u30de\u30c3\u30c1\u3092\u53d6\u5f97\n        all_matches = find_matching_class(mol, db)\n\n        # \u691c\u7d22\u30ad\u30fc\u30ef\u30fc\u30c9\u3067\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\n        for match in all_matches:\n            # \u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u7121\u8996\u3057\u3066\u6bd4\u8f03\n            cat = match.category or \"\"\n            sub = match.subcategory or \"\"\n            spec = match.specific_type or \"\"\n\n            # Class(Category) \u307e\u305f\u306f Subclass(Subcategory) \u306b\u30ad\u30fc\u30ef\u30fc\u30c9\u304c\u542b\u307e\u308c\u308b\u304b\n            if (query.lower() in cat.lower()) or (query.lower() in sub.lower()):\n                \n                # \u7d50\u679c\u30ea\u30b9\u30c8\u306b\u8ffd\u52a0 (\u5143\u306eCSV\u306e\u60c5\u5831 + \u30d2\u30c3\u30c8\u3057\u305f\u89e3\u6790\u60c5\u5831)\n                hit_data = row.to_dict()\n                hit_data&#091;'Matched_Class'] = cat\n                hit_data&#091;'Matched_Subclass'] = sub\n                hit_data&#091;'Matched_SMARTS-RX'] = spec\n                hit_data&#091;'Matched_SMARTS'] = match.smarts\n                \n                results.append(hit_data)\n                hit_count += 1\n\n    # 5. \u7d50\u679c\u306e\u4fdd\u5b58\n    if results:\n        result_df = pd.DataFrame(results)\n        result_df.to_csv(OUTPUT_CSV, index=False, encoding='utf-8-sig')\n        print(\"-\" * 50)\n        print(f\"\u5b8c\u4e86\u3057\u307e\u3057\u305f\uff01\")\n        print(f\"\u30d2\u30c3\u30c8\u4ef6\u6570: {len(results)} \u4ef6\") # 1\u3064\u306e\u5206\u5b50\u3067\u8907\u6570\u30d2\u30c3\u30c8\u3059\u308b\u5834\u5408\u304c\u3042\u308b\u305f\u3081\u884c\u6570\u306f\u5897\u3048\u307e\u3059\n        print(f\"\u7d50\u679c\u3092 '{OUTPUT_CSV}' \u306b\u4fdd\u5b58\u3057\u307e\u3057\u305f\u3002\")\n    else:\n        print(\"-\" * 50)\n        print(f\"\u30ad\u30fc\u30ef\u30fc\u30c9 '{query}' \u306b\u4e00\u81f4\u3059\u308b\u6a5f\u80fd\u3092\u6301\u3064\u5206\u5b50\u306f\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\")\n\nif __name__ == \"__main__\":\n    main()<\/code><\/pre>\n\n\n\n<p>\u4e0a\u8a18\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u5b9f\u884c\u3059\u308b\u3068\u3001\u30b3\u30f3\u30bd\u30fc\u30eb\u4e0a\u3067\u300c\u691c\u7d22\u3057\u305f\u3044 Class \u307e\u305f\u306f Subclass \u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044 (\u90e8\u5206\u4e00\u81f4): \u300d\u3068\u8868\u793a\u3055\u308c\u307e\u3059\u3002&#8221;Alcohol&#8221;\u3068\u5165\u529b\u3059\u308b\u3068output.csv\u306b\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>ID<\/td><td>SMILES<\/td><td>Matched_Class<\/td><td>Matched_Subclass<\/td><td>Matched_SMARTS-RX<\/td><td>Matched_SMARTS<\/td><td>SMARTS<\/td><\/tr><tr><td>1<\/td><td>CCO<\/td><td>Alcohol<\/td><td>PrimaryAlcoholAliphatic<\/td><td>PrimaryAlcoholAliphatic<\/td><td>[O;H1;D1;$(O[C;D2,D1;!$(C[a])]);!$(OC=<em>);!$(OC#<\/em>)]<\/td><td><\/td><\/tr><tr><td>4<\/td><td>CC(C)O<\/td><td>Alcohol<\/td><td>SecondaryAlcoholAliphaticAcyclic<\/td><td>SecondaryAlcoholAliphaticAcyclic<\/td><td>[O;H1;D1;$(OC;!R;D3[A])]<\/td><td><\/td><\/tr><tr><td>5<\/td><td>CC(C)(C)O<\/td><td>Alcohol<\/td><td>TertiaryAlcoholAcyclic<\/td><td>TertiaryAlcoholAcyclic<\/td><td>[O;H1;D1;$(OC;!R;D4([a,A])[a,A])]<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u30a8\u30bf\u30ce\u30fc\u30eb\u3001\u30a4\u30bd\u30d7\u30ed\u30d1\u30ce\u30fc\u30eb\u3001<em>t<\/em>-\u30d6\u30bf\u30ce\u30fc\u30eb\u304c\u30a2\u30eb\u30b3\u30fc\u30eb\u3092\u6709\u3059\u308b\u5316\u5408\u7269\u3068\u3057\u3066\u62bd\u51fa\u3055\u308c\u307e\u3057\u305f\u3002<br>\u4e00\u65b9\u3001&#8221;PrimaryAlcohol&#8221;\u3068\u5165\u529b\u3057\u305f\u5834\u5408\u306b\u306f\u30a8\u30bf\u30ce\u30fc\u30eb\u306e\u307f\u304c\u62bd\u51fa\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u304a\u308f\u308a\u306b<\/h2>\n\n\n\n<p>SMILES\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u5316\u5b66\u53cd\u5fdc\u3092\u4eee\u5b9a\u3057\u3066\u5316\u5408\u7269\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u3092\u4f5c\u6210\u3059\u308b\u969b\u306b\u306f\u53cd\u5fdc\u3059\u308b\u5b98\u80fd\u57fa\u306e\u53b3\u5bc6\u306a\u8a2d\u5b9a\u304c\u4e0d\u53ef\u6b20\u3067\u3057\u305f\u3002\u4eca\u56de\u7d39\u4ecb\u3057\u305fSMARTS-RX\u3092\u7528\u3044\u308c\u3070PrimaryAlcohol\u306a\u3069\u306e\u308f\u304b\u308a\u3084\u3059\u3044\u7528\u8a9e\u3067\u306e\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u304c\u53ef\u80fd\u3068\u306a\u308a\u3001\u30d0\u30fc\u30c1\u30e3\u30eb\u30b9\u30af\u30ea\u30fc\u30cb\u30f3\u30b0\u3092\u3088\u308a\u7c21\u4fbf\u306b\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u308b\u3068\u601d\u308f\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u524d\u56de\u8a18\u4e8b<br>MoleculeResolver\u306b\u3088\u308b\u7269\u8cea\u540d\u304b\u3089\u306eSMILES\u691c\u7d22<br><a href=\"https:\/\/www.insilico.jp\/blog\/2025\/10\/09\/moleculeresolver\/\">https:\/\/www.insilico.jp\/blog\/2025\/10\/09\/moleculeresolver\/<\/a><br>\u6b21\u56de\u8a18\u4e8b<br>Heterocycle Isostere Explorer \u3092\u7528\u3044\u305f\u30d8\u30c6\u30ed\u74b0\u7b49\u4fa1\u4f53\u306e\u63a2\u7d22<br><a href=\"https:\/\/www.insilico.jp\/blog\/2026\/03\/26\/heterocycle-isostere-explorer\/\">https:\/\/www.insilico.jp\/blog\/2026\/03\/26\/heterocycle-isostere-explorer\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7406\u8ad6\u5275\u85ac\u7814\u7a76\u6240\u306e\u91d1\u5b50\u4fe1\u4eba\u3067\u3059\u3002\u4eca\u56de\u306fSMILES\u3092\u3082\u3068\u306b\u5206\u5b50\u306e\u53cd\u5fdc\u6027\u3092\u4e88\u6e2c\u3059\u308b\u305f\u3081\u306e\u5b98\u80fd\u57fa\u60c5\u5831\u3092\u30de\u30c3\u30d4\u30f3\u30b0\u3059\u308bSMARTS-RX\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002 \u53c2\u8003\u8ad6\u6587SMARTS-RX: a SMARTS-based represen&#8230;<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[118,33],"tags":[97,87,71],"class_list":["post-2817","post","type-post","status-publish","format-standard","hentry","category-ai-drug-discovery","category-rdkit","tag-python","tag-rdkit","tag-substructure-search"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.3.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SMARTS-RX\u306b\u3088\u308b\u53cd\u5fdc\u6027\u89e3\u6790\u306e\u305f\u3081\u306e\u5b98\u80fd\u57fa\u30de\u30c3\u30d4\u30f3\u30b0 - In Silico \u5275\u85ac<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SMARTS-RX\u306b\u3088\u308b\u53cd\u5fdc\u6027\u89e3\u6790\u306e\u305f\u3081\u306e\u5b98\u80fd\u57fa\u30de\u30c3\u30d4\u30f3\u30b0 - In Silico \u5275\u85ac\" \/>\n<meta property=\"og:description\" content=\"\u7406\u8ad6\u5275\u85ac\u7814\u7a76\u6240\u306e\u91d1\u5b50\u4fe1\u4eba\u3067\u3059\u3002\u4eca\u56de\u306fSMILES\u3092\u3082\u3068\u306b\u5206\u5b50\u306e\u53cd\u5fdc\u6027\u3092\u4e88\u6e2c\u3059\u308b\u305f\u3081\u306e\u5b98\u80fd\u57fa\u60c5\u5831\u3092\u30de\u30c3\u30d4\u30f3\u30b0\u3059\u308bSMARTS-RX\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002 \u53c2\u8003\u8ad6\u6587SMARTS-RX: a SMARTS-based represen...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/\" \/>\n<meta property=\"og:site_name\" content=\"In Silico \u5275\u85ac\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-03T07:04:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-26T04:57:21+00:00\" \/>\n<meta name=\"author\" content=\"kaneko\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"kaneko\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"18\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/\",\"url\":\"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/\",\"name\":\"SMARTS-RX\u306b\u3088\u308b\u53cd\u5fdc\u6027\u89e3\u6790\u306e\u305f\u3081\u306e\u5b98\u80fd\u57fa\u30de\u30c3\u30d4\u30f3\u30b0 - In Silico \u5275\u85ac\",\"isPartOf\":{\"@id\":\"https:\/\/www.insilico.jp\/blog\/#website\"},\"datePublished\":\"2026-02-03T07:04:53+00:00\",\"dateModified\":\"2026-03-26T04:57:21+00:00\",\"author\":{\"@id\":\"https:\/\/www.insilico.jp\/blog\/#\/schema\/person\/b0ca2eef6dece0def1eda9368533cdac\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\/\/www.insilico.jp\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SMARTS-RX\u306b\u3088\u308b\u53cd\u5fdc\u6027\u89e3\u6790\u306e\u305f\u3081\u306e\u5b98\u80fd\u57fa\u30de\u30c3\u30d4\u30f3\u30b0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.insilico.jp\/blog\/#website\",\"url\":\"https:\/\/www.insilico.jp\/blog\/\",\"name\":\"In Silico \u5275\u85ac\",\"description\":\"\u3053\u306e\u30d6\u30ed\u30b0\u30b5\u30a4\u30c8\u306f\u3001In silico\u5275\u85ac\u306b\u95a2\u9023\u3059\u308b\u7814\u7a76\u8ad6\u6587\u3084\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u30fb\u30c4\u30fc\u30eb\u306e\u5229\u7528\u3084\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306a\u3069\u306b\u3064\u3044\u3066\u3054\u7d39\u4ecb\u3057\u3066\u3044\u307e\u3059\u3002\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.insilico.jp\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.insilico.jp\/blog\/#\/schema\/person\/b0ca2eef6dece0def1eda9368533cdac\",\"name\":\"kaneko\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\/\/www.insilico.jp\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d1a01e2b3411f4bba3bcebd559806222?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d1a01e2b3411f4bba3bcebd559806222?s=96&d=mm&r=g\",\"caption\":\"kaneko\"},\"url\":\"https:\/\/www.insilico.jp\/blog\/author\/kaneko\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SMARTS-RX\u306b\u3088\u308b\u53cd\u5fdc\u6027\u89e3\u6790\u306e\u305f\u3081\u306e\u5b98\u80fd\u57fa\u30de\u30c3\u30d4\u30f3\u30b0 - In Silico \u5275\u85ac","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/","og_locale":"ja_JP","og_type":"article","og_title":"SMARTS-RX\u306b\u3088\u308b\u53cd\u5fdc\u6027\u89e3\u6790\u306e\u305f\u3081\u306e\u5b98\u80fd\u57fa\u30de\u30c3\u30d4\u30f3\u30b0 - In Silico \u5275\u85ac","og_description":"\u7406\u8ad6\u5275\u85ac\u7814\u7a76\u6240\u306e\u91d1\u5b50\u4fe1\u4eba\u3067\u3059\u3002\u4eca\u56de\u306fSMILES\u3092\u3082\u3068\u306b\u5206\u5b50\u306e\u53cd\u5fdc\u6027\u3092\u4e88\u6e2c\u3059\u308b\u305f\u3081\u306e\u5b98\u80fd\u57fa\u60c5\u5831\u3092\u30de\u30c3\u30d4\u30f3\u30b0\u3059\u308bSMARTS-RX\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002 \u53c2\u8003\u8ad6\u6587SMARTS-RX: a SMARTS-based represen...","og_url":"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/","og_site_name":"In Silico \u5275\u85ac","article_published_time":"2026-02-03T07:04:53+00:00","article_modified_time":"2026-03-26T04:57:21+00:00","author":"kaneko","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"kaneko","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"18\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/","url":"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/","name":"SMARTS-RX\u306b\u3088\u308b\u53cd\u5fdc\u6027\u89e3\u6790\u306e\u305f\u3081\u306e\u5b98\u80fd\u57fa\u30de\u30c3\u30d4\u30f3\u30b0 - In Silico \u5275\u85ac","isPartOf":{"@id":"https:\/\/www.insilico.jp\/blog\/#website"},"datePublished":"2026-02-03T07:04:53+00:00","dateModified":"2026-03-26T04:57:21+00:00","author":{"@id":"https:\/\/www.insilico.jp\/blog\/#\/schema\/person\/b0ca2eef6dece0def1eda9368533cdac"},"breadcrumb":{"@id":"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.insilico.jp\/blog\/2026\/02\/03\/smarts-rx\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/www.insilico.jp\/blog\/"},{"@type":"ListItem","position":2,"name":"SMARTS-RX\u306b\u3088\u308b\u53cd\u5fdc\u6027\u89e3\u6790\u306e\u305f\u3081\u306e\u5b98\u80fd\u57fa\u30de\u30c3\u30d4\u30f3\u30b0"}]},{"@type":"WebSite","@id":"https:\/\/www.insilico.jp\/blog\/#website","url":"https:\/\/www.insilico.jp\/blog\/","name":"In Silico \u5275\u85ac","description":"\u3053\u306e\u30d6\u30ed\u30b0\u30b5\u30a4\u30c8\u306f\u3001In silico\u5275\u85ac\u306b\u95a2\u9023\u3059\u308b\u7814\u7a76\u8ad6\u6587\u3084\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u30fb\u30c4\u30fc\u30eb\u306e\u5229\u7528\u3084\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306a\u3069\u306b\u3064\u3044\u3066\u3054\u7d39\u4ecb\u3057\u3066\u3044\u307e\u3059\u3002","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.insilico.jp\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/www.insilico.jp\/blog\/#\/schema\/person\/b0ca2eef6dece0def1eda9368533cdac","name":"kaneko","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/www.insilico.jp\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d1a01e2b3411f4bba3bcebd559806222?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d1a01e2b3411f4bba3bcebd559806222?s=96&d=mm&r=g","caption":"kaneko"},"url":"https:\/\/www.insilico.jp\/blog\/author\/kaneko\/"}]}},"_links":{"self":[{"href":"https:\/\/www.insilico.jp\/blog\/wp-json\/wp\/v2\/posts\/2817","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.insilico.jp\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.insilico.jp\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.insilico.jp\/blog\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.insilico.jp\/blog\/wp-json\/wp\/v2\/comments?post=2817"}],"version-history":[{"count":8,"href":"https:\/\/www.insilico.jp\/blog\/wp-json\/wp\/v2\/posts\/2817\/revisions"}],"predecessor-version":[{"id":2850,"href":"https:\/\/www.insilico.jp\/blog\/wp-json\/wp\/v2\/posts\/2817\/revisions\/2850"}],"wp:attachment":[{"href":"https:\/\/www.insilico.jp\/blog\/wp-json\/wp\/v2\/media?parent=2817"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.insilico.jp\/blog\/wp-json\/wp\/v2\/categories?post=2817"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.insilico.jp\/blog\/wp-json\/wp\/v2\/tags?post=2817"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}