nakamura196 commited on
Commit
3f6ca1a
·
1 Parent(s): 44a3155

feat: add tei xml option

Browse files
Files changed (1) hide show
  1. app.py +76 -23
app.py CHANGED
@@ -1,13 +1,31 @@
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
  from Levenshtein import ratio
3
- import json
4
 
5
- data_path = "./data.json"
6
 
7
- with open(data_path, "r") as f:
8
  documents_data = json.load(f)
9
 
10
- def search_similar_texts(query, selected_vols, top_n=5):
 
 
 
 
 
 
 
 
 
 
11
  results = []
12
 
13
  for doc in documents_data:
@@ -24,24 +42,58 @@ def search_similar_texts(query, selected_vols, top_n=5):
24
  results.sort(key=lambda x: x["score"], reverse=True)
25
  top_results = results[:top_n] # top_nで指定された件数だけを取得
26
 
27
- '''
28
- # top_n件の結果における巻ごとの件数をカウント
29
- vol_counts = {}
30
- total_results = len(top_results)
31
-
32
- for doc in top_results:
33
- vol_str = f"巻{doc['vol']}"
34
- vol_counts[vol_str] = vol_counts.get(vol_str, 0) + 1
35
 
36
- # 巻ごとの割合を計算
37
- vol_percentages = {
38
- vol: f"{(count/total_results*100):.1f}%"
39
- for vol, count in vol_counts.items()
40
- } if total_results > 0 else {}
41
 
42
- return [top_results, vol_percentages] # リストとして返す
43
- '''
 
 
44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  return [top_results] # , vol_percentages
46
 
47
  # Gradioインターフェースの作成
@@ -55,19 +107,20 @@ demo = gr.Interface(
55
  multiselect=True,
56
  value=[],
57
  ),
58
- gr.Slider(minimum=1, maximum=10, value=5, step=1, label="表示件数")
 
59
  ],
60
  outputs=[
61
  gr.JSON(),
62
  # gr.JSON(label="巻ごとの割合")
63
  ],
64
  title="校異源氏物語 類似テキスト検索",
65
- description="テキストを入力すると、校異源氏物語の類似する箇所を検索します。",
66
  allow_flagging="never",
67
  examples=[
68
- ["同五源氏誕生より十二才まて有いづれの御時にか。女御更衣ありさふらひ浴けるなかにいとやむこ□□□となききはにはあらぬかすぐれてとき���き給ふありけりはしめよりわれはと思ひあがり給へる御かためざましきものにおとしめそねみ給おなじほどそれより下らうの更衣たちはましてやすからすあさ夕の宮つかへにつけても人の心をうこかしうらみをおふつもりにや有けん銅大世更衣いとあづしくなりゆきもの心ほそけにさとがちなるをいよあかすあつれなるものにおほゝして人のそしりをもえはゞからせ給はす世のためしにもなりぬべき御もてなしなりかんだちめうへ人などもあひなくめを", [], 5]
69
  ]
70
  )
71
 
72
  # インターフェースの起動
73
- demo.launch()
 
1
+ """校異源氏物語の類似テキスト検索システム
2
+
3
+ このモジュールは、校異源氏物語のテキストデータベースに対して
4
+ 類似テキスト検索を行うWebインターフェースを提供します。
5
+ """
6
+
7
+ import json
8
+ import xml.etree.ElementTree as ET
9
+
10
  import gradio as gr
11
  from Levenshtein import ratio
 
12
 
13
+ DATA_PATH = "./data.json"
14
 
15
+ with open(DATA_PATH, "r", encoding="utf-8") as f:
16
  documents_data = json.load(f)
17
 
18
+ def predict(query, selected_vols, top_n=5):
19
+ """テキストの類似度を計算し、上位の結果を返す
20
+
21
+ Args:
22
+ query (str): 検索クエリテキスト
23
+ selected_vols (list): 検索対象の巻のリスト
24
+ top_n (int, optional): 返す結果の数. デフォルトは5
25
+
26
+ Returns:
27
+ list: スコア順にソートされた上位n件の検索結果
28
+ """
29
  results = []
