タイポグラフィ合字の fi と fl を展開
PDF、学術誌、電子書籍、組版済み文書からコピーした文章には、一般的な複数の文字に見えても、実際には単一の Unicode 文字である合字が含まれることがあります。fi を含む単語は画面上では正しく見えても、fi の完全一致検索では見つからない場合があります。このツールは、周囲の単語、句読点、空白、改行を変えずに、タイポグラフィ合字を通常の構成文字へ展開します。検索、索引作成、比較、引用、一般的なテキストを想定するシステムへの受け渡しが容易になります。
無料で実行
見た目が正しい文章でも検索しにくい理由
組版ソフトウェアでは、隣り合う二つまたは三つの文字が一つの合字グリフに置き換えられることがあります。丁寧に設計された書体では字形同士が接触しやすいため、fi、fl、ff、ffi、ffl で特によく使われます。PDF がそのグリフを Unicode の表示用文字として公開している場合、ページをコピーすると、元の文字列ではなく合字が保持されます。貼り付けた単語は人には普通に見えますが、ソフトウェアには異なるコードポイント列として認識される可能性があります。そのため、「file」の文字列検索では、単一文字の fi で始まるコピー済みの単語に一致しないことがあります。同じ不一致は、文書索引、重複検出、データベース検索、コマンドライン検索、アクセシビリティ対応、文章比較にも影響します。この機能は、対応する合字だけを通常のラテン文字列へ変換し、大文字の形がある場合は大小を維持します。アクセント、句読点、タブ、空白、行末など、対象外の文字はすべてそのまま保たれます。
展開によって変わる内容と保持される内容
対象の文章をテキスト欄へ入力すると、展開後の文章と置換数が返されます。アルゴリズムは、ff、fi、fl、ffi、ffl の Unicode 表示形式と、歴史的な二種類の st 形式を認識します。また、一般的な AE と OE の合字も大文字・小文字に応じて展開し、AE、ae、OE、oe のいずれかを生成します。三文字に展開される場合でも、認識された一つの元文字を一回の置換として数えます。この数値により、貼り付けた文章に隠れた組版文字が実際に含まれていたか確認できます。処理は決定論的な一回の走査であり、同じ入力には常に同じ出力が得られます。言語モデルが意図を推測することはありません。アクセントの正規化、引用符の変更、空白の圧縮、綴りの訂正、ダッシュの置換は行いません。真の合字ではなく OCR の誤認識がある場合、その誤りは別工程で修正できるよう残ります。
検索や文書処理で整形済みテキストを使う方法
合字の展開は、文章を抽出またはクリップボードへコピーした直後、索引作成、比較、トークン化を行う前に適用すると効果的です。一つの文章なら、コピーした内容を貼り付け、返された文章を検索欄、メモ、文献管理ソフト、プレーンテキストファイルでお使いください。自動処理では、保存文書または検索クエリーのどちらかが組版資料に由来する可能性がある場合、双方へ一貫して適用します。これにより、見た目が同じ単語が索引とクエリーで別の表現になることを防げます。API の基本料金は一回のリクエストにつき $0.002 で、一つのテキスト項目を処理します。ネットワークにも確率的モデルにも依存しないため、再現可能なテストや資料の整理にも適しています。出典が重要な場合は元の文章も保存してください。通常は読み方を保ちますが、展開ではコードポイントを意図的に変更します。引用符、空白、OCR、文字種の正規化は、変更内容を追跡できるよう別々の明示的な工程として実行してください。
活用例
PDF からコピーした文章の修復
検索や引用の前に、隠れた fi、fl、ffi、ffl の表示文字を通常の文字へ変換します。
索引作成前の文書整形
抽出した学術、法律、出版分野の文章を完全一致索引へ追加する前に、合字を正規化します。
文章比較の安定化
組版済み文章とプレーンテキストを比較する前に、組版だけが原因のコードポイント差を取り除きます。
よくある質問
料金はいくらですか?
API は一回のリクエストにつき $0.002 です。ブラウザー版では、同じ決定論的な変換をローカルで実行できます。
どの合字を展開できますか?
ff、fi、fl、ffi、ffl、st の表示用合字と、大文字・小文字の AE および OE の合字を展開します。
通常の fi や fl も変わりますか?
いいえ。分かれた文字はすでに検索可能なため、認識された単一文字の合字だけを置換します。
OCR の誤りも修正できますか?
いいえ。既知の合字だけを展開し、誤認識された文字、欠落した空白、その他の OCR エラーは保持します。
書式と改行は保持されますか?
はい。対応する合字以外は、空白、句読点、アクセント、改行を含めて変更せずに返します。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/str/expand-ligatures \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"The office file is flexible."}'const res = await fetch("https://api.kit.forhosting.com/str/expand-ligatures", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "The office file is flexible."
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/expand-ligatures",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "The office file is flexible."
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/expand-ligatures", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"The office file is flexible."}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"The office file is flexible."}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/expand-ligatures", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "The office file is flexible."
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.expand_ligatures",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |