はてなブログの記事を一括で非公開にする方法(AtomPub API)

はてなブログの記事を別サイトに移行した後、旧記事を一括で非公開にしたいケースがあります。 注意点:下書きには戻せない はてなブログのAtomPub APIでは、公開済みの記事を下書き(draft)に戻すことはできません。PUTリクエストで <app:draft>yes</app:draft> を送ると 400 Cannot Change into Draft エラーになります。 そのため、以下の2つの方法があります。 方法1:記事本文を「移転しました」に書き換える AtomPub APIのPUTで記事の <content> を書き換えることは可能です。 import requests import xml.etree.ElementTree as ET import time HATENA_ID = "your_hatena_id" BLOG_ID = "your_blog_id.hatenablog.com" API_KEY = "your_api_key" NEW_SITE_URL = "https://your-new-site.com" ATOM_NS = "http://www.w3.org/2005/Atom" def fetch_all_entries(): entries = [] url = f"https://blog.hatena.ne.jp/{HATENA_ID}/{BLOG_ID}/atom/entry" while url: resp = requests.get(url, auth=(HATENA_ID, API_KEY), timeout=30) resp.raise_for_status() root = ET.fromstring(resp.text) for entry in root.findall(f"{{{ATOM_NS}}}entry"): title_el = entry.find(f"{{{ATOM_NS}}}title") title = title_el.text or "" if title_el is not None else "" edit_link = entry.find(f"{{{ATOM_NS}}}link[@rel='edit']") edit_url = edit_link.get("href") if edit_link is not None else None if edit_url: entries.append({"title": title, "edit_url": edit_url}) next_el = root.find(f"{{{ATOM_NS}}}link[@rel='next']") url = next_el.get("href") if next_el is not None else None return entries def replace_content(entry): title = entry["title"] update_xml = f"""<?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app"> <title>{title}</title> <content type="text/plain">この記事は {NEW_SITE_URL} に移転しました。</content> </entry>""" resp = requests.put( entry["edit_url"], auth=(HATENA_ID, API_KEY), data=update_xml.encode("utf-8"), headers={"Content-Type": "application/atom+xml; charset=utf-8"}, timeout=30, ) return resp.status_code entries = fetch_all_entries() print(f"Found {len(entries)} entries") for i, e in enumerate(entries): status = replace_content(e) print(f"[{i+1}/{len(entries)}] {status}: {e['title'][:50]}") time.sleep(0.5) 方法2:はてなブログの管理画面から一括削除 記事数が少なければ、管理画面の「記事の管理」から手動で削除する方法もあります。ただし一括選択機能がないため、大量の記事には向きません。 ...

2026年3月1日 · 1 分 · Nakamura

OpenITI mARkdownからTEI XMLへの自動変換ツール「oitei」を試す

はじめに イスラーム圏の歴史テキストを扱う OpenITI(Open Islamicate Texts Initiative) プロジェクトでは、TEI/XMLの代わりに mARkdown という軽量記法でテキストをタグ付けできます。 TEI/XMLは構造化の国際規格として強力ですが、特にアラビア語のような右から左に書く言語(RTL)では、XMLタグとの混在でエディタ上の表示が乱れるという問題があります。mARkdownはこの課題を解決する記法です。 本記事では、mARkdownで書かれたテキストを TEI XMLに自動変換 するPythonツール oitei を実際に動かしてみます。 oiteiとは OpenITI mARkdown → TEI XML の変換ライブラリ(Python) OpenITI TEI Schema に準拠したXMLを出力 PyPIで公開されており pip install で導入可能 依存ライブラリ: oimdp(mARkdownパーサー)、lxml https://github.com/OpenITI/oitei インストール p i p i n s t a l l o i t e i Python 3.8以上が必要です。oimdp(OpenITI mARkdown Parser)と lxml が依存関係として自動インストールされます。 OpenITI mARkdownの記法 mARkdownファイルは以下の3部構成です。 マジックバリュー (1行目): ######OpenITI# メタデータ : #META# で始まる行 本文 : #META#Header#End# の後に記述 主なタグ 記法 意味 `### ` `### ### $ 伝記エントリ # 段落の開始 @P02 名前 人物名(後続2語を含む) @T11 地名 地名(後続1語を含む) @YB732 誕生年(ヒジュラ暦732年) @YD808 没年(ヒジュラ暦808年) %~% 詩行(hemistich)の区切り 固有表現タグ(@P, @T 等)の後ろの 2桁の数字 は、1桁目がエンティティ番号、2桁目が「後続する何単語を名前に含むか」を指定します。例えば @P02 Ibn Khaldun は「後続2語(Ibn Khaldun)を人名として含む」という意味です。 ...

2026年2月28日 · 15 分 · Nakamura

Deep Zoom画像を完全復元:タイル画像からBigTIFFへの変換技術

はじめに Webサイト上で高解像度画像をスムーズにズーム表示するために使用されるDeep Zoom技術。Microsoft Deep Zoom Composerなどで生成されたタイル化された画像データから、元の高解像度画像を復元する必要に迫られることがあります。 本記事では、Deep Zoom形式で公開されている画像データから、元の高解像度TIFF画像を復元する技術について解説します。 Deep Zoom画像の仕組み タイル構造 Deep Zoom画像は、1枚の大きな画像を複数の小さなタイル画像に分割し、ピラミッド構造で保存します: レベル0 : 最も低解像度(通常1タイル) レベルN : 最高解像度(元画像の解像度に相当) 各レベルで解像度が2倍になる ファイル構成 d d z z c c ├ │ ├ │ │ └ _ _ ─ ─ ─ o o ─ ─ ─ u u t t 0 └ 1 ├ └ 1 ├ ├ └ p p / ─ / ─ ─ 6 ─ ─ ─ u u ─ ─ ─ / ─ ─ ─ t t . _ 0 0 0 0 x f _ _ _ _ m i 0 0 0 1 l l . . . . e j j j j s p p p p / g g g g # # # # レ メ ベ 最 数 タ ル 高 万 デ 0 レ 枚 ー の ベ の タ 唯 ル タ 一 イ の ル タ イ ル 実装の課題と解決策 課題1: XMLメタデータの名前空間の違い Deep Zoomには複数のバージョンがあり、XMLの名前空間が異なります: ...

2025年11月18日 · 12 分 · Nakamura

GitHub File History Analyzerの紹介:ファイル編集履歴をAIで分析するツール

本記事はAIが作成しました。 はじめに GitHubリポジトリで管理されているファイルの編集履歴を分析したいと思ったことはありませんか?特に長期間にわたって更新されているファイルの変更パターンや、プロジェクトの進化の過程を理解したい場合があります。 GitHub File History Analyzerは、このようなニーズに応えるために開発したコマンドラインツールです。 ツールの概要 このツールは以下の機能を提供します: GitHubのAPIを使用して特定ファイルのコミット履歴を取得 変更内容の統計的な分析(追加・削除行数、変更タイプの分類など) OpenRouter経由でAI(Gemini 2.5 Proなど)による編集パターンの分析 分析結果のMarkdown/JSON形式での出力 開発の背景 デジタルアーカイブプロジェクトで、XMLファイルの長期的な編集作業を追跡する必要がありました。単純なgit logでは得られない、より深い洞察(編集の傾向、作業の質、進捗状況など)を得たいという要求から、このツールの開発に至りました。 技術的な実装 使用技術 言語 : Python 3.8+ 主要ライブラリ : PyGithub(GitHub API wrapper) requests(HTTP通信) python-dotenv(環境変数管理) アーキテクチャ ツールは主に2つのコンポーネントで構成されています: GitHubFileHistoryAnalyzer : GitHub APIを使用してファイル履歴を取得・分析 OpenRouterClient : AI分析のためのクライアント # a c a p n o n r 基 a m a o 本 l m l m 的 y i y p な z t s t 使 e s i 用 r s = 例 = = = a a n G n a a i a n l t l a y H y l z u z y e b e z r F r e . i . r g l g . e e e a n H t n e i _ a r s f l a t i y t o l z e r e e _ y _ _ a A h p i n i a _ a s t p l t c r y o h o z r e m e y s p r ( ( t ( " c ( g o o c i w m o t n m m h e i m u r t i b / s t _ r ) s t e , o p k o a e " n n , a ) l " y p s a i t s h ) / t o / f i l e . x m l " ) 実際の使用例 基本的なコマンド # p # p # p y y y フ t A t 結 t ァ h I h 果 h イ o 分 o を o ル n 析 n M n 履 の a 歴 m 実 m r m の a 行 a k a 取 i i d i 得 n n o n と . . w . 表 p p n p 示 y y 形 y 式 で - - 保 - r r 存 a e e n p p a o o l y o o z w w e n n e e r r - / / a r r i e e - p p o o o u t p - - u f f t i i l l a e e n a p p l a a y t t s h h i / / s t t . o o m / / d f f i i l l e e . . p p y y - a n a l y z e 分析結果の例 ツールは以下のような情報を提供します: ...

2025年7月24日 · 4 分 · Nakamura

DHConvalidatorにおける'ref'に関する不具合への対応

