從零開始學機器學習——入門NLP

努力的小雨發表於2024-11-21

首先給大家介紹一個很好用的學習地址:https://cloudstudio.net/columns

今天我們將深入探討自然語言處理(Natural Language Processing, NLP)這一領域。自然語言處理是人工智慧的一個重要子領域,主要關注如何使機器理解和處理人類的語言,從而能夠執行諸如拼寫檢查、機器翻譯等多種任務。

目前,自然語言處理的應用場景相當廣泛,大家熟悉的智慧助手如Siri和Alexa就是典型的例子。接下來的課程中,我們將首先實現一個基礎版的聊天機器人,隨後逐步分析如何最佳化和提升機器人的智慧表現,使其更加接近於人類的思考方式。

那麼,我們就從這裡開始吧!

聊天機器人

在我們學習自然語言處理(NLP)的過程中,掌握以下技能將是非常重要的:

  1. Python 3:作為一種功能強大且易於學習的程式語言,Python 3 是進行自然語言處理的首選語言,它擁有豐富的庫和框架,能夠有效支援各類 NLP 任務。
  2. 您喜歡的 Python IDE:選擇一個適合自己的整合開發環境(IDE)可以大大提高程式設計效率,無論是 PyCharm、Jupyter Notebook 還是 VS Code,找到最適合自己的工具是至關重要的。
  3. TextBlob:這是一個建立在兩個廣受歡迎的庫——自然語言工具包(NLTK)和 Pattern 之上的庫。TextBlob 利用這兩個庫的強大功能,使文字分析和處理變得更加簡單直觀。它提供了一個使用者友好的 API,適用於各種自然語言處理任務,包括情感分析、文字分類、翻譯等。TextBlob 是一個非常適合快速開發和原型製作的工具,特別適合需要處理文字資料的專案。

無腦版聊天

一開始就試圖實現一個功能完美的聊天機器人,對我們這些初學者來說顯然是不現實的。因此,我們將採取逐步推進的方法,先實現一個基礎版本的聊天機器人,看看能否在此基礎上進行不斷最佳化,最終朝著我們理想中的智慧機器人的目標前進。

現在,我們將著手實現一個最簡單的聊天機器人。這個機器人將透過隨機回應來與使用者進行互動,直到使用者選擇結束對話為止。

程式碼實現

import random

# This list contains the random responses (you can add your own or translate them into your own language too)
random_responses = ["That is quite interesting, please tell me more.",
                    "I see. Do go on.",
                    "Why do you say that?",
                    "Funny weather we've been having, isn't it?",
                    "Let's change the subject.",
                    "Did you catch the game last night?"]

print("Hello, I am Marvin, the simple robot.")
print("You can end this conversation at any time by typing 'bye'")
print("After typing each answer, press 'enter'")
print("How are you today?")

while True:
    # wait for the user to enter some text
    user_input = input("> ")
    if user_input.lower() == "bye":
        # if they typed in 'bye' (or even BYE, ByE, byE etc.), break out of the loop
        break
    else:
        response = random.choices(random_responses)[0]
    print(response)

print("It was nice talking to you, goodbye!")

Hello, I am Marvin, the simple robot.
You can end this conversation at any time by typing 'bye'
After typing each answer, press 'enter'
How are you today?

I am good thanks
That is quite interesting, please tell me more.

ok, lets talk about music
Why do you say that?

because I like music!
Why do you say that?

bye
It was nice talking to you, goodbye!

其實,這個過程還是相對簡單的,因此在這裡就不需要過多解釋了。不過,我們可以從中發現一些有趣的問題。

首先,你認為這些隨機回應能夠“欺騙”人類,讓人類誤以為機器人實際上理解了他們的意思嗎?這是一個引人深思的問題,涉及到人機互動的本質。

其次,為了讓機器人更有效地回應使用者,它需要具備哪些功能呢?例如,機器人是否需要具備上下文理解能力,以便更好地跟蹤對話的主題和方向?

此外,如果機器人真的能夠“理解”一個句子的意思,那麼它是否也需要“記住”前面句子的意思,以便在對話中保持一致性和連貫性?

