Spaces:
Configuration error
Configuration error
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()
|