本記事は、一部AIが執筆しました。 概要 DHConvalidatorは、デジタル人文学(DH)会議の抄録を一貫したTEI(Text Encoding Initiative)テキストベースに変換するためのツールです。 https://github.com/ADHO/dhconvalidator このツールの利用において、Microsoft Word形式(DOCX)からTEI XML形式への変換処理中に以下のようなエラーが発生するケースがありました: E R R O R : n u . x o m . P a r s i n g E x c e p t i o n : c v c - c o m p l e x - t y p e . 2 . 4 . a : I n v a l i d c o n t e n t w a s f o u n d s t a r t i n g w i t h e l e m e n t ' r e f ' この原因と対処方法について共有します。 ...

2025年6月27日 · 22 分 · Nakamura

ArchivematicaのPreservation planningにおいて、Normalizationのルールを追加する

概要 ArchivematicaのPreservation planningにおいて、Normalizationのルールを追加する方法の備忘録です。 背景 拡張子が.jpgである画像をArchivematicaに投入した際、以下のようにFormatがJPEGのものに対してtifファイルを保存用に作成するルールを用意しているにもかかわらず、tifファイルが作成されないことがありました。 そこで、以下のような履歴の画面から、タスクの内容を確認しました。 結果は以下です。 具体的には以下のような記載になっており、該当するルールが存在しない、ということが記載されています。 F N i o l t e n f o o r r m m a a l t i : z i I n m g a g 1 e 1 e ( c R f a 0 s 5 t d e - r 8 ) f : c 6 E - x 4 c 7 h 0 a 4 n - g a e 6 a e b 9 l - e 4 a I 2 m 6 a e g f e 9 8 F f i 1 l 8 e 6 . F j o p r g m a t - ( N C o o m r p u r l e e s s o e r d ) d : e f E a X u I l F t C r o u m l p e r e f s o s u e n d d I t m o a g n e o r 2 m . a 2 l . i 1 z e ( b f i o g r - e p n r d e i s a e n r ) v a ( t f i m o t n / 6 4 5 ) そこで、fmt/645に対するルールを追加します。 ...

2025年4月24日 · 2 分 · Nakamura

AtoM(Access to Memory)のAPIを使って、オブジェクトを登録してみる

概要 AtoM(Access to Memory)のAPIを使って、オブジェクトを登録する方法の備忘録です。 APIの有効化 以下にアクセスします。 /sfPluginAdminPlugin/plugins arRestApiPluginを有効にします。 APIキーの取得 以下に、APIキーを生成する方法が説明されています。 https://www.accesstomemory.org/en/docs/2.9/dev-manual/api/api-intro/#generating-an-api-key-for-a-user ユーザ名とパスワードでもAPI接続できるようですが、今回はREST API Keyを発行しました。 エンドポイント AtoMでは、「典拠レコード」や「機能」など、複数のメニューが提供されていますが、APIによって利用できるのは、以下のみのようです。 See the subsequent pages for more details on each endpoint, and available parameters. There are three endpoints available: Browse taxonomy terms Browse information objects Read information object Download digital objects Add physical objects この点は、ArchivesSpaceのほうが豊富なAPIが提供されており、軍配が上がるかもしれません。 https://archivesspace.github.io/archivesspace/api/ また、以下のソースコードを確認すると、CreateActionが可能なものは、informationobjectsとphysicalobjects、digitalobjectsに限定されているようでした。 https://github.com/artefactual/atom/tree/qa/2.x/plugins/arRestApiPlugin/modules/api/actions ただ機械的に一括登録を行いたい場面は、主にinformationobjectsだと考えられるため、これらの機能のみで十分かもしれません。 physical objectsの登録 以下のようなクラスを用意します。 # c | l a e s x s d d p e e o A f f r p t i l s u p a i e a u p r # i e C _ o e s a p f l d r r e f l l i a l e s i s d l i s レ s i n d f r s _ a e _ n p ス r e e i _ . n w k p s } : # a a a s } p = t o ポ e p p p # r p p : p p n t d u a o e i e u u u e h ( n ン s r r r e r r r r t _ o r m r y _ l B t t t l y f u s ス p i i i 作 s i i i i : _ t l e d k f a h h h f s " r e を o n n n 成 u n n n n ( e = e . " " s _ _ _ . " " i { l 確 n t t t さ l t t t t s n = = = y h R C i s b b h A C c s , = 認 s ( ( ( れ t ( ( ( ( e v o : e E o c t y 6 e u o a e e " f f た f j f f l ( o o o s a S n r t 4 a t n l l s r . 物 " " オ = " s " " f o s s s . d T t 認 i e d h t _ f e e s 理 ス レ ブ 作 o エ レ ) v . . . g e - e 証 n s = e o e o . l q t オ テ ス ジ r 成 n ラ ス : e g g g e r A n の g r r n b u f u a ブ ー ポ ェ e さ . ー ポ r e e e t s P t ヘ = b s i t j r . e t ジ タ ン ク s れ d : ン r t t t e I - ッ = a z - e l h s u ェ ス ス ト p た u ス i e e e n = - T ダ a s = a T c } e t s ク コ : の o 物 m { : d n n n v K y ー f u e t y t / a s _ ト ー 情 n 理 p r e v v v ( { e p を " t 6 { i p s a d . c が ド { 報 s オ s e { = ( ( ( " y e 作 { h 4 o e ( p e p o 作 : r e ブ ( s r T " " " a " " 成 u _ . n " s i r o d 成 e . ジ r p e r a u p p : : s s b " : e / s s e さ { s j ェ e o s u t s a i e t 6 : l p , t れ r p s ク s n p e o e s _ a " r r 4 " f h ( i ま e o o ト u s o ) m r s k p a n i e f a , y p u n し s n n I l e n _ n w e i p a n n " p s h r た p s ( D t . s u a o y _ p m g c B p p i y l [ ! o e ) : , s e r m r " k l e . o a l h c s , 2 " n . t . l e d ) e i } e d s i y a i 0 ) s t { i a t " " " y c : n e i c s l c h 0 e e r n t e ) ) ) , a { c ( c a i o a e , . x e d u x t p o a t c b l a s t s e s t i a d u { i a j _ d 2 t } u n _ } o s e t a o l e o e 0 a " l t c " n s ( h u n _ c b r 1 t ) t = o ) / w ' _ t / o t j s ] u . 4 d j o a b h j b s e = : s g ) e s r s y _ s j " c s _ e ) } o d c t b o e t e c t " n } i e 6 n c s l o ( ) " " i s 4 " t ) f d ' ' ) } s . e i ) . " ) h } d d , : e " ' e a ) ) c d } o e " d r ) e s ( , ' a j s s c o i n i = ' p ) h y s i c a l _ o b j e c t s ) 以下で実行します。 ...

2025年3月12日 · 16 分 · Nakamura

WordファイルをTEI XMLに変換する方法:TEIgarage APIの活用ガイ

この記事は、AIが作成し、一部を人が修正したものです。 はじめに デジタル人文学の世界では、文書をTEI(Text Encoding Initiative)形式で保存することが一般的になっています。TEIは学術的なテキストを構造化するための標準規格です。今回は、Microsoft Wordで作成した文書をTEI XML形式に変換する方法を、Pythonを使って解説します。 TEIgarageとは? TEIgarageは、さまざまな形式の文書をTEI XMLに変換するためのオンラインサービスです。このサービスはAPIを提供しており、プログラムから直接利用することができます。今回はこのAPIをPythonから呼び出して、Wordファイルを変換してみましょう。 必要なもの Python 3.6以上 requestsライブラリ(APIリクエスト用) インターネット接続 変換したいWordファイル(.docx形式) 手順 1. 必要なライブラリをインストールする まず、必要なライブラリをインストールしましょう。コマンドプロンプトやターミナルで以下のコマンドを実行します。 p i p i n s t a l l r e q u e s t s 2. Pythonスクリプトを作成する 次に、以下のPythonコードをword_to_tei.pyなどの名前で保存します。 i i i f d # i m m m r e f p p p o f メ o o o m イ r r r c # i o T # w # i e ン _ # w # o t e t t t i o n u E i f l 処 n o u r x o n O p t I . t 変 s 理 a 変 r 出 t y c r o z v x u p G d h 換 r e m 換 d 力 p : e e s i i e G t u A o f r 結 e # w : p e し _ フ u # c p p q p m r a _ t R c o i e 果 s i r _ た f ァ t o t r u f p t r d _ A x p l s を p z t i _ い i イ _ W n i e i o _ a o d G e e p フ o i h n W l ル f o v E n s l r d g c o E フ n s o ァ n p # f e t = o e の i r e x t t e t o e u c _ ァ ( n イ s フ z o l ( = r パ l d r c ( s c の m u U イ f = s ル e ァ i t r s " d = ス e フ t e f B x エ e m R ル i e と . イ p e e エ " フ を ァ _ p " y _ ン n e L を l { し s ル f i m i : p ラ _ ァ " 指 = イ d t エ t t ド t n 開 e " = て t を i . e f r ー _ イ d 定 ル o i ラ e o ポ _ t = い _ f 保 a メ l x m i : m ル o " を c o ー s _ イ t _ て p i r 存 t モ e m b m n " a の c o 変 x n が I t ン y t f A a l e せ u リ . l e e z t o p b t , i パ u u 換 _ 発 O e ト p y " P t e q ず s 上 Z フ r m i e s r r ( n ス m t t a 生 i e p h I h " u に _ で i ァ b p i . i e " r _ を e p o s し _ e t に , : e 展 c 展 p イ i e _ _ r n a エ e _ 指 n u _ ま x = t 送 s 開 o 開 F ル n r r x e t k ラ s " 定 t t t e し m = p 信 " f t d i を . e m n ( ー p : s / e : た l " s r i s e l 保 z e f l a " : o / s i : ( d " : b l . e 存 i n . _ m T n s a _ f o T / " e p = ( p d e p e E t s a m x { i c E / ) } o = B _ s x a ( I e e m p m e l x I t s y r w t t t / i . p l l } e % % e a t 2 t e i r h e X . s l e ( " _ 3 3 i s ( 0 e f t a i M x t e _ w ) p A A g T 0 s . h c = _ L m a . t o a a t a f E : I n ( t x l t d e r t p e r i I O a " ( o m 変 u o i d h p x a l G ( m t m s l 換 フ s c . _ , l t g e A r e e e . _ 成 ァ _ x x f i % e : R e l i m p p 功 イ c " m i o c 3 . A s i . b a a ! ル o l l u a A t G p s x e t t t が d " e t t x e E o t m r h h e 見 e # , p i m i _ n ( l , . , i つ , u o l - U s ) " j . か こ # o t n " c R e : ) o o o x り r こ u _ % . L . : s i u m ま e を 出 t p 3 o , c . n t l せ s 実 力 p a A r o p ( p ん p 際 先 u t v g f n a o u に 。 o の を t h n / i t t s t 保 " n フ 指 _ ) d e l e h . _ 存 ) s ァ 定 f : . g e n . p p さ e イ i o e s t d a a れ . ル l p - = ) i t t ま t パ e e w f ) r h h し e ス ) n e i n . ) た x に x b l a a d 。 t 変 m s e s m i " ) 更 l e s e r ) し f r ) z ( n て o v i o a く r i p u m だ m c _ t e さ a e r p ( い t / e u o s C f t u - o : _ t o n p p f v a u f e t t i r h _ c s ) p e i ) a d o t o n h c s ) u / , m { e i m n n e t p m . u b w t e o _ r r d ) d o p c r u o m c e e n s t s _ i t n y g p m e l } . / d { o o c u u t m p e u n t t _ " d o c u m e n t _ t y p e } / " 3. スクリプトを実行する スクリプト内のword_file変数を、変換したいWordファイルの実際のパスに変更します。同様に、output_file変数も希望の出力先に変更してください。 ...

