Spaces:
Configuration error
Configuration error
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 | |
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 | |
def get_report(): | |
df = get_data() | |
report = ProfileReport(df, title='Report', minimal=True).to_html() | |
return report | |
if __name__ == '__main__': | |
main() | |