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()