2025年3月3日 · 7 分 · Nakamura

DrupalのJSON:APIを用いて、ユーザ名とパスワードでデータ登録を行う

概要 過去に、DrupalのJSON:APIを用いて、Pythonによるデータ登録を行う記事を執筆しました。 以下は、Basic認証を用いた方法です。 また以下は、API Keyを用いた方法です。 これらに加えて、通常のログインによる登録を行うことができたので、備忘録です。 コード 以下の通りです。ログインやCSRFトークンを取得した上で、コンテンツを登録します。 i i i f c m m m r l p p p o a o o o m s r r r s d d d d t t t d e e e e o A f f f f r j o t p e s s e i l # s # # # s s l # l l i g # c i e c # u r i e q o n C _ o e e e o o o f e s f l r r e f l u n v l i a D l エ s 認 l l g ロ g g t C r s e 記 l s s e i n d r f ン e 証 f f i グ i i l _ S f c e a 事 p r e s i e i _ u . ド l 情 . . n イ n n l j h o s c R _ f c s # # s } : # s t 作 = o # u h c j e p : p t m n t d p D ポ f 報 U P ( ン _ _ o s e g e s F t " o r e e e 成 n r e o s s r r s p t _ o a R イ . ( S A s リ u r g o a i l r ト o { o f r s l r l _ リ f s s l a o o p i i o : _ t l U ン J B E S e ク r e i n d n f f ー k s k _ e e f a f c ク " e e , d k n o n n r ( e サ P ト S a R S l エ l s n = e _ . _ ク e e i t t l . " " " i . o エ { l e i = n t t t s n イ A ( O s N W f ス p _ { r r s t ン n l e o u f h C A X s c n ス s = f r e d s ( ( e v ト L J N i A O ) ト = o u " s e e o を _ f s k r . e o c - e s t ト e . s s a e " " l l ( の _ S A c M R : n r n = s s k 取 r . = e n c a n c C r e l r J = = t . コ エ o f o U B O P 認 E D f s l a { p s e 得 e D s n s d t e S E f n f e S s s a s ン ラ a ) v R A N I 証 " e , m " o i n s R e _ c r e e p R x _ t . q O e e t テ ー d : e L S : _ ) = = { e C n o ( p U l r s f r n t F c t ( D u N l l a ン : _ r ( E A E s = " o s n s o P f e r _ s t " - e o s R e A f f t ツ " d r 例 _ P N o o e : n e _ e n A . s f t - : T p k e U s P . . u が , o i ) U I D s s l r t . c l s L s p _ o = T o t e l P t I h s s 作 t d R ) P . . f e s e s o f e _ e o t k y " k i n f A s _ e e _ 成 r e e L O g g . q e n t o ) B s n o e { p a e o , L . E a s c さ e n = I e e D u l t a k : = A s s k n e p n n = _ p N d s o れ s v T = N t t R e f - t i S i e e " p " ( d B o D e i d ま p r T e e U s . T u e r E o . n = : l : f N a A s P r o e し o u o n n P t U y s s e _ n s _ i " o t S t O s n た n e s = v v A s S p _ q U _ t r c " c c C n a E ( I , _ = ! s ) . ( ( L . E e c = u R c a e s a a s S e : _ N c = " e g f " " _ p R " o e L o t s r p t r R U T o ) . e " U P B o N : d l s } u p f p i f F d R , o 2 s t { S A A s A e o t k s o _ l o _ ト i L k 0 t e s E S S t M " g s s i _ n t i n t ー c } i 1 a n e R S E ( E a = i . e e c s o c / o ク t / e : t v l N W _ , p = n g s s o e k a v k ン ) j s u ( f A O U p _ e s d . e t n e 取 : s , s " . M R R " l 2 r t i e t n i d n 得 o _ D D E D L p i 0 e ( o # e _ o . _ 失 n c R R " " } a c 0 s n = x r n a r 敗 a o U U ) ) / s a : p / こ = t e / p e : p d P P u s t o t こ s v i s i e A A s " i n o で 2 p n + p { / , L L e : o s k ロ 0 o d j o c { _ _ r n e e グ 0 n . s n s d r B B / s / . n イ : s a o s r a e A A l e j c " ン e p n e f t s S S o l s o , セ . i " . _ a p E E g f o o ッ t + , t t [ o _ _ i . n k シ e j e o ' n U U n P " i ョ x s x k d s R R ? A } e ン t o t e a e L L _ S s を n , n t . " } f S 渡 " _ a t ) / o W す , r ' e j r O e ] x s m R s [ t o a D p ' ) n t } o t a = , n y p j s p i s e e / o . ' n n s ] o " t . d a r e t e / u p a s l r _ a t c c i o e c d ( l e ' e } " { ' c , s r f _ t ) o } k " e n _ r e s p o n s e . t e x t } " ) これにより、以下で、コンテンツを登録することができました。 ...

2025年3月1日 · 9 分 · Nakamura

大きな画像から部分画像の座標を取得する方法

