隨著 AI 的大熱祈搜,我的好奇心也受到了吸引缕减。閱讀了一些文章后發(fā)現(xiàn)庭再,Pyhton 是一個非常適合 AI 編程的語言捞奕。于是開始了對其打怪升級的探索。
探索中發(fā)現(xiàn)拄轻,Python 提供豐富的庫來幫助開發(fā)者們進(jìn)行數(shù)據(jù)分析颅围。自己由于工作需要,正好在準(zhǔn)備托福寫作恨搓。于是院促,當(dāng) Python 遇上 Tofel,一場美麗的邂逅便展開了斧抱。
目標(biāo)
筆者完成了 5 篇托福作文后常拓,想分析一下哪些詞是我最常用的,進(jìn)而學(xué)習(xí)這些詞的同義詞辉浦,擴(kuò)大詞匯量弄抬,然后在作文中自由替換。
思路
- 利用 Python 讀取文件
- 統(tǒng)計(jì)每篇文章的詞頻
- 合并 5 篇文章的詞頻
- 輸出前 10 詞頻的單詞
行動
STEP 1:
筆者使用 Evernote 進(jìn)行寫作宪郊,其支持導(dǎo)出 hmtl 格式文件掂恕。導(dǎo)出后,重命名文件方便讀取废膘。
STEP 2:
通過分析 html 文件竹海,我發(fā)現(xiàn)正文都在 <body> 中。通過查詢丐黄,發(fā)現(xiàn) BeautifulSoup 庫可以幫助處理 html 格式文件斋配。
于是:
def filter_html(html):
soup = BeautifulSoup(html, 'html.parser')
# 需要過濾<title>標(biāo)簽,避免作文題目干擾
text = soup.body.get_text()
return text
STEP 3:
接下來,需要統(tǒng)計(jì)一篇文章中每個單詞的出現(xiàn)個數(shù)艰争。這里主要用到了 re, collections.counter 兩個 Python 內(nèi)置對象坏瞄。
def calculate_words_frequency(file):
# 讀取文件
with open(file) as f:
# html 處理
f = filter_html(f)
line_box = []
word_box = []
# 轉(zhuǎn)成小寫并將句子分成詞
line_box.extend(f.strip().lower().split())
# 去除標(biāo)點(diǎn)符號的影響
for word in line_box:
if not word.isalpha():
word = filter_puctuation(word)
word_box.append(word)
# 統(tǒng)計(jì)詞頻
word_box = fileter_simple_words(collections.Counter(word_box))
return word_box
這里解釋一下 filter_puctuation()
這個函數(shù)。當(dāng)筆者輸出詞頻結(jié)果時甩卓,發(fā)現(xiàn)由于標(biāo)點(diǎn)符號的存在鸠匀,很多單詞的尾部會跟著. , or ?
為了避免標(biāo)點(diǎn)對詞頻統(tǒng)計(jì)的干擾,筆者使用了簡單的正則去過濾掉標(biāo)點(diǎn)逾柿。(正則不太會缀棍,測試時夠用,應(yīng)該有更簡單和全面的寫法)
# 過濾單詞尾部的,.?"和頭部的"
def filter_puctuation(word):
return re.sub(r'(\,$)|(\.$)|(\?$)|(\"$)|(^\")', '', word)
STEP 4:
在測試結(jié)果集的時候發(fā)現(xiàn)机错,排名靠前的單詞都是介詞爬范,代詞,連詞等常用詞弱匪。如 he
, and
, that
. 但這些詞并不是筆者想要的青瀑,于是需要先把常用簡單詞匯給過濾掉,再統(tǒng)計(jì)詞頻萧诫。(我手動敲了一些斥难,應(yīng)該網(wǎng)上有更全的清單)
def fileter_simple_words(words):
# 過濾詞清單
simple_words = ['the', 'a', 'an', 'to', 'is',
'am', 'are', 'the', 'that', 'which',
'i', 'you', 'he', 'she', 'they',
'it', 'of', 'for', 'have', 'has',
'their', 'my', 'your', 'will', 'all',
'but', 'while', 'with', 'only', 'more',
'who', 'should', 'there', 'can', 'might',
'could', 'may', 'be', 'on', 'at',
'after', 'most', 'even', 'and', 'in',
'best', 'better', 'as', 'no', 'ever',
'me', 'not', 'his', 'her'
]
# words type is counter.
for word in list(words):
if word in simple_words:
del words[word]
return words
STEP 5:
快接近尾聲啦。在統(tǒng)計(jì)完 1 篇文章的詞頻后帘饶,我需要將 5 篇文章的詞頻求和哑诊。鑒于 counter
對象的可加性,于是
def multiple_file_frequency(files):
total_counter = collections.Counter()
for file in files:
total_counter += calculate_words_frequency(file)
return total_counter
STEP 6:
求和之后尖奔,我想知道前 10 高頻的詞匯是哪些搭儒。
def most_common_words(files, number):
total_counter = multiple_file_frequency(files)
return total_counter.most_common(number)
STEP 7:
最后,使用 Python 可視化工具把結(jié)果生成柱狀圖提茁。
def draw_figures(figures):
labels, values = zip(*figures)
indexes = np.arange(len(labels))
width = 0.5
plt.bar(indexes, values, width)
plt.xticks(indexes, labels)
plt.show()
大功告成淹禾。
學(xué)托福
好不容易算出來了結(jié)果,當(dāng)然要好好利用啦茴扁。
通過同義詞網(wǎng)站 Thesaurus铃岔,我可以查詢單詞的同義詞。Take parents
and teachers
as examples.
接下來我會選取一些同義詞進(jìn)行記憶峭火,提高自己的詞匯量毁习,然后在寫作中靈活替換,從而提高寫作能力卖丸。當(dāng)然纺且,考試時,也會提高分?jǐn)?shù)稍浆。
畢竟 appropriate word choice
是托福寫作的一項(xiàng)考核標(biāo)準(zhǔn)载碌。
改進(jìn)
花了半天時間做這個小 Demo猜嘱,有一些地方是自己覺得可以以后繼續(xù)研究的。
- 簡單詞的詞庫更新
- 自動批量讀取文件嫁艇,無需重命名朗伶,手動輸入
- 數(shù)據(jù)圖更直觀,美觀 (研究 numpy, pandas, matplotlib.pyplot)
- 結(jié)果存儲為 cvs步咪,便于日后使用