30
 
31
  for doc in documents_data:
 
42
  results.sort(key=lambda x: x["score"], reverse=True)
43
  top_results = results[:top_n] # top_nで指定された件数だけを取得
44
 
45
+ return top_results
46
+
 
 
 
 
 
 
47
 
48
+ def extract_text_from_lines(element):
49
+ """本文タイプの要素からテキストを抽出する"""
50
+ lines = element.findall(".//*[@type='本文']")
51
+ return ''.join(line.text for line in lines)
 
52
 
53
+ def format_prediction_result(result):
54
+ """予測結果を 'vol-page' 形式にフォーマットする"""
55
+ first_result = result[0]
56
+ return f'{first_result["vol"]}-{first_result["page"]}'
57
 
58
+ def search_similar_texts(query, selected_vols, top_n=5, xml_file=None):
59
+ """テキストの類似検索を実行する関数
60
+
61
+ Args:
62
+ query (str): 検索クエリテキスト
63
+ selected_vols (list): 検索対象の巻のリスト
64
+ top_n (int, optional): 返す結果の数. デフォルトは5
65
+ xml_file (gradio.File, optional): 比較対象のXMLファイル
66
+
67
+ Returns:
68
+ list: 検索結果のリスト。XMLファイル処理時は[predict_results]、
69
+ 通常検索時は[top_results]を返す
70
+ """
71
+ if xml_file is not None:
72
+ try:
73
+ # Gradioのファイルオブジェクトから名前を取得して直接ファイルを開く
74
+ xml_content = xml_file.name
75
+ tree = ET.parse(xml_content)
76
+ root = tree.getroot()
77
+
78
+ # ページ要素の取得
79
+ elements = root.findall(".//*[@type='page']")
80
+
81
+ # 予測実行
82
+ predict_results = {}
83
+ for i, element in enumerate(elements, 1): # enumerate(elements, 1)で1から開始
84
+ text = extract_text_from_lines(element)
85
+ top_results = predict(text, selected_vols, 1)
86
+ predict_results[str(i)] = format_prediction_result(top_results)
87
+
88
+ return [predict_results]
89
+
90
+ except (ET.ParseError, FileNotFoundError, PermissionError) as e:
91
+ print(f"XMLファイルの処理中にエラーが発生しました: {str(e)}")
92
+ return [[], {}]
93
+
94
+
95
+ top_results = predict(query, selected_vols, top_n)
96
+
97
  return [top_results] # , vol_percentages
98
 
99
  # Gradioインターフェースの作成
 
107
  multiselect=True,
108
  value=[],
109
  ),
110
+ gr.Slider(minimum=1, maximum=10, value=5, step=1, label="表示件数"),
111
+ gr.File(label="TEI/XMLファイル")
112
  ],
113
  outputs=[
114
  gr.JSON(),
115
  # gr.JSON(label="巻ごとの割合")
116
  ],
117
  title="校異源氏物語 類似テキスト検索",
118
+ description="テキストを入力すると、校異源氏物語の類似する箇所を検索します。TEI/XMLファイルのアップロードにあたっては、[こちら](https://zenn.dev/nakamura196/articles/e9238881bbc4f7#ocr)をご覧ください。",
119
  allow_flagging="never",
120
  examples=[
121
+ ["同五源氏誕生より十二才まて有いづれの御時にか。女御更衣ありさふらひ浴けるなかにいとやむこ□□□となききはにはあらぬかすぐれてときめき給ふありけりはしめよりわれはと思ひあがり給へる御かためざましきものにおとしめそねみ給おなじほどそれより下らうの更衣たちはましてやすからすあさ夕の宮つかへにつけても人の心をうこかしうらみをおふつもりにや有けん銅大世更衣いとあづしくなりゆきもの心ほそけにさとがちなるをいよあかすあつれなるものにおほゝして人のそしりをもえはゞからせ給はす世のためしにもなりぬべき御もてなしなりかんだちめうへ人などもあひなくめを", [], 5, None]
122
  ]
123
  )
124
 
125
  # インターフェースの起動
126
+ demo.launch()