概要 大きな画像の一部が切り出された複数の画像から、元の画像内での座標を取得する機会がありました。本記事では、そのための方法についての備忘録をまとめます。 OpenCV の SIFT (Scale-Invariant Feature Transform) を用いて、テンプレート画像と元の画像を特徴点マッチングし、アフィン変換を推定して座標を取得する方法を紹介します。 実装 必要なライブラリ p i p i n s t a l l o p e n c v - p y t h o n n u m p y t q d m Pythonコード 以下のコードでは、指定した大きな画像 (image_path) に対して、テンプレート画像 (templates_dir 内の PNG 画像) を SIFT でマッチングし、元の画像内の座標を取得します。 i i f f i # d # d # d # d # d # d m m r r m e e e e e e p p o o p 画 f 特 f マ f ア f 画 f メ f o o m m o 像 徴 ッ フ 像 イ r r r 読 l i i r 点 e r チ m m g r ィ e s d M r 上 d h r t c r ン m # i t d # s b k # i f # c p t t g t t み o m f e 抽 x e ン a a o e ン s r s _ e に r , e r v e 処 a m e s i f p f o v r l q 込 a g t 出 t t グ t t o t 変 t c t a t マ a c a 2 t 理 i 画 g m t S f 1 特 r 結 2 i c n o d o み d i u r u 処 c c d u 換 i _ _ f u ッ w w t n . u n 像 p _ I t = , 徴 d 果 . n v u b m s _ = m p r a r 理 h h _ r 推 m p p f r チ _ _ s p r ( と = l i F 点 e p r t t i k i g i # M i # b # x b c を i t 2 m i g r n c n _ e m n 定 a t t i n ン m = p f o n i テ _ m T = c d が s r e e e f p f o f _ f e , a v 保 m ( p i i m c i t f s a t s s n グ a t o l m ン l p g 特 v e 見 1 i t m m 2 o ア a 矩 s フ s 2 存 w f y m m a v i n i _ d e t g e e M 結 t t s r y t a プ o a 徴 c 2 s つ n u p p t , d d g フ f M 形 t ァ y e . r " p p g 2 s t m f e a = c o _ = = , _ 果 c e m l r g レ a t = 量 v . 1 か i t r l l e c e c _ o p c ィ f _ p c 描 _ イ , _ p i 結 a o o e . ( g e t t h o a a を h m = e i a e ー d h 検 2 B ら s ( n _ m o d s o m o r o ン i a r o 画 d ル n u t 果 s r r _ i N f a e u m e d f n n _ f 描 e p d n n _ ト _ s c 出 . F = な " p = p n e 2 n a d i n 変 n f i n s 名 _ a t e 画 t t g m o " t c r a s _ f p p f 画 d l n _ e s p 一 i v 器 S M か N 対 a l t s t t _ n t 換 e f n t t を , m T ( 像 n r r n 画 u t e t m i . . = i _ _ p p s f a 覧 m = 2 I a e っ o 象 t l i 2 i i c m t i 推 i t i 矩 e e o を p g t a e e 像 r o s c = a n f f n r s . t ( o t の a . & F t x た n 画 h o i n s n h a ( n 定 = n ( n = 形 _ x u 保 l q y a : が e r ( h t e l l c e e h f s i r h 読 g g i T c t 場 e 像 a s u = u e t f u e f u の = t t 存 o d ( d 見 s . d e [ c _ o o v c a l m m , み e l m B _ h r 合 : の i d e N e s c " e e " e d 近 = ( p し b m p ( つ ( d e r m h t a a 2 t p o = a e 込 _ o r F c e a 特 n _ N e o h 特 s i ア r く o d u ま a p か i e s . e r t t . a e a g d t み g b e M r r c 徴 i o x n = e 徴 t s フ a に c s s t し t a り m t 1 k f s a 3 3 e n t c e _ e r ( a a e ( t 点 t m n t e s 点 i ィ w 表 v . t _ た h t ま a e , n o n 2 2 s g 3 v , p m a t d t a c _ が q a e r : m の m N ン _ 示 2 p _ p : ) h せ g c n r i s ( ( t l 2 2 t p y e ( c t v f 見 d g : a a i マ a o 変 m . a i a : , ん e t d M f f [ [ i e ( . [ s l ( m i h e 2 e つ m e c t s ッ t n 換 a b t m t { : , A e a m o k k m ( [ t n a i p m e ( . a か ( _ t c チ e e 推 t o h g h o c n s t , l r p p a i [ r p t m l a r ) N t り t g _ h N ン _ : 定 c u . , , u v { d d 2 c e m 2 1 t m 0 a . e a a g O u ま e r f _ o グ a に h n s t 2 p e C , h n n ( [ [ e a , n i s g t e 設 R r せ m a e f n が f 失 e d p b d p . a t o ( ( k m m A g s n _ e e _ 定 M e ん p y a e e 不 f 敗 d i l a s u I t e m m d i g p . . f e 0 f t d _ s p _ s で l ( t a : 足 i : _ n i s t t M h c p a e n o 1 t q f , ] o 3 i p _ a L ( し _ t u t : n r g t e _ _ R } t u t s o , r u i , r 2 r a d t 2 i た p e r u e { e R e _ i p E " o t c 1 m d a e n M m ( , t i h , m 。 a m e r { _ t c e x n m a A ) r e h , a _ k i r e _ [ ( t h r ) g " t p s e t t e t c t a g t D ) ( e t m p n y P a w n r o ) ) c , ) h l ( s e r m a t ( m ) h _ : i r d c a 2 I I a f , p a u r s _ t ( m a p n ( o e } G m , e h t , d d r f . n t o s ) p e d p n l g b s , " R a s e c x x t i 0 a s p s i : a m e l s _ l e . ) A g r 2 s h g ] ] i n ] r f u s f t p s _ f p e s p ( Y e a , e o . . a e , r o t C t h l 1 p o a ( t a x S , t i s o p p l , a r _ h ) ) , , a r t d _ t , C i k f ) d t t 2 [ y m p e t m h s d h A N o = _ D t w ( e a c s d h ( } t s . y L o _ 2 m > m f f ( e , [ d t k i e } k " _ t b E n t ) . = a o o s m r _ h = f s " p ) i ) a - ) e e d t r r r p h e p ) F t 2 ) 1 m s ) s i m c c l ] c t : a ) , , g e 1 t s i h m m _ _ , t s l , n 0 = t n e p s _ ) s b k a ) 0 a _ s i i t h [ p ] e f p M m , . n m ) n n s a 0 t , ) ) 2 _ e 7 c a : , p , s , a ( c , e t g g e ] i f t v c o o d ) h ) s g f e 2 m < h o o s : ] , C o i m . i e d d t ] l o n p F n r s _ _ _ ) M o d e l O _ a m m p _ s _ , _ N m t e a a t a e m p T a i l t t s # f d a t a _ t o s c c , f = t e t H c _ e h h 長 i T c m h E h t e e m 方 n r h p ) R e e N s s e 形 e u e l ) S s s o ] ] t の ) e s . [ H = t n ) ) h 四 [ , ) s 0 E 4 e . . o 隅 0 h ] Y ) r r d ] c a _ : e e = o p S n s s c l e I . h h v # o ) M d a a 2 r P i p p . 変 = L s e e R 換 ( E t ( ( A 後 0 X a - - N の , , n 1 1 S 座 c , , A 標 0 1 e C , , ] 1 1 , , , 2 ( r 5 0 2 2 a 5 , ) ) n ) s , 0 a , c t R h 2 e i 5 p c 5 r k ) o n , j e T s 2 h s ) r = e 2 s ) h o l d = 5 . 0 ) 実行 # i f 実 行 _ # I T O m n M E U a a パ A M T i m ラ G P P n e メ E L U ( _ ー _ A T I _ タ P T _ M 設 A E P A = 定 T S A G = H _ T E D H _ " = I P _ R = A _ " T m / = " H a x / , i x " x n x x T _ x x E _ d x / M " e x m P : f / a L a * t A u . c T l p h E t n _ S . g r _ j " e D p s I g u R " l , t . O j U p T g P " U T _ P A T H ) まとめ 本記事では、SIFT を用いた特徴点マッチング によって、部分画像が元画像のどこに位置するかを推定し、アフィン変換 で位置を特定する方法を紹介しました。 ...

2025年2月23日 · 12 分 · Nakamura

vttファイルからTEI/XMLを作成する

