2024年11月25日 星期一

淺談MapReduce,用ChatGPT來產生中英文字詞統計程式

以下的文章和程式都是用ChatGPT產生,本篇文章主要是探討字詞統計程式。

本篇程式是統計單字出現次數,並且可以處理多次輸入,具有廣泛的應用場景。以下是幾個常見的應用領域:

文字分析與自然語言處理 (NLP)

  • 詞頻分析 (Word Frequency Analysis): 用於分析文本中單字的出現次數,挖掘出重要的關鍵字或熱門話題。
  • 情感分析 (Sentiment Analysis): 藉由詞頻統計,了解使用者的情緒傾向,例如正面或負面的用詞。
  • 生成詞雲 (Word Cloud): 統計詞頻後用來生成詞雲,作為可視化展示工具。

2. 學術與教育

  • 閱讀理解測驗: 統計學生在文章中使用或理解的單字,幫助教師評估學生的詞彙能力。
  • 語言學研究: 用於語料庫中詞頻的分析,協助研究某一語言的使用特性。
  • 作文輔助: 幫助學生或作家了解某篇文章中重複使用的詞,改善文字表達。

3. 企業與市場研究

  • 客戶回饋分析: 分析客戶評論中的詞頻,快速找出客戶最常提到的關鍵點(如問題或優點)。
  • 社群媒體監控: 統計用戶在社群媒體上提到某品牌或主題的頻率,追蹤流行趨勢。
  • SEO 優化: 統計網站文章中的關鍵字,優化搜尋引擎排名。

4. 數據處理與監控

  • 日誌分析 (Log Analysis): 分析伺服器或應用程式日誌中的關鍵字,排查錯誤或監控異常活動。
  • 大數據預處理: 將海量文本資料切割、分類,統計詞頻,作為機器學習的特徵輸入。

5. 遊戲與娛樂

  • 文字遊戲: 用於開發文字相關的遊戲,例如文字拼圖或詞頻挑戰遊戲。
  • 劇本分析: 統計劇本中角色的對話詞頻,分析角色的重要性或語言風格。

6. 法律與媒體

  • 法律文件分析: 統計法律文本中關鍵術語的頻率,用於案件的準備或合同分析。
  • 新聞文章分析: 分析新聞文本中的詞頻,判斷媒體報導的重點和角度。

總結:

這樣的程式對任何涉及文字數據處理分析的場合都非常實用,尤其適合需要快速統計並提取信息的場景。

範例一、一個簡單的 Python 程式,可以從終端機讀取使用者輸入的字串並將其顯示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 從終端機讀取字串並輸出
def main():
    # 提示使用者輸入
    user_input = input("請輸入一段文字:")
    
    # 輸出使用者輸入的文字
    print(f"您輸入的文字是:{user_input}")

if __name__ == "__main__":
    main()

執行結果:
請輸入一段文字:今天天氣很好
您輸入的文字是:今天天氣很好

範例二、從終端機讀取一段文字,將其切割成單字,並輸出結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 從終端機讀取字串並切割成單字
def main():
    # 提示使用者輸入
    user_input = input("請輸入一段文字:")
    
    # 切割文字為單字(以空白為分隔符)
    words = user_input.split()
    
    # 輸出切割結果
    print("切割後的單字為:")
    for word in words:
        print(word)

if __name__ == "__main__":
    main()

ChatGPT給出的測試句字和執行結果:

執行結果:
請輸入一段文字:今天天氣很好,我想去散步。
切割後的單字為:
今天天氣很好,我想去散步。

改輸入英文,執行結果:
請輸入一段文字:The weather is nice today and I want to go for a walk.
切割後的單字為:
The
weather
is
nice
today
and
I
want
to
go
for
a
walk.

範例三、讀取一段文字,切割成單字,並使用映射將每個單字及其出現次數存入字典

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 從終端機讀取字串,切割成單字,並計算每個單字的出現次數
def main():
    # 提示使用者輸入
    user_input = input("請輸入一段文字:")
    
    # 切割文字為單字(以空白為分隔符)
    words = user_input.split()
    
    # 使用字典計算單字出現次數
    word_count = {}
    for word in words:
        word_count[word] = word_count.get(word, 0) + 1  # 如果單字不存在,預設為 0
    
    # 輸出結果
    print("單字出現次數:")
    for word, count in word_count.items():
        print(f"{word}: {count}")

if __name__ == "__main__":
    main()

執行結果:
請輸入一段文字:The weather is very good today. I went for a walk today. I had a great time walking.
單字出現次數:
The: 1
weather: 1
is: 1
very: 1
good: 1
today.: 2
I: 2
went: 1
for: 1
a: 2
walk: 1
had: 1
great: 1
time: 1
walking.: 1

歸約(Reduce)可以將資料進一步簡化或統合,例如計算單字總數。以下是整合 Map 和 Reduce 的程式範例,使用 Python 的 functools.reduce 進行歸約。

