File size: 5,635 Bytes
6191726
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import pandas as pd
import streamlit as st
import streamlit.components.v1 as components
import re
from pandas_profiling import ProfileReport

def main():
  st.title("台灣南島語-華語句庫資料集")
  st.subheader("Dataset of Formosan-Mandarin sentence pairs")
  st.markdown(
    """
![visitors](https://visitor-badge.glitch.me/badge?page_id=howard-haowen.Formosan-languages)

### 資料概要
- 🎢 資料集合計約13萬筆台灣南島語-華語句對
- ⚠️ 此查詢系統僅供教學與研究之用,內容版權歸原始資料提供者所有

### 資料來源
- 以下資料經由網路爬蟲取得。
   + 🥅 九階教材: [族語E樂園](http://web.klokah.tw)
   + 💬 生活會話: [族語E樂園](http://web.klokah.tw)
   + 🧗 句型: [族語E樂園](http://web.klokah.tw)
   + 🔭 文法: [臺灣南島語言叢書](https://alilin.apc.gov.tw/tw/)
- 詞典資料使用`PDFMiner` 將2019版的PDF檔轉成HTML,再用`BeautifulSoup`抓取句對,偶爾會出現族語跟華語對不上的情形。若發現錯誤,請[聯絡我📩](https://github.com/howard-haowen)。詞典中重複出現的句子已從資料集中刪除。
   + 📚 詞典: [原住民族語言線上詞典](https://e-dictionary.apc.gov.tw/Index.htm?fbclid=IwAR18XBJPj2xs7nhpPlIUZ-P3joQRGXx22rbVcUvp14ysQu6SdrWYvo7gWCc)

### 查詢方法
- 🔭 過濾:使用左側欄功能選單可過濾資料來源(可多選)與語言,也可使用華語或族語進行關鍵詞查詢。
  - 🔍 關鍵詞查詢支援[正則表達式](https://zh.wikipedia.org/zh-tw/正则表达式)。
  - 🥳 族語範例: 
    + 使用`cia *`查詢布農語,能找到包含`danumcia`、`luduncia`或`siulcia`等詞的句子。
    + 使用`[a-z]{15,}`查詢任何族語,能找到包含15個字母以上單詞的句子,方便過濾長詞。
  - 🤩 華語範例: 
    + 使用`^有一`查詢華語,能找到使用`有一天`、`有一塊`或`有一晚`等詞出現在句首的句子。
    + 使用`[0-9]{1,}`查詢華語,能找到包含羅馬數字的句子,如`我今年16歲了`。
- 📚 排序:點選標題列。例如點選`族語`欄位標題列內的任何地方,資料集便會根據族語重新排序。
- 💬 更多:文字長度超過欄寬時,將滑鼠滑到欄位上方即可顯示完整文字。
- 🥅 放大:點選表格右上角↘️進入全螢幕模式,再次點選↘️返回主頁。

"""
)
  # fetch the raw data
  df = get_data()
  # pd.set_option('max_colwidth', 600)
  
  # remap column names
  zh_columns = {'Lang_En': 'Language','Lang_Ch': '語言_方言', 'Ab': '族語', 'Ch': '華語', 'From': '來源'}
  df.rename(columns=zh_columns, inplace=True)
  
  # set up filtering options
  source_set = df['來源'].unique()
  sources = st.sidebar.multiselect(
        "請選擇資料來源",
        options=source_set,
        default='詞典',)
  langs = st.sidebar.selectbox(
        "請選擇語言",
        options=['布農','阿美','撒奇萊雅','噶瑪蘭','魯凱','排灣','卑南',
                 '泰雅','賽德克','太魯閣','鄒','拉阿魯哇','卡那卡那富',
                 '邵','賽夏','達悟'],)
  texts = st.sidebar.radio(
        "請選擇關鍵詞查詢文字類別",
        options=['華語','族語'],)
    
  # filter by sources
  s_filt = df['來源'].isin(sources)
  
  # select a language 
  if langs == "噶瑪蘭":
    l_filt = df['Language'] == "Kavalan"
  elif langs == "阿美":
    l_filt = df['Language'] == "Amis"
  elif langs == "撒奇萊雅":
    l_filt = df['Language'] == "Sakizaya"
  elif langs == "魯凱":
    l_filt = df['Language'] == "Rukai"
  elif langs == "排灣":
    l_filt = df['Language'] == "Paiwan"
  elif langs == "卑南":
    l_filt = df['Language'] == "Puyuma"
  elif langs == "賽德克":
    l_filt = df['Language'] == "Seediq"
  elif langs == "邵":
    l_filt = df['Language'] == "Thao"
  elif langs == "拉阿魯哇":
    l_filt = df['Language'] == "Saaroa"
  elif langs == "達悟":
    l_filt = df['Language'] == "Yami"
  elif langs == "泰雅":
    l_filt = df['Language'] == "Atayal"
  elif langs == "太魯閣":
    l_filt = df['Language'] == "Truku"
  elif langs == "鄒":
    l_filt = df['Language'] == "Tsou"
  elif langs == "卡那卡那富":
    l_filt = df['Language'] == "Kanakanavu"
  elif langs == "賽夏":
    l_filt = df['Language'] == "Saisiyat"
  elif langs == "布農":
    l_filt = df['Language'] == "Bunun"
  
  # create a text box for keyword search
  text_box = st.sidebar.text_input('在下方輸入華語或族語,按下ENTER後便會自動更新查詢結果')

  # search for keywords in Mandarin or Formosan 
  t_filt = df[texts].str.contains(text_box, flags=re.IGNORECASE)
  
  # filter the data based on all criteria
  filt_df = df[(s_filt)&(l_filt)&(t_filt)]
  
  st.markdown(
    """
### 查詢結果
"""
)
  # display the filtered data
  st.dataframe(filt_df, 800, 400)
 
  st.markdown(
    """
### 資料統計
"""
)
  # display a data profile report
  report = get_report()
  components.html(report, width=800, height=800, scrolling=True)  
  
# Cache the raw data and profile report to speed up subseuqent requests 
@st.cache
def get_data():
  df = pd.read_pickle('Formosan-Mandarin_sent_pairs_139023entries.pkl')
  df = df.astype(str, errors='ignore')
  df = df.applymap(lambda x: x[1:] if x.startswith(".") else x)
  df = df.applymap(lambda x: x.strip())
  filt = df.Ch.apply(len) < 5
  df = df[~filt]
  return df

@st.cache
def get_report():
  df = get_data()
  report = ProfileReport(df, title='Report', minimal=True).to_html()
  return report

if __name__ == '__main__':
  main()