概要 vttファイルからTEI/XMLファイルを作成する方法の備忘録です。 さらに、IIIFマニフェストから、vttファイルおよびTEI/XMLファイルにアクセスできるようにしてみます。結果、以下のように、TEI/XMLファイルがSeeAlsoに関連づけられ、また「Annotations」タブから、vttファイルの内容にアクセスできます。 https://clover-iiif-demo.vercel.app/?manifest=https://movie-tei-demo.vercel.app/data/sdcommons_npl-02FT0102974177/sdcommons_npl-02FT0102974177_vtt.json 参考 以下の「The Ethiopian Language Archive」における取り組みを参考にしました。特に、TEI/XMLの構造化方法が特に参考になりました。 https://dev.jael.info/documentation/ 例 以下で作成したvttファイルを対象とします。 具体的には、以下の『県政ニュース 第1巻』(県立長野図書館)を使用します。 https://www.ro-da.jp/shinshu-dcommons/library/02FT0102974177 TEI/XMLの作成 作成したTEI/XMLファイルの例は以下です。 https://movie-tei-demo.vercel.app/data/sdcommons_npl-02FT0102974177/sdcommons_npl-02FT0102974177.xml 具体的には以下です。 < < < ? ? t / x x e < < t m m i t / T / e l l C e < t E < < T i - - o i f / e I t / t / E C m m r H i < < < < f i > e < < t e < t I o o o p e l t / p / n / s / i H i f / r / e x b e > r d d s u a e i < t u < < p o < n o < s l e H i < < < < f e < r i t o < < < < < < < < < < b x p e e c s d D t t i b d a / u t n o u b / o e a e l t / p / n / s / i v c e H > d t / a / a / a / a / a / a / a / a / a o t u l l h e e l i t l i v < a b e o t r i < < b u D d a e i < t u < p o < n o < s l i h v e y i < < < < < < < < < < t n < a n < a n < a n < a n < a n < a n < a n < a n < a d > s e x r s e t l i s a l v l s t e c b m / r i r e e d D t t i b p u t n o u p o e s a i a > m w w w w w w w w w w i n u n n u n n u n n u n n u n n u n n u n n u n n u n y > h h m m > c S l e c t i i a i S e s e l o < < < m e b c s r e e l i t l b e o t r u D i n s d e h h h h h h h h h h m o n o n o n o n o n o n o n o n o n > r r a l > t e S a r l c i c t > S D S n t a / i / o f l e c > r s e t l i l s t e c r e o g i e l e e e e e e e e e e e t s o t s o t s o t s o t s o t s o t s o t s o t s o e e t n m > t t i a e l a m 昭 t e t o i v < a m < i n S D > > c S l e c i S e s e c s n e o r i n n n n n n n n n n l a t t a t t a t t a t t a t t a t t a t t a t t a t t f f y s t 県 m i b b n a t t 和 m s r g t a l v p p m o t t e > t e S a c t S D e c D n > n i t a a t a a t a a t a a t a a t a a t a a t a a t a a = = p = > 政 t o u i c b i > 3 t c u r l i i a r u p g a r s m > t t a m t e D > e w D e a a a a a a a a a a n i r t i r t i r t i r t i r t i r t i r t i r t i r t " " e " ニ > n t l e i o 0 > > c > e l c i i b r r r u c t 県 m i t t m s e s h e b b b b b b b b b b e o t i o t i o t i o t i o t i o t i o t i o t i o t i h h n h ュ S o i l n 年 t > a e l n l i > g c > > 政 t o i > t c s c e s u s s s s s s s s s s > n = o n = o n = o n = o n = o n = o n = o n = o n = o t t s t ー t r t t i S に > 県 b n a t i n e t ニ > n o > > c > n c n o o o o o o o o o o B " n B " n B " n B " n B " n B " n B " n B " n B " n t t = t ス m > y a t t 長 政 i c b > s t t > ュ S n > = > i l l l l l l l l l l l # B l # B l # B l # B l # B l # B l # B l # B l # B p p " p t 中 > r y m 野 ニ l e i h > = ー t S " t u u u u u u u u u u o t l o t l o t l o t l o t l o t l o t l o t l o t l : : h : 第 > 村 g > t 県 ュ i l e " ス m t 2 = t t t t t t t t t t c 1 o c 2 o c 3 o c 4 o c 5 o c 6 o c 7 o c 8 o c 9 o / t / 1 覚 e > が ー t t i r h t m 0 " e e e e e e e e e e k " c k " c k " c k " c k " c k " c k " c k " c k " c / t / 巻 < t 制 ス y a t > t 第 > t 2 m = = = = = = = = = = k k k k k k k k k w w p w < / = 作 > r y 信 t 1 > 5 s " " " " " " " " " " x e > x e > x e > x e > x e > x e > x e > x e > x e > w w : w / d " し 第 g > 州 p 巻 - " 0 0 0 0 0 0 0 0 0 0 m n m n m n m n m n m n m n m n m n w w w t i h た 1 e デ s < 0 > 0 0 0 0 0 0 0 0 0 0 l d l d l d l d l d l d l d l d l d . . / . i s t 記 巻 t ジ : / 2 : : : : : : : : : : : = : = : = : = : = : = : = : = : = t t p t t t t 録 < = タ / t - 0 0 0 0 0 0 0 0 0 0 i " i " i " i " i " i " i " i " i " e e u e l r p 映 / " ル / i 1 0 0 0 0 0 1 1 1 1 1 d # d # d # d # d # d # d # d # d # i i r i e i : 像 t h コ w t 8 : : : : : : : : : : = t = t = t = t = t = t = t = t = t - - l - > b / 。 i t モ w l " 0 2 3 5 5 0 0 1 2 3 " 2 " 3 " 4 " 5 " 6 " 7 " 8 " 9 " 1 c c . c u / 次 t t ン w e > 0 5 8 0 5 3 8 8 3 3 a " a " a " a " a " a " a " a " a 0 . . o . t c の l p ズ . > . . . . . . . . . . b > b > b > b > b > b > b > b > b " o o c o o r 8 e s r 作 0 5 5 5 5 5 5 5 5 5 1 ♪ 2 今 3 男 4 ♪ 5 か 6 ♪ 7 そ 8 そ 9 > r r l r r e タ > : 県 o 成 0 0 0 0 0 0 0 0 0 0 " ♪ " 年 " 女 " 〜 " く " " の " の " ま g g c g > a イ / 立 - 0 0 0 0 0 0 0 0 0 0 > ♪ > は > 青 > < > て > ♪ > 日 > 結 > た / / . t ト / 長 d " " " " " " " " " " < 選 年 / 県 < 午 果 こ r r n i ル c 野 a / / 挙 や u 下 / 後 、 れ e e r s v を r 図 . c x x x x x x x x x x u の 婦 > に u 8 長 と l l g e 収 e 書 j h m m m m m m m m m m > 当 人 お > 時 野 同 e e 1 c 録 a 館 p a l l l l l l l l l l た 層 け 県 時 a a d . o す t 所 / n : : : : : : : : : : り は る き 知 に s s s 0 m る i 蔵 s g i i i i i i i i i i 年 も 投 っ 事 、 e e d " m 。 v 資 h e d d d d d d d d d d 。 ち 票 か に 県 / / l > o 「 e 料 i > = = = = = = = = = = 2 ろ 率 り は 議 x x / n 地 c < n " " " " " " " " " " 月 ん 、 、 、 会 m m s s 方 o / s t t t t t t t t t t の の 全 県 前 議 l l c . 選 m p h 1 2 3 4 5 6 7 8 9 1 総 こ 国 下 知 員 / / h o 挙 m u u " " " " " " " " " 0 選 と の 一 事 6 t t e r 終 o b - " 挙 、 上 斉 の 1 e e m g る n l d に こ 位 に 林 名 i i a / 」 s i c 引 の を 即 寅 の / / t l 、 . s o き 老 占 日 氏 当 c c r i 「 o h m 続 人 め 開 が 選 u u o c 地 r e m い も る 票 当 も s s n e 方 g r o て 今 立 が 選 決 t t " n 選 / > n 、 年 派 行 。 定 o o ? s 挙 p s 4 8 な わ < し m m > e 後 u / 月 8 成 れ / ま / / s 初 b l の を 績 ま u し s s / の l i 県 迎 を し > た c c b 県 i b 市 え 収 た 。 h h y 議 c r 町 た め 。 < e e / 会 d a 村 と ま < / m m 4 開 o r と は し / u a a . か m y 八 い た u > / / 0 る a / 木 え 。 > r r / 」 i 0 早 、 < e e " 、 n 2 の そ / l l > 「 / F 選 の u a a h 三 z T 挙 慎 > x x t 十 e 0 で 重 n n t 年 r 1 、 な g g p 度 o 0 長 投 / / : を / 2 野 票 t t / 賄 1 9 県 ぶ e e / う . 7 1 り i i c 県 0 4 1 が _ _ r の / 1 6 老 a a e お " 7 万 い l l a 台 > 7 有 の l l t 所 c " 権 表 . . i 」 c > 者 に r r v 、 0 信 の 一 n n e 「 < 州 関 徹 g g c す / デ 心 さ " " o す l ジ は を m む i タ 非 伺 t t m 土 c ル 常 わ y y o 木 e コ な せ p p n 建 n モ 高 て e e s 設 c ン ま い = = . 」 e ズ り ま " " o 、 > よ す a a r 「 県 う 。 p p g 明 立 で < p p / る 長 す / l l l く 野 。 u i i i 正 図 < > c c c し 書 / a a e く 館 u t t n 健 所 > i i s や 蔵 o o e か 資 n n s に 料 / / / 」 < x x b 、 / m m y 「 r l l / 幕 e " " 4 を f . と > s 0 じ c / た h < 善 e / 光 m l 寺 a i の t c 御 y e 開 p n 帳 e c 」 n e 、 s > 「 = 勇 " ま h し t い t 水 p 防 : 訓 / 練 / 」 r 、 e 「 l お a 国 x じ n ま g ん . 民 o 謡 r 大 g 会 / 」 n < s / / n s o t t r e u > c t u r e / 1 . 0 " ? > IIIFマニフェストファイルの作成 上述したTEI/XMLファイルをseeAlsoに持つIIIFマニフェストファイルを作成しました。 ...

2025年2月21日 · 32 分 · Nakamura

校異源氏物語に対する類似テキスト検索アプリを作成しました。