範例四、計算所有單字的總出現次數

 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
from functools import reduce

# 從終端機讀取字串,切割成單字,計算單字出現次數並進行歸約
def main():
    # 提示使用者輸入
    user_input = input("請輸入一段文字:")
    
    # 切割文字為單字(以空白為分隔符)
    words = user_input.split()
    
    # 使用字典計算單字出現次數
    word_count = {}
    for word in words:
        word_count[word] = word_count.get(word, 0) + 1  # 如果單字不存在,預設為 0
    
    # 使用 Reduce 計算單字的總出現次數
    total_count = reduce(lambda acc, count: acc + count, word_count.values(), 0)
    
    # 輸出結果
    print("單字出現次數:")
    for word, count in word_count.items():
        print(f"{word}: {count}")
    
    print(f"單字總出現次數:{total_count}")

if __name__ == "__main__":
    main()

執行結果:
請輸入一段文字:The weather is very good today. I went for a walk today. I had a great time walking.
單字出現次數:
The: 1
weather: 1
is: 1
very: 1
good: 1
today.: 2
I: 2
went: 1
for: 1
a: 2
walk: 1
had: 1
great: 1
time: 1
walking.: 1
單字總出現次數:18

以下是一個完整的程式,允許使用者重複輸入文字,直到輸入空字串為止。程式會將輸入的文字切割成單字,計算每個單字的出現次數,並在結束時輸出結果:

範例五、完整的程式

 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
from functools import reduce

def main():
    print("請開始輸入文字(輸入空字串以結束):")
    
    # 用來存儲所有輸入的文字
    all_words = []
    
    while True:
        user_input = input("> ")
        if user_input.strip() == "":  # 空字串結束條件
            break
        # 切割並加入總單字列表
        words = user_input.split()
        all_words.extend(words)
    
    # 使用字典計算單字出現次數
    word_count = {}
    for word in all_words:
        word_count[word] = word_count.get(word, 0) + 1  # 累加單字次數
    
    # 使用 Reduce 計算單字的總出現次數
    total_count = reduce(lambda acc, count: acc + count, word_count.values(), 0)
    
    # 輸出結果
    print("\n單字出現次數統計:")
    for word, count in word_count.items():
        print(f"{word}: {count}")
    
    print(f"\n單字總出現次數:{total_count}")

if __name__ == "__main__":
    main()

執行結果:
請開始輸入文字(輸入空字串以結束):
> The weather is very good today.
> I went for a walk today.
> I had a great time walking.

單字出現次數統計:
The: 1
weather: 1
is: 1
very: 1
good: 1
today.: 2
I: 2
went: 1
for: 1
a: 2
walk: 1
had: 1
great: 1
time: 1
walking.: 1

單字總出現次數:18

上述程式使用的是基於空白分隔的 split() 方法來分割文字,這在處理英文或其他以空白分隔單詞的語言時非常有效。然而,中文並沒有空白來分隔單詞,因此需要使用專門的中文斷詞工具

改進方法:使用中文斷詞工具

在 Python 中,jieba 是一個強大的中文斷詞庫,可以有效地將中文句子分割成單詞(或詞語)。

以下是針對中文的改良版程式:

範例六、中文字詞統計

 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
import jieba
from functools import reduce

def main():
    print("請開始輸入文字(輸入空字串以結束):")
    
    # 用來存儲所有輸入的詞語
    all_words = []
    
    while True:
        user_input = input("> ")
        if user_input.strip() == "":  # 空字串結束條件
            break
        # 使用 jieba 將輸入的中文文字斷詞
        words = jieba.lcut(user_input)  # lcut 返回列表
        all_words.extend(words)
    
    # 使用字典計算單詞出現次數
    word_count = {}
    for word in all_words:
        word_count[word] = word_count.get(word, 0) + 1  # 累加單詞次數
    
    # 使用 Reduce 計算單詞的總出現次數
    total_count = reduce(lambda acc, count: acc + count, word_count.values(), 0)
    
    # 輸出結果
    print("\n單字或詞語出現次數統計:")
    for word, count in word_count.items():
        print(f"{word}: {count}")
    
    print(f"\n總詞語數量:{total_count}")

if __name__ == "__main__":
    main()

執行結果:
請開始輸入文字(輸入空字串以結束):
> 今天天氣很好
Building prefix dict from the default dictionary ...
Dumping model to file cache C:\Users\CHENG-~1\AppData\Local\Temp\jieba.cache
Loading model cost 0.526 seconds.
Prefix dict has been built successfully.
> 今天去散步
> 散步讓人開心

單字或詞語出現次數統計:
今天: 2
天氣: 1
很: 1
好: 1
去: 1
散步: 2
讓: 1
人: 1
開心: 1

總詞語數量:11

沒有留言:

張貼留言