對於大多數自然語言處理(NLP)任務,程式必須將文字進行分解、檢查,並儲存處理結果或與相關規則和資料集進行交叉引用。這些任務使程式設計師能夠提取文字中術語和單詞的含義、意圖或頻率等資訊。

接下來,我們將看看NLP專家們所面臨的一些問題。雖然我們目前可能不需要深入瞭解這些底層知識,但對這些挑戰有一個大概的印象是有益的。畢竟,掌握工具的使用才是我們當前的首要目標。透過實踐,我們將逐步積累經驗,深入探索更復雜的概念和技術。

NLP 常見的任務

其實,我們的主要目標僅僅是對文字進行有效的分析和處理。透過理解這些自然語言處理任務,我們希望能夠提取出有價值的資訊,並得出我們所追求的結論。

  1. 標記化
    • 將文字拆分為標記或單詞,需考慮標點符號和語言特性。例如:將句子“貓在窗臺上睡覺。”拆分為標記:["貓", "在", "窗臺", "上", "睡覺", "。"]。
  2. 嵌入
    • 將文字資料轉換為數字形式,使相似含義的單詞聚集在一起。例如:將單詞“王子”和“國王”轉換為數字向量,使它們在高維空間中更接近,因為它們有相似的含義。
  3. 解析和詞性標註
    • 為每個標記化的單詞標註詞性(如名詞、動詞、形容詞等)。例如:這一句話:“聰明的學生回答了問題。”,標註“學生=名詞”,“回答=動詞”。
  4. 單詞和短語頻率
    • 統計文字中每個單詞或短語的出現頻率。例如:在文字中統計“貓”的頻率,如果出現了5次,則記錄為“貓: 5”。
  5. N 元語法
    • 將文字分割成固定長度的單詞序列(unigram、bigrams、trigrams等)。例如:在句子“我愛吃蘋果。”中,生成的二元語法(bigrams)為:["我愛", "愛吃", "吃蘋果"]。
  6. 名詞短語提取
    • 識別句子中的名詞短語,通常作為主語或賓語。例如:在句子“美麗的花朵盛開。”中,提取名詞短語“美麗的花朵”。
  7. 情感分析
    • 分析文字的情緒傾向,評估其積極或消極程度。例如:分析句子“這個電影太棒了!”得出積極的情緒評分,例如0.8(積極)。
  8. 詞形變化
    • 獲取單詞的單數或複數形式。這一塊在英文中其實更好理解因為他們有專門的寫法,如果中文的話,例如:將單詞“狗”的複數形式轉換為“狗狗們”。
  9. 詞形還原
    • 找出單詞的詞根或中心詞。例如:將單詞“飛”、“飛翔”、“飛行”都還原為詞根“飛”。
  10. WordNet(詞網)
    • 一個包含同義詞、反義詞和詳細資訊的資料庫,對語言工具的構建非常有用。例如:查詢“快樂”這個詞,得到其同義詞如“高興”、“愉快”,以及反義詞如“悲傷”。

這麼一看,即使是一句簡短的話,我們也需要進行大量的處理才能得出有效的結論,這樣才能讓機器做出像人類一樣的回答。然而,幸運的是,Python提供了眾多自然語言處理(NLP)庫和依賴包,供我們自由選擇。這些工具的存在使得我們無需深入複雜的底層實現,只需透過簡單的API呼叫,就能快速分析文字並獲取結果,真正省去了重複造輪子的麻煩。

接下來,我們可以以剛才基礎的無腦版聊天機器人為起點,進一步增加情感分析和名詞提取的功能。情感分析將使機器人能夠識別使用者的情緒狀態,而名詞提取則可以幫助它抓住對話中的關鍵內容。這樣一來,我們就能更有效地回應使用者的問題,使得交流變得更加流暢和自然。

情感分析版聊天

我們剛才介紹過了TextBlob庫,這裡不再贅述了,如果你希望深入學習這個強大的自然語言處理庫,這裡也有入門連結,幫助你更好地理解它的用法。