概要 校異源氏物語に対する類似テキスト検索アプリを作成しました。以下のURLからお試しいただけます。 https://huggingface.co/spaces/nakamura196/genji_predict 本アプリの使用方法などについて紹介します。 データ 以下の校異源氏物語DBで公開されているテキストデータを使用します。 https://kouigenjimonogatari.github.io/ アプリの内容 仕組みは単純で、校異源氏物語の巻毎・ページ毎のテキストを用意しておき、入力された文字列との編集距離を算出し、類似度が高いテキスト(+巻とページ)を返却します。 ソースコードは以下です。 https://huggingface.co/spaces/nakamura196/genji_predict/tree/main 応用例 例えば、以下の「[源氏物語] [4](東京大学総合図書館所蔵)」では、1つのIIIFマニフェスト内に複数の巻が含まれており、何コマ目から何コマ目までが何巻に属するのか、素人には判断が難しい場合があります。 https://da.dl.itc.u-tokyo.ac.jp/portal/assets/b90bbddc-509d-7c12-0fb9-af409a90a487 そこで、上記に資料に対してコマ毎のOCRテキストを取得し、今回作成したアプリに問い合わせることで、ページ毎に推定される巻数が提示され、巻の変わり目を知る手助けを行うことができます。 OCR OCRにあたっては、NDL古典籍OCR-Liteを使用します。 https://github.com/ndl-lab/ndlkotenocr-lite OCR結果を修正して、以下のようなTEI/XMLを作成しました。 < < < < ? ? ? T x x x E < < m m m I t / t l l l e < t e < - - x i f / e x b v m m m H i < < < f i t o < < < e o o l e l t / p / s / i H > d a / a / a r d d n a e i < t u < < p o < s l e y b < < < < < < < < a b < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < a b < < < < < < < < < < < < s e e s d D t t i b p d u u b / o e a > l s l s l s l s b l s l s l s l s l s l s l s l s l s l s l s l s l s l s l s l s l s l s l s b l s l s l s l s l s l s i l l = e e l i t l u a b r i < b u D d n b e b e b e b e > n b e b e b e b e b e b e b e b e b e b e b e b e b e b e b e b e b e b e b e > n b e b e b e b e b e b e o " r s e t l i b t l c b p i r e e = / g / g / g / g = / g / g / g / g / g / g / g / g / g / g / g / g / g / g / g / g / g / g / g = / g / g / g / g / g / g n h h h > c S l e c l e i e l t b c s r " > > > > " > > > > > > > > > > > > > > > > > > > " > > > > > > = r r t > t e S a i > c D > r l e c > 1 t t t t 2 t t t t t t t t t t t t t t t t t t t 3 t t t t t t " e e t m > t t s 2 a e > D > " y y y y " y y y y y y y y y y y y y y y y y y y " y y y y y y 1 f f p t O m i h 0 t s t e p p p p p p p p p p p p p p p p p p p p p p p p p p p p p . = = : > C t o e 2 i c a s t e e e e t e e e e e e e e e e e e e e e e e e e t e e e e e e 0 " " / R > n r 5 o > r c y = = = = y = = = = = = = = = = = = = = = = = = = y = = = = = = " h h / 結 S > - n g > p " " " " p " " " " " " " " " " " " " " " " " " " p " " " " " " t t w 果 t N 0 S e e 本 本 本 本 e 本 本 本 本 本 本 本 本 本 本 本 本 本 本 本 本 本 本 本 e 本 本 本 本 本 本 e t t w : m D 1 t t = 文 文 文 文 = 文 文 文 文 文 文 文 文 文 文 文 文 文 文 文 文 文 文 文 = 文 文 文 文 文 文 n p p w t L - m = " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " c : : . h > 古 2 t " p p p o / t t 典 9 > h a n n n n a n n n n n n n n n n n n n n n n n n n a n n n n n n d / e t 籍 < t g = = = = g = = = = = = = = = = = = = = = = = = = g = = = = = = i w w i p O / t e " " " " e " " " " " " " " " " " " " " " " " " " e " " " " " " n w w - s C d p " 1 3 4 5 " 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 " 1 2 3 4 5 6 g w w c : R a s " " " " " " " " " " " " " 0 1 2 3 4 5 6 7 8 9 " " " " " " = . . . / - t : f f " " " " " " " " " " f " t t o / L e / a c c c c a c c c c c c c c c a c c c c c c U e e r i i > / c o o o o c o o o o o o o o o c c c c c c c c c c c o o o o o o T i i g i t i s r r r r s r r r r r r r r r o o o o o o o o o o s r r r r r r F - - / i e i = r r r r = r r r r r r r r r r r r r r r r r r r = r r r r r r - c c n f < i " e e e e " e e e e e e e e e r r r r r r r r r r " e e e e e e 8 . . s . / f h s s s s h s s s s s s s s s e e e e e e e e e e h s s s s s s " o o / d p . t p p p p t p p p p p p p p p s s s s s s s s s s t p p p p p p ? r r 1 l u d t = = = = t = = = = = = = = = p p p p p p p p p p t = = = = = = > g g . . b l p " " " " p " " " " " " " " " = = = = = = = = = = p " " " " " " / 0 i l . s # # # # s # # # # # # # # # " " " " " " " " " " s # # # # # # r r " t i i : z z z z : z z z z z z z z z # # # # # # # # # # : z z z z z z e e > c s t / o o o o / o o o o o o o o o z z z z z z z z z z / o o o o o o l l . h c / n n n n / n n n n n n n n n o o o o o o o o o o / n n n n n n e e u e . i e e e e i e e e e e e e e e n n n n n n n n n n i e e e e e e a a - r u i - - - - i - - - - - - - - - e e e e e e e e e e i - - - - - - s s t > - i 1 1 1 1 i 2 2 2 2 2 2 2 2 2 - - - - - - - - - - i 3 3 3 3 3 3 e e o t f - - - - f - - - - - - - - - 2 2 2 2 2 2 2 2 2 2 f - - - - - - / / k o . 1 3 4 5 . 1 2 3 4 5 6 7 8 9 - - - - - - - - - - . 1 2 3 4 5 6 x x y k d " " " " d " " " " " " " " " 1 1 1 1 1 1 1 1 1 1 d " " " " " " m m o y l > > > > l > > > > > > > > > 0 1 2 3 4 5 6 7 8 9 l > > > > > > l l . o . 国 紅 は あ . O □ 源 / あ ろ か が を " " " " " " " " " " . ろ 上 詠 ち か ひ / / a . i 外 葉 な ふ i O □ 氏 朱 ま か た り あ > > > > > > > > > > i く 達 は と ほ か t t c a t < の の ひ t O □ 十 雀 り る 〴 給 か 前 青 火 と み に お し 詠 一 t 哀 部 て り の る e e . c c / か え < c < □ 七 院 な べ 〵 。 ず に 海 と な や さ も ぶ な 後 c な み ゝ た 色 と i i j . . s < ん / . / □ 才 の り き 物 う お て 波 の る ま し し み ど 順 . る こ 初 る あ 見 / / p j u e / < s u s □ ノ 行 。 た 見 へ ぼ せ を ゝ を ば た ろ お し 伽 u に た う が ひ え c c / p - g s / e - e □ 十 幸 よ び 給 も さ さ ぞ 頭 。 な る き も 給 の - 。 ち ち く ま 給 u u r / t > e s g t g □ 月 ば の の は な る せ ま 中 立 り に ほ ゝ へ こ t み も な の さ 。 s s e r o g e > o > < よ 。 つ こ ぬ つ れ 給 ひ 将 な 。 。 ど ち る ゑ o か み を に り 春 t t p e k > g k / り 神 ね と こ ぼ ば ふ 給 が ら 入 が に 。 は な k と な し ぎ て 宮 o o o p y > y s 四 無 な 成 と の 。 。 け た び が く 。 よ こ ら y 泪 な 給 は つ の m m / o o o e 年 月 ら け を 。 誠 源 る ち て た の お に れ ん o お き へ ゝ ね 女 / / i / . . g の の ず れ 口 み 楽 氏 。 よ は の こ な 見 や と . と 給 る し よ 御 s s i i a a > 十 十 。 ば お 給 を の か う 。 日 ゑ じ え 仏 聞 a し ぬ に き り 。 c c i i c c 月 日 お 。 し は 御 中 た い 花 か ま ま ぬ の ゆ c 給 < ま に も か h h f i . . 迄 < も 御 < ざ < 将 て 人 の げ さ ひ さ 御 。 . 。 / < < < く e e / f j j 有 / し < / ら / は に に か さ り の ま 迦 お j < s / / / < m m b / p p < s < / s ん s 。 は こ た や 。 あ な < も p / e s s s / a a 9 b / / / e / s e < e < 。 < は か 物 < り / し / s g e e e s / / 0 9 i i s g s e g / g / < / ら < の / 。 s < i e > g g g e r r b 0 i i e > e g > s > s / s の / < s < e / i g > > > g e e b b i i g g > e e s e < s / e / g s i > > l l d b f f > > g g e g / e s g s > e f a a d d / / > > g > s g e > e g / x x c d s s > e > g g > s n n - c o o g > > o g g 5 - t t > t / / 0 5 o o o t t 9 0 _ _ _ e e d 9 o o o i i - d g g g _ _ 7 - a a a a a c 7 i i i l l 1 c _ _ _ l l 2 1 2 2 2 . . - 2 0 0 0 r r 0 - 2 2 2 n n f 0 3 3 3 g g b f 1 1 1 " " 9 b 0 0 0 - 9 / / / t t a - A A A y y f a 0 0 0 p p 4 f 5 5 5 e e 0 4 _ _ _ = = 9 0 4 4 4 " " a 9 / / / a a 9 a 0 0 0 p p 0 9 0 0 0 p p a 0 4 4 4 l l 4 a / / / i i 8 4 A A A c c 7 8 0 0 0 a a / 7 5 5 5 t t m / _ _ _ i i a m 4 4 4 o o n a _ _ _ n n i n 0 0 0 / / f i 0 0 0 x x e f 4 4 4 m m s e _ _ _ l l t s 0 0 0 " " < t 0 0 0 / " 0 0 0 s s t / 1 2 3 c c i > . . . h h t t t t e e l i i i m m e f f f a a > / / / t t f f f y y u u u p p l l l e e l l l n n / / / s s f f f = = u u u " " l l l h h l l l t t / / / t t 0 0 0 p p / / / : : d d d / e e e / f f f r p a a a e u u u u l r l l l a l t t t x . . . . n o j j j g c p p p . l g g g o c " " " r . > > > g r n g s d s s t d r l u / c s t c u h r e e m / a 1 t . r 0 o " n ? " > ? > 推定 上記のXMLファイルを入力として、先に紹介したGradioアプリのAPIを利用します。 ...

