<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 如何使用 scikit-learn 為機器學習準備文本數據 > 原文: [https://machinelearningmastery.com/prepare-text-data-machine-learning-scikit-learn/](https://machinelearningmastery.com/prepare-text-data-machine-learning-scikit-learn/) 文本數據需要特殊準備才能開始使用它進行預測建模。 必須解析文本以刪除稱為分詞的單詞。然后,需要將單詞編碼為整數或浮點值,以用作機器學習算法的輸入,稱為特征提取(或向量化)。 scikit-learn 庫提供易于使用的工具,可以執行文本數據的分詞和特征提取。 在本教程中,您將了解如何使用 scikit-learn 在 Python 中為預測建模準備文本數據。 完成本教程后,您將了解: * 如何使用 CountVectorizer 將文本轉換為字數統計向量。 * 如何使用 TfidfVectorizer 將文本轉換為字頻向量。 * 如何使用 HashingVectorizer 將文本轉換為唯一的整數。 讓我們開始吧。 ![How to Prepare Text Data for Machine Learning with scikit-learn](img/37154d4c77b0854b4cf91ea1592fd802.jpg) 如何使用 scikit-learn 照片由 [Martin Kelly](https://www.flickr.com/photos/martkelly/34474622542/) 為機器學習準備文本數據,保留一些權利。 ## 詞袋模型 使用機器學習算法時,我們無法直接使用文本。 相反,我們需要將文本轉換為數字。 我們可能想要執行文檔分類,因此每個文檔都是“_ 輸入 _”,類標簽是我們的預測算法的“_ 輸出 _”。算法將數字向量作為輸入,因此我們需要將文檔轉換為固定長度的數字向量。 在機器學習中思考文本文檔的簡單而有效的模型被稱為 Bag-of-Words 模型,或 BoW。 該模型很簡單,因為它拋棄了單詞中的所有訂單信息,并關注文檔中單詞的出現。 這可以通過為每個單詞分配唯一編號來完成。然后,我們看到的任何文檔都可以編碼為具有已知單詞詞匯長度的固定長度向量。向量中每個位置的值可以用編碼文檔中每個單詞的計數或頻率填充。 這是單詞模型的包,我們只關注編碼方案,這些編碼方案表示存在的單詞或它們在編碼文檔中存在的程度,而沒有關于順序的任何信息。 有很多方法可以擴展這個簡單的方法,既可以更好地闡明“_ 字 _”是什么,也可以定義對向量中每個字進行編碼的內容。 scikit-learn 庫提供了我們可以使用的 3 種不同方案,我們將簡要介紹每種方案。 ## Word 計數與 CountVectorizer [CountVectorizer](http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html) 提供了一種簡單的方法,既可以標記文本文檔的集合,也可以構建已知單詞的詞匯表,還可以使用該詞匯表對新文檔進行編碼。 您可以按如下方式使用它: 1. 創建 _CountVectorizer_ 類的實例。 2. 調用 _fit()_ 函數以便從一個或多個文檔中學習詞匯。 3. 根據需要在一個或多個文檔上調用 _transform()_ 函數,將每個文檔編碼為向量。 返回的編碼向量具有整個詞匯表的長度,并且返回每個單詞出現在文檔中的次數的整數計數。 因為這些向量將包含許多零,所以我們將它們稱為稀疏。 Python 提供了一種在 [scipy.sparse](https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.html) 包中處理稀疏向量的有效方法。 從對 transform()的調用返回的向量將是稀疏向量,您可以將它們轉換回 numpy 數組,以通過調用 toarray()函數來查看并更好地了解正在發生的事情。 下面是使用 CountVectorizer 進行標記,構建詞匯表,然后對文檔進行編碼的示例。 ```py from sklearn.feature_extraction.text import CountVectorizer # list of text documents text = ["The quick brown fox jumped over the lazy dog."] # create the transform vectorizer = CountVectorizer() # tokenize and build vocab vectorizer.fit(text) # summarize print(vectorizer.vocabulary_) # encode document vector = vectorizer.transform(text) # summarize encoded vector print(vector.shape) print(type(vector)) print(vector.toarray()) ``` 在上面,您可以看到我們訪問詞匯表以查看通過調用標記的確切內容: ```py print(vectorizer.vocabulary_) ``` 我們可以看到默認情況下所有單詞都是小寫的,并且忽略了標點符號。可以配置分詞的這些和其他方面,我建議您查看 [API 文檔](http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html)中的所有選項。 首先運行該示例打印詞匯表,然后打印編碼文檔的形狀。我們可以看到詞匯中有 8 個單詞,因此編碼的向量長度為??8。 然后我們可以看到編碼的向量是稀疏矩陣。最后,我們可以看到編碼向量的數組版本,顯示除了出現 2 的(index 和 id 7)之外的每個單詞的出現次數為 1。 ```py {'dog': 1, 'fox': 2, 'over': 5, 'brown': 0, 'quick': 6, 'the': 7, 'lazy': 4, 'jumped': 3} (1, 8) <class 'scipy.sparse.csr.csr_matrix'> [[1 1 1 1 1 1 1 2]] ``` 重要的是,相同的向量化程序可用于包含詞匯表中未包含的單詞的文檔。忽略這些單詞,并且在結果向量中不給出計數。 例如,下面是使用上面的向量化器來編碼文檔中的一個單詞和一個單詞不是的單詞的示例。 ```py # encode another document text2 = ["the puppy"] vector = vectorizer.transform(text2) print(vector.toarray()) ``` 運行此示例將打印編碼稀疏向量的數組版本,顯示詞匯中一個單詞出現一次,而詞匯中未出現的另一個單詞完全被忽略。 ```py [[0 0 0 0 0 0 0 1]] ``` 然后,編碼的向量可以直接與機器學習算法一起使用。 ## 使用 TfidfVectorizer 的單詞頻率 字數是一個很好的起點,但非常基本。 簡單計數的一個問題是,諸如“”之類的單詞會出現很多次,并且它們的大數量在編碼向量中不會非常有意義。 另一種方法是計算單詞頻率,到目前為止,最流行的方法稱為 [TF-IDF](https://en.wikipedia.org/wiki/Tf%E2%80%93idf) 。這是“_ 術語頻率 - 反向文檔 _”頻率的首字母縮寫,它是分配給每個單詞的結果分數的組成部分。 * **術語頻率**:總結了給定單詞在文檔中出現的頻率。 * **反向文檔頻率**:這縮小了文檔中出現的很多單詞。 在沒有進入數學的情況下,TF-IDF 是單詞頻率分數,試圖突出更有趣的單詞,例如,在文檔中頻繁但不在文檔中。 [TfidfVectorizer](http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html) 將對文檔進行標記,學習詞匯和逆文檔頻率權重,并允許您對新文檔進行編碼。或者,如果您已經學習了 CountVectorizer,則可以將其與 [TfidfTransformer](http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfTransformer.html) 一起使用,以計算逆文檔頻率并開始編碼文檔。 與 CountVectorizer 一樣使用相同的創建,擬合和轉換過程。 下面是使用 TfidfVectorizer 學習 3 個小文檔中的詞匯和逆文檔頻率然后編碼其中一個文檔的示例。 ```py from sklearn.feature_extraction.text import TfidfVectorizer # list of text documents text = ["The quick brown fox jumped over the lazy dog.", "The dog.", "The fox"] # create the transform vectorizer = TfidfVectorizer() # tokenize and build vocab vectorizer.fit(text) # summarize print(vectorizer.vocabulary_) print(vectorizer.idf_) # encode document vector = vectorizer.transform([text[0]]) # summarize encoded vector print(vector.shape) print(vector.toarray()) ``` 從文檔中學習 8 個單詞的詞匯表,并且在輸出向量中為每個單詞分配唯一的整數索引。 針對詞匯表中的每個單詞計算逆文檔頻率,將最低得分 1.0 分配給最頻繁觀察的單詞:“ _[指示 7 處的 _”。 最后,第一個文檔被編碼為 8 個元素的稀疏數組,我們可以查看每個單詞的最終評分,其中包含“”,“ _fox_ ”和“ _ 狗 _“來自詞匯中的其他詞匯。 ```py {'fox': 2, 'lazy': 4, 'dog': 1, 'quick': 6, 'the': 7, 'over': 5, 'brown': 0, 'jumped': 3} [ 1.69314718 1.28768207 1.28768207 1.69314718 1.69314718 1.69314718 1.69314718 1\. ] (1, 8) [[ 0.36388646 0.27674503 0.27674503 0.36388646 0.36388646 0.36388646 0.36388646 0.42983441]] ``` 將得分歸一化為 0 到 1 之間的值,然后可以將編碼的文檔向量直接用于大多數機器學習算法。 ## 散列 HashingVectorizer 計數和頻率可能非常有用,但這些方法的一個限制是詞匯量可能變得非常大。 反過來,這將需要大的向量來編碼文檔并對內存施加大量要求并減慢算法速度。 一個聰明的解決方法是使用單向哈希值將它們轉換為整數。聰明的部分是不需要詞匯表,你可以選擇任意長的固定長度向量。缺點是散列是單向函數,因此無法將編碼轉換回單詞(這對于許多監督學習任務可能無關緊要)。 [HashingVectorizer](http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.HashingVectorizer.html) 類實現了這種方法,可用于一致地對單詞進行哈希處理,然后根據需要對文檔進行標記和編碼。 下面的示例演示了用于編碼單個文檔的 HashingVectorizer。 選擇任意固定長度的向量大小 20。這對應于散列函數的范圍,其中小值(如 20)可能導致散列沖突。記得回到 compsci 類,我相信有一些啟發式方法可以用來根據估計的詞匯量來選擇哈希長度和碰撞概率。 請注意,此向量化程序不需要調用以適應訓練數據文檔。相反,在實例化之后,它可以直接用于開始編碼文檔。 ```py from sklearn.feature_extraction.text import HashingVectorizer # list of text documents text = ["The quick brown fox jumped over the lazy dog."] # create the transform vectorizer = HashingVectorizer(n_features=20) # encode document vector = vectorizer.transform(text) # summarize encoded vector print(vector.shape) print(vector.toarray()) ``` 運行該示例將示例文檔編碼為 20 個元素的稀疏數組。 編碼文檔的值默認對應于標準化字數,范圍為-1 到 1,但可以通過更改默認配置來使其成為簡單的整數計數。 ```py (1, 20) [[ 0\. 0\. 0\. 0\. 0\. 0.33333333 0\. -0.33333333 0.33333333 0\. 0\. 0.33333333 0\. 0\. 0\. -0.33333333 0\. 0. -0.66666667 0\. ]] ``` ## 進一步閱讀 如果您要深入了解,本節將提供有關該主題的更多資源。 ### 自然語言處理 * [維基百科上的詞袋模型](https://en.wikipedia.org/wiki/Bag-of-words_model) * 維基百科上的[標記](https://en.wikipedia.org/wiki/Lexical_analysis#Tokenization) * 維基百科上的 [TF-IDF](https://en.wikipedia.org/wiki/Tf%E2%80%93idf) ### scikit 學習 * [第 4.2 節。特征提取](http://scikit-learn.org/stable/modules/feature_extraction.html),scikit-learn 用戶指南 * [scikit-learn 特征提取 API](http://scikit-learn.org/stable/modules/classes.html#module-sklearn.feature_extraction) * [使用文本數據](http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html),scikit-learn Tutorial ### 類 API * [CountVectorizer scikit-learn API](http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html) * [TfidfVectorizer scikit-learn API](http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html) * [TfidfTransformer scikit-learn API](http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfTransformer.html) * [HashingVectorizer scikit-learn API](http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.HashingVectorizer.html) ## 摘要 在本教程中,您了解了如何使用 scikit-learn 為機器學習準備文本文檔。 我們在這些示例中只是略微表面,我想強調這些類有許多配置細節來影響值得探索的文檔的分詞。 你有任何問題嗎? 在下面的評論中提出您的問題,我會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看