現在,我們可以簡單實現一個聊天機器人的程式碼。這個機器人的主要目的是首先分析輸入的這句話,判斷其情緒是積極還是消極。如果使用者的輸入中提到了某些名詞,我們將把這些名詞融入到機器人的回覆中,並主動向使用者詢問相關內容,以營造出更自然、富有情感的交流氛圍。

程式碼實現

接下來,讓我們來看看具體的程式碼實現:

import random
from textblob import TextBlob
from textblob.np_extractors import ConllExtractor
import nltk

# 下載 NLTK 資源
nltk.download("punkt_tab")
nltk.download('conll2000')

extractor = ConllExtractor()

def main():   
    print("Hello, I am Marvin, the friendly robot.")
    print("You can end this conversation at any time by typing 'bye'")    
    print("After typing each answer, press 'enter'")
    print("How are you today?")

    while True:
        # wait for the user to enter some text
        user_input = input("> ")

        if user_input.lower() == "bye":            
            # if they typed in 'bye' (or even BYE, ByE, byE etc.), break out of the loop
            break
        else:
            # Create a TextBlob based on the user input. Then extract the noun phrases
            user_input_blob = TextBlob(user_input, np_extractor=extractor)                        
            np = user_input_blob.noun_phrases                                    
            response = ""
            if user_input_blob.polarity <= -0.5:
                response = "Oh dear, that sounds bad. "
            elif user_input_blob.polarity <= 0:
                response = "Hmm, that's not great. "
            elif user_input_blob.polarity <= 0.5:
                response = "Well, that sounds positive. "
            elif user_input_blob.polarity <= 1:
                response = "Wow, that sounds great. "

            if len(np) != 0:
                # There was at least one noun phrase detected, so ask about that and pluralise it
                # e.g. cat -> cats or mouse -> mice
                response = response + "Can you tell me more about " + np[0].pluralize() + "?"
            else:
                response = response + "Can you tell me more?"
            print(response)
    
    print("It was nice talking to you, goodbye!")

# Start the program
main()

這段程式碼的功能可以大致分為以下幾個部分:

  1. 初始化提取器:建立一個名詞短語提取器例項 extractor。這個提取器將用於識別使用者輸入中的重要名詞短語。
  2. 主函式
    • 啟動與使用者的對話,歡迎資訊和提示。
    • 進入一個迴圈,等待使用者輸入。
    • 如果使用者輸入“bye”,程式結束對話。
    • 否則,使用 TextBlob 建立一個物件來分析使用者輸入:
      • 提取名詞短語。
      • 根據文字的情感極性生成不同的回應(從負面到正面)。
      • 如果檢測到名詞短語,詢問使用者關於這些名詞短語的更多資訊,並將名詞短語變為複數形式。
      • 如果沒有檢測到名詞短語,則詢問使用者更多資訊。
  3. 結束對話:當使用者輸入“bye”後,程式列印告別資訊並結束。

透過情感分析和名詞短語提取,機器人能夠提供更為針對性的回應,相比於之前的無腦機器人,顯然會顯得更具互動性和響應性。讓我們來看看它的實際效果:

image

總結

在探索自然語言處理(NLP)的過程中,我們學習瞭如何構建一個基本的聊天機器人,從隨機回應到情感分析,實現了逐步最佳化的過程。透過使用Python及其強大的庫,如TextBlob,我們能夠輕鬆處理文字資料並提取有價值的資訊。

今天,我們介紹了NLP的基本概念和常見任務,涵蓋了標記化、情感分析、名詞短語提取等內容。這些技能不僅能幫助我們構建簡單的聊天機器人,還為日後深入研究更復雜的NLP問題奠定了基礎。

今後,我們將繼續探索更高階的NLP技術,進一步提升機器人的智慧和互動能力。讓我們一起期待下一次的學習旅程吧!


我是努力的小雨,一名 Java 服務端碼農,潛心研究著 AI 技術的奧秘。我熱愛技術交流與分享,對開源社群充滿熱情。同時也是一位騰訊雲創作之星、阿里雲專家博主、華為云云享專家、掘金優秀作者。

💡 我將不吝分享我在技術道路上的個人探索與經驗,希望能為你的學習與成長帶來一些啟發與幫助。

🌟 歡迎關注努力的小雨!🌟

相關文章