2025年1月29日 · 25 分 · Nakamura

Alfrescoのファイルに対して、Archivematicaを使ってAIPを作成する

概要 Alfrescoのファイルに対して、Archivematicaを使ってAIPを作成する方法の一例です。 以下が成果物のデモ動画です。 https://youtu.be/7WCO7JoMnWc システム構成 今回は以下のようなシステム構成とします。複数のクラウドサービスを利用していることに特に意味はありません。 Alfrescoは、以下の記事を参考に、Azure上に構築したものを使用します。 Archivematicaとオブジェクトストレージはmdx.jpを使用し、分析環境はGakuNin RDMを使用します。 オブジェクトストレージへのファイルアップロード Alfrescoからファイルをダウンロード Alfrescoからのファイルダウンロードにあたっては、REST APIを使用します。 https://docs.alfresco.com/content-services/6.0/develop/rest-api-guide/ OpenAPIに準拠しており、以下などを参考にしました。 https://api-explorer.alfresco.com/api-explorer/ 例えば以下により、Alfrescoのユーザ名とパスワード、およびホスト名を環境変数から読み込み、メタデータの取得やコンテンツのダウンロードを行うことができました。 # f i i f # c r m m r l % o p p o % a % m o o m % s r r s d d d d d t t b e e e e a A f f f f t o r s / p n e s e e n i " A " s # l # s s s s } # c e s } s } _ " A " i g " A R " u s t e e g " A " u s } r b o w s } b n q 6 b C _ " r " e o e e e e ) r n e e ) d " r " f e " r e " r e r x x e " r " r e ) e i s i e ) s u 4 s l i " g " l . a 環 l l l l B e c l l e " g " t " g t " l l y c c t " g " l l s n . t l / e / i n A s f e d 境 f f f f a d o f f b デ s s _ ノ s u f : e e _ ノ s f p a m h f 0 i s i 0 e i l : v . n _ 変 . . . . " " " s e d . ' ' . " " u バ : m d e p i n ー : n r d = . r r r p s r p s r n ー : n o = . " " o r a f . " " 0 m t m 0 n t f e v v d 数 u p t _ u p t i n e h a a _ a a g ッ e a l r f o ド o n i _ e e e t e e t e e o ド o u _ u o n y k o i _ s p _ p s p _ t _ r r e の o の s a a d s a a c t d e c u d c u ( グ s t f i d I d s c f d s s t l t l t d の d t f d r u s _ e p l d i a c o o c : _ e b r 読 t 取 e s r e e s r 認 i _ a c t e c t s 情 s a . n d e D e : t " e p p u r f u r f u e コ e p " e l t e d d e e e z t o r r o ( s o b み e 得 r s g b r s g 証 a c d e h b e h e 報 a v t a f s で _ : { b o u h t o r e . r e . r s ン _ u { b " p a i n . b e h r t t r s c s o 込 n w e u " w e の l r e p o u p o l を g ( e ( t o _ ノ i s u n r e i n n q _ n q _ n _ テ i t s u : u = t r ( w u " " e e e o e s み v = o t g : o t ヘ s e r t r g t r f 出 e d r f a r n ー d ノ e g s l a m s u d u d n ン d _ e g t a s o r g : : . l b . l e ( r _ ( r _ ッ d s ' i ( " i , 力 i b " : o ド ー l ( e , d e e r e e N e e N o ツ p l ( u _ r ( u i ( i o 6 i f A ( o o d h " s d h ダ = e : z " : z す ( c o 🔍 k p d 情 ( ド f " e o . e s b o s b o d を ( a f " r p e = o t t " l o p a 4 p , P b = v s o 環 e " o ー n = a ヘ a m る s t s e r e 報 s 情 . A = r u r s t u n t u n e 取 s t . A l a q s p e フ e u y d e y I o e . = s 境 l : s を f t ' t ッ s t e t , e { y i I を t 報 t P s t a p s g e s g e I 得 t h t P , t u r . u ( ァ n t n _ n n v o v r g t 変 f t 作 " i { a i ダ e i s r : m , n d 取 r a I r = = i o . ( . ( d す r a I h e e p t b イ ( p b d c b e C l e r e o 数 . " " 成 { a p o ー l o s ) o e t ( 得 ) r リ e s f s n e " e " _ る ) ( r リ " s s a _ i ル b u o o r l ) r i t s = の u * : s l p n の f n a : p s v ( s す : g ク q e l e s x エ x エ c : s g ク : t p t p n 保 i t 3 t d 4 b i : b d e . 設 s " e s l ' 設 . " g t s a f e る e エ u l o _ e c ラ c ラ o t e エ s o h a a 存 n _ e e o e o e n g o 定 e s l i : 定 h : e メ i a l " l ノ t ス e f a f . e ー e ー n ノ r t ス o . n . t r 完 a p n s n デ s = v e s : r e f = c : e : ッ o g u f ー _ ト s . t o j p : p : t ー ) _ ト u g s d h y 了 r a v e t バ e T ( t . " , l . a f " a " セ n e e , ド h : t h ( r s t " t " e ド : h : t e e i , _ : y t = ッ r ' e g , l f u b t ' , d B s ー a } - I o " s e 3 _ o i , i , n I o " p t . r d " _ h F グ u A n e e . s 6 i B e a t ジ l " i n D s , . a 0 s n o o t D 出 s , u ( c n " a , d a 情 e L v t { n t e 4 o a { r s r ) ) n { o t g d ) t ( n { n { ( 力 t t u o a w t a l 報 ) F ( e ( a r e n s s i , : k d } { e e a ) s " s " s パ } { _ r n m b a { t s を _ ' n s r } n / i [ c d e e / " t r t . t . t e ス / p l t e " ) a e 出 U A v e g : c j c ' d 追 a y _ a u ( s u T y R y l a a , e ( ) ) ) 力 S L ( l e { o s a a 加 t } i l r , s i p e p f l t n o , : す E F ' f t s d o { c t の a : d f l ( m e q e , f h h t u a る R _ A . _ e e n e c * a デ . : r " ) e " u " r e t s か ' P L p h l ( ' n e " : ー i { e : o : e : n e a p ど ) A F a o f c , c p タ t v s s u s o s d u f う S _ s s . r o t d e a t c u t " t " d c e t i か S T s t p e d ' i m l r o r : t E r e o r _ l W A w a d e ] c s u ) / l i x e _ / s p e O R o s e d , t ( e : a } m c q i a = a : R G r s n _ ) } p ) e e u d p s t D E d w t c = : " i o p e : i e h ' T ) o i r ) / u t s / l ) ) _ r a e N - t i t s - f , H i d l d o d " o " t d . O f } s e n e , n , r e h e S " . n e f , f e x T s e t ) a " a " a a i ' e n i : u m s m o u d s ) l c a l e e u l e t f o l t s e s t t r _ . d s - s : s p - s o p e } / a a u / ) k a ( ' p g g t p = s ) u e e _ u T s ) b " " p b r w . l : : a l u o d i t i e r e c " s h c ) d c / リ t : / o a ク r a e d l エ ( s l l e f ス e t f s ( r ト ) r r e ) e が } ) e s タ ) : s N c イ c o o ム o n / ア / e v ウ v , e ト e r し r s ま s i し i o た o n " n s } s / ) / 1 1 / / n n o o d d e e s s / / { { n n o o d d e e _ _ i i d d } } " / c o n t e n t " オブジェクトストレージにファイルをアップロード boto3と、オブジェクトストレージのENDPOINT_URL、ACCESS_KEY、SECRET_KEYおよびBUCKET_NAMEなどを使用して、ファイルのアップロード(とダウンロード)を行います。 ...

2025年1月26日 · 26 分 · Nakamura

Pythonを使ってOmeka Sにメディアをアップロードする方法

概要 Pythonを使ってOmeka Sにメディアをアップロードする方法の備忘録です。 準備 環境変数を用意します。 O O O M M M E E E K K K A A A _ _ _ S S S _ _ _ B K K A E E S Y Y E _ _ _ I C U D R R E E L N D = T E h I N t T T t Y I p = A s L : = / / d e v . o m e k a . o r g / o m e k a - s - s a n d b o x # 例 初期化します。 ...

2025年1月3日 · 7 分 · Nakamura

ジオコーディングのライブラリを試す

概要 ジオコーディングのライブラリを試す機会がありましたので、備忘録です。 対象 今回は、以下のような文字列を対象にしてみます。 岡山市旧御野郡金山寺村。現在の岡山市金山寺。市の中心部からは直線で北方約一〇キロを隔てた金山の中腹にある。 ツール1: Jageocoder - A Python Japanese geocoder まず以下の「Jageocoder」を試します。 https://t-sagara.github.io/jageocoder/ ソースコードの例は以下です。 i i j r p m m a e r p p g s i o o e u n r r o l t t t c t ( o s j j j d s s a e = o o g r n n e . j . o i a d c n g u o i e m d t o p e ( c s r u o ( r d r l e e = r s ' . u h s l t e t t a s p r , s c : h i / ( n / ' d j 岡 e a 山 n g 市 t e 旧 = o 御 2 c 野 , o 郡 d 金 e e 山 n r 寺 s . 村 u i 。 r n 現 e f 在 _ o の a - 岡 s p 山 c r 市 i o 金 i t 山 = o 寺 F . 。 a c 市 l o の s m 中 e / 心 ) j 部 ) s か o ら n は r 直 p 線 c で ' 北 ) 方 約 一 〇 キ ロ を 隔 て た 金 山 の 中 腹 に あ る 。 ' ) 以下の結果が得られました。 ...

