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

2024年11月18日 星期一

利用ChatGPT產生訂閱MQTT主題的Python程式

 

訂閱程式碼:


 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
import paho.mqtt.client as mqtt
import json

# MQTT broker 設定
BROKER = "broker.mqttgo.io"
PORT = 1883
TOPIC = "sensor/light"
CLIENT_ID = "LightSensorSubscriber"

# 當接收到消息時的回調函數
def on_message(client, userdata, msg):
    try:
        # 解碼消息並解析光線亮度
        payload = json.loads(msg.payload.decode())
        light_intensity = payload.get("light_intensity", 0)
        print(f"Received light intensity: {light_intensity}")

        # 判斷亮度是否低於 256
        if light_intensity < 256:
            print("點亮電燈")
    except Exception as e:
        print(f"Error processing message: {e}")

# 建立 MQTT 客戶端
client = mqtt.Client(CLIENT_ID)

# 設置回調函數
client.on_message = on_message

def subscribe_to_light_data():
    try:
        client.connect(BROKER, PORT, 60)
        print(f"Connected to MQTT broker: {BROKER}")

        # 訂閱主題
        client.subscribe(TOPIC)
        print(f"Subscribed to topic: {TOPIC}")

        # 進入阻塞循環等待消息
        client.loop_forever()
    except KeyboardInterrupt:
        print("\nDisconnected from broker.")
        client.disconnect()

if __name__ == "__main__":
    subscribe_to_light_data()

說明

  1. on_message 回調函數
    當收到主題上的消息時,會解析 light_intensity 數值。如果亮度低於 256,輸出「點亮電燈」。

  2. JSON 格式處理
    確保發佈的訊息格式正確(如 {"light_intensity": <value>})。訂閱程式使用 json.loads 解析訊息。

  3. 執行訂閱程式
    啟動程式後,它會持續監聽 sensor/light 主題上的數據。

  4. 測試
    啟動發佈程式和訂閱程式後,當亮度低於 256 時,應該在訂閱程式中看到「點亮電燈」的輸出。


如果有其他需求或問題,隨時告訴我!

執行結果:


再問ChatGPT:


 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
import paho.mqtt.client as mqtt
import random
import time
import json  # 用於 JSON 格式化

# MQTT broker 設定
BROKER = "broker.mqttgo.io"
PORT = 1883
TOPIC = "sensor/light"
CLIENT_ID = "LightSensorPublisher"

# 建立 MQTT 客戶端
client = mqtt.Client(CLIENT_ID)

def publish_light_data():
    try:
        client.connect(BROKER, PORT, 60)
        print(f"Connected to MQTT broker: {BROKER}")

        while True:
            # 模擬光線亮度數據 (0 到 1000 lux)
            light_intensity = random.randint(0, 1000)
            payload = {"light_intensity": light_intensity}
            
            # 將數據轉換為 JSON 字串
            client.publish(TOPIC, json.dumps(payload))
            print(f"Published: {payload} to topic {TOPIC}")

            time.sleep(5)  # 每 5 秒發佈一次
    except KeyboardInterrupt:
        print("\nDisconnected from broker.")
        client.disconnect()

if __name__ == "__main__":
    publish_light_data()

訂閱程式(保持不變)
訂閱程式的解析邏輯已經正確,無需修改。

發佈端執行結果:

接收端執行結果:


MQTTGO的畫面:



利用ChatGPT產生發布MQTT主題的Python程式


 本文利用ChatGPT來產生物聯網MQTT之Python程式,其提示語和所產生的程式如下:


程式碼:


 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
import paho.mqtt.client as mqtt
import random
import time

# MQTT broker 設定
BROKER = "broker.mqttgo.io"
PORT = 1883
TOPIC = "sensor/light"
CLIENT_ID = "LightSensorPublisher"

# 建立 MQTT 客戶端
client = mqtt.Client(CLIENT_ID)

def publish_light_data():
    try:
        client.connect(BROKER, PORT, 60)
        print(f"Connected to MQTT broker: {BROKER}")

        while True:
            # 模擬光線亮度數據 (0 到 1000 lux)
            light_intensity = random.randint(0, 1000)
            payload = {"light_intensity": light_intensity}
            client.publish(TOPIC, str(payload))
            print(f"Published: {payload} to topic {TOPIC}")

            time.sleep(5)  # 每 5 秒發佈一次
    except KeyboardInterrupt:
        print("\nDisconnected from broker.")
        client.disconnect()

if __name__ == "__main__":
    publish_light_data()


把上述程式利用Python IDLE來執行,發生下列錯誤的問題。

把上述問題,詢問ChatGPT,其回答如下:
更新程式碼如下:

 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
import paho.mqtt.client as mqtt
import random
import time

# MQTT broker 設定
BROKER = "broker.mqttgo.io"
PORT = 1883
TOPIC = "sensor/light"
CLIENT_ID = "LightSensorPublisher"

# 建立 MQTT 客戶端
client = mqtt.Client(client_id=CLIENT_ID, protocol=mqtt.MQTTv311, callback_api_version=5)

def publish_light_data():
    try:
        client.connect(BROKER, PORT, 60)
        print(f"Connected to MQTT broker: {BROKER}")

        while True:
            # 模擬光線亮度數據 (0 到 1000 lux)
            light_intensity = random.randint(0, 1000)
            payload = {"light_intensity": light_intensity}
            client.publish(TOPIC, str(payload))
            print(f"Published: {payload} to topic {TOPIC}")

            time.sleep(5)  # 每 5 秒發佈一次
    except KeyboardInterrupt:
        print("\nDisconnected from broker.")
        client.disconnect()

if __name__ == "__main__":
    publish_light_data()



經測試方法1,發生下列問題。


採用方法2,重新安裝paho-mqtt套件。

執行結果:


MQTTGO broker的畫面如本文最上圖,記得要按下連線鈕,並訂閱sensor/light主題。

2024年11月11日 星期一

wokwi模擬工具:MicroPython MQTT Weather Logger (ESP32)

wokwi這套模擬工具值得推薦,不但可以模擬ESP32,也能模擬Pico、SIM32和Arduno。
網址:https://wokwi.com/
以下是用它來模擬MQTT。


參考網址:https://wokwi.com/projects/322577683855704658