項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 search-input 尚未註冊或是沒有一個 view.php 檔案.

【英文文本處理】單字學習 week 1 – 形成文章詞頻統計

情境敘述

在設定每日看兩篇財經新聞後的現在,因財經政治領域的單字苦手而進度嚴重落後,在一一查詢生字的過程中想到了之前系統性處理文本資料的流程,或許能讓自己優先處理重點生字來加速對文章的理解,而開始下列的操作。

狀態敘述

  • 僅使用單篇文章(先忽略統計操作帶來的助益)
  • 未使用任何字集
  • 無文章理解
  • 不參考他人作法下的直覺(?)操作

使用套件

import re
from collections import Counter

流程

直接貼入文章後第一步要做的是切割文字成字集,由於英文字元稀少相當的友善,我們可以用
“`re“` 的反選擇將非字母和數字的字元通通挑出做為切割依據(*p1)

syb_set = "".join(list(set(re.findall(r"\W",article))))

syb_set得到如此的字串

":©. ( ”—‘)“,?]/$[- ’"

但由於特定字的出現目前要手動跳脫成以下字串(*p2)

"[:©.\u2009(\xa0”—‘)“,?\]/$\[\- ’\n]"

此時即可將文章切割成文字清單(文章順便全部改小寫方便計數)

word_raw = re.split("[:©.\u2009(\xa0”—‘)“,?\]/$\[\- ’\n]",article.lower())

引入Counter的特性直接查看計數後的結果

word_count = Counter(word_raw)
word_count
________output________
Counter({'': 336,
         '5tn': 1,
         'a': 49,
         'abide': 1,
         'able': 1,
         'about': 3,
         'accenture': 1,...

挑掉不必要的部分如空字串、包含數字的詞和stop word,停用詞可從word_count.keys()中手動挑掉(自己造一個清單(*p3)),其他部分連同停用詞清單在重建字典時利用條件處理完成

stop_word = ['and', 'are', 'the', 'have', 'in', 'a', 'but', ...]
cleaner_word_count = Counter({k:v for k,v in word_count.items() if
                              (not bool(re.search("\d",k))) and \
                              (k != "") and \
                              (k not in stop_word)})

如此就可得到陽春版的詞集以及詞頻了
可用 cleaner_word_count.most_common() 查看依照詞頻排序的結果。

成果

  • 簡易的文章詞彙、詞頻呈現。
  • 一日英文的閱讀時間改成寫玩具所造成的壓力感

問題點

  • p1:縮寫和其他可能帶有符號的詞彙會被不當處理,字的變形會被視為不同類。
  • p2、3:非完全自動,帶入字典、詞集的必要性高。
  • 似乎對學英文沒什麼幫助
  • 若以生字學習為目標,在停用詞外可能還要附帶熟練度的抽象資料來影響呈現結果。

後續方向

  • 列入足夠多的文章後開始帶入統計手法。
  • 解決目前未自動化的部分
  • 完善詞集建立。
  • (遠程)嘗試連結具記憶曲線資料的應用。
  • (遠程)嘗試建構英文學習的輔助閱讀介面(視覺化問題(但目前想到的都是英文教學者要求不要做的事,像是直接顯示中文之類的XD))

程式碼片段

import re
from collections import Counter as ct

# 帶入自己的文章
article = """...
"""
# 此動作尚未自動化
#syb_set = "".join(list(set(re.findall(r"\W",article))))
syb_set = "[:©.\u2009(\xa0”—‘)“,?\]/$\[\- ’\n]"
words_raw = re.split(syb_set, article.lower())
words_count = ct(words_raw)

# 需自行建構
stop_word = []
cleaner_words_count = ct({k:v for k,v in words_count.items() if 
                                    (not bool(re.search("\d",k))) and \
                                    (k != "") and \
                                    (k not in stop_word)})
cleaner_words_count.most_common()
Yang Sheep
Yang Sheep
文章: 2