2024年12月3日 · 7 分 · Nakamura

LLMに関するメモ

概要 LLMに関するツールについて、備忘録です。 LangChain https://www.langchain.com/ 以下のように説明されていました。 LangChain is a composable framework to build with LLMs. LangGraph is the orchestration framework for controllable agentic workflows. LlamaIndex https://docs.llamaindex.ai/en/stable/ 以下のように説明されていました。 LlamaIndex is a framework for building context-augmented generative AI applications with LLMs including agents and workflows. LangChain と LlamaIndex gpt-4oの回答は以下でした。 LangChainとLlamaIndexはどちらも、LLMs(大規模言語モデル)を利用したアプリケーション開発を支援するフレームワーク 簡単に調べてみたところ、RAG(Retrieval-Augmented Generation)を行う際には、LlamaIndexがより簡単に使用できるようでした。 Ollama https://github.com/ollama/ollama 以下のように説明されていました。 Get up and running with Llama 3.2, Mistral, Gemma 2, and other large language models. ...

2024年11月29日 · 6 分 · Nakamura

GakuNin RDMのAPIを使って、ファイルのアップロードなどを行う

背景 GakuNin RDMのAPIを使って、ファイルのアップロードなどを行う方法の備忘録です。 参考 以下でPAT(パーソナルアクセストークン)の取得方法などを説明しています。 また以下では、OAuth (Open Authorization)を使った方法を紹介しています。Webアプリなどから使用される場合には、こちらが参考になりましたら幸いです。 方法 nbdevを使って、以下のリポジトリを作成しました。 https://github.com/nakamura196/grdm-tools 以下でドキュメントを確認できます。 https://nakamura196.github.io/grdm-tools/ プロバイダ(osfstorage)とフォルダのID(6735a92e6dc8e1001062ac08)は変更する必要がありますが、以下のようなスクリプトにより、特定のフォルダにファイルをアップロードできます。 f i c p f u c r m l r i r l o p i o l l i m o e j e e r n t e _ = n g t t o c p t r k t a f . d o = e _ t " u m s n i h h p _ G = d t l t r o = t o o d s = p a o m . " s d l C e " . : _ s l n y / / f . i v s s / i a e i 8 a f l p n r 6 m i e i t o g p l ( ( n " l e f i . e s i m g . . l p e p r e o t n d _ r ( g m p t ' " . a G n t G R i h r D i , d M . m _ a u C T c r l O . l i K j ) e E p n N / t ' v ) 1 / r e s o u r c e s / { p r o j e c t _ i d } / p r o v i d e r s / o s f s t o r a g e / 6 7 3 5 a 9 2 e 6 d c 8 e 1 0 0 1 0 6 2 a c 0 8 / ? k i n d = f i l e " ソースコードは以下からご確認いただけます。 ...

2024年11月16日 · 2 分 · Nakamura

YOLOv11xと日本古典籍くずし字データセットを用いた文字の検出モデルの構築

概要 YOLOv11xと日本古典籍くずし字データセットを用いた文字の検出モデルの構築を行う機会がありましたので、備忘録です。 http://codh.rois.ac.jp/char-shape/ 参考 過去に、YOLOv5を用いて同様のことを行いました。以下のspacesで動作デモや学習済みモデルをご確認いただけます。 https://huggingface.co/spaces/nakamura196/yolov5-char 以下は、「国宝 金沢文庫文書データベース」の公開画像に対する適用例です。 YOLOv11を用いることで、文字検出の精度向上を狙うことが目的です。 データセットの作成 「日本古典籍くずし字データセット」をダウンロードし、yoloで求められる形式に整形します。 形式は以下などで確認することができます。 https://github.com/ultralytics/hub/tree/main/example_datasets/coco8 画像のサイズを1280x1280に設定 以下のUltralytics HUBを使用しました。 https://hub.ultralytics.com/ 以下が学習結果です。 テストデータに対して適用したところ、良い精度がでる画像データ(例:「『源氏物語』(東京大学総合図書館所蔵)」)もあれば、 あまり良い精度がでない画像データ(例:「国宝 金沢文庫文書データベース」)もありました。 画像のサイズを640x640に設定 エポック数が10の場合 エポック数が10の場合は、エポック数が10の場合、学習が完全に収束していない可能性がありました。 一方、エポック数が少ないにも関わらず、テストデータに対しては、1280x1280のものより良い結果を示すようでした。 エポック数が100の場合 f # m # m r o o o Y d デ d m O e ー e L l タ l d e # b u O セ . a p a l v = ッ t t o i t t 8 ト r a c m c r の Y と a = h g h a 分 O ト i ' s s = l 類 L レ n / = z 2 y モ O ー ( h 1 = 4 t デ ( ニ o 0 2 i ル ' ン m 0 2 c を y グ e , 4 s ロ o 設 / , ー l 定 m i ド o d m 1 x p 1 u o x s r . e t p r t / Y ' y O ) o L l O o # / c N h a a # n r # o s # バ サ _ エ ッ イ 6 ポ 入 チ ズ 4 ッ 力 サ の 0 ク 画 イ 分 _ 数 像 ズ 類 s サ ( モ p イ オ デ l ズ プ ル i シ t ョ / ン d ) a t a . y a m l ' , # デ ー タ セ ッ ト の パ ス バッチサイズが16(デフォルト)では、GPUメモリの使用率が低く、32に設定すると、OutOfMemoryErrorになってしまいました。 ...

2024年11月6日 · 5 分 · Nakamura

mdx.jpを用いてYOLOv11のクラス分類(くずし字認識)の学習を試す

概要 mdx.jpを用いてYOLOv11のクラス分類(くずし字認識)の学習を行う機会がありましたので、備忘録です。 データセット 以下の「くずし字データセット」を対象にします。 http://codh.rois.ac.jp/char-shape/book/ データセットの作成 yoloの形式に合致するようにデータセットを整形します。まず、書名ごとに分かれているデータをフラットにマージします。 # c | l a e s x s d p e o C f r l t a c # f # f s r i o s e " l o r i a . e u f t . s t f c o i # o s i e / p i l u f s h c _ d = u l s t p . u a d a t e p o r m t t a t g _ = u s c i a i i t a l d i t . o n k l o a / o i n f _ p n t e . n s * b r i f a t ( d c : e / ( t l i t i f i o t c i = q e l h n " r p ( h n d . e . u C s y s a p " m s e e o ( ( e r u . ( p = x p f f l a t . f l i y " i f c _ / i i f s i { l , t f d l t " t n o e e i a e ( { s g u , i r l t s " o ( t n s e a ) / u o { p o p / _ / : " t u f u u u * p d ) p t i t t t / a a [ u p l _ p _ * t t - t u e d u f . h a 2 _ t } i t i j ) s ] d _ r _ l p e i f t } f e g t r i o / i _ " " } l { l p / e { c e a { ) o l ) t c : u s h l t } , s p " } u , o / t u { _ e t f f x p i i i u l l s t e e t _ . } _ d s " o i p ) k r l = ) i T : t r ( u ' e / ) ' ) [ - 1 ] } " 次に、以下のようなスクリプトにより、データセットを分割します。 ...

2024年11月6日 · 34 分 · Nakamura

Omeka Sの特定のvocabularyのプロパティ一覧を取得する

概要 Omeka Sの特定のvocabularyのプロパティ一覧を取得する方法です。 方法 以下を対象にします。 https://uta.u-tokyo.ac.jp/uta/api/properties?vocabulary_id=5 次のプログラムにより、プロパティ一覧をMS Excelに書き込みます。 i i u p d w r f # d d m m r a a h e o f f p p l g t i m r D . o o e a l o a = t r r = _ e r d i d p v d f t o t t = l e a f a a e a o a p _ " i 1 s t t g _ t r F d e p r h 1 s : p a l a e k a r . x a e t t o e b _ e k i a D c n q t n = n r l + y i e f m a e d u p = s ( e i = s n y e t l a e s e r d a s k に a ( s s : [ e a k t 1 = d i e d 変 F " t / ] = s t . a n y e 換 r a a s / p a e [ t l a r s u r o ) x " a r i m c t e n t @ _ e n d e h p a q s = e c l m a ( i d . u e = n o i o d t d v u e . d n s v a a a e - s j 0 ( t t e t [ t s t t s : d e : _ a k a h o s o a x k : e _ u k . n t t e y l b y g ( a " y ] i . o e ) ) , s s x . t : t l a ( " ) s c u @ x . r i " j l d , p " / + , i u n t " " d a & @ e / p t x a a y = p g p F i e e a / = " l p " , s r e o + " ) p o e s : r t v t r o i ( c e p a s a b ? g u v e l o ) a c ) r a y b " u , l a " r o y : _ i i d d " = , 5 " " o : l o c a l _ n a m e " ] 結果 以下のようなMS Excelが得られます。 ...

2024年11月5日 · 6 分 · Nakamura