1. 程式人生 > >自然語言處理——簡單詞袋模型

自然語言處理——簡單詞袋模型

What Is Natural Language Processing?

本文將學習自然語言處理,當給予計算機一篇文章,它並不知道這篇文章的含義。為了讓計算機可以從文章中做出推斷,我們需要將文章轉化為數值表示。這個過程使得計算機能夠憑語法規則去識別它。那麼首先就要學會如何將文章變為數值表示。

Looking At The Data

Hacker News網站是一個可以提交文章的社群網站,並且其他的人可以對文章進行投票。投票最高的文章會被放到首頁,這樣就有更多的人可以看到它。我們的資料集就是 Hacker News網站2006年到2015年提交的文章集合。Arnaud Drizard利用Hacker News API爬取到了這些資料。我們從中隨機抽取了3000個樣本,刪除了所有多餘的列,最終資料的屬性如下:

  • submission_time – when the article was submitted.
  • upvotes – number of upvotes the article got.
  • url – the base url of the article.
  • headline – the headline of the article.
  • 我們將通過文章的標題來預測文章會收到多少投票(換句話就是哪種文章更受歡迎),首先將資料中的元素值為NA的行刪除掉。
import pandas as pd
submissions = pd.read_csv("sel_hn_stories.csv"
) submissions.columns = ["submission_time", "upvotes", "url", "headline"] submissions = submissions.dropna()

Tokenization

  • 我們為了預測某個標題會得到多少個投票,那麼首先需要將標題轉換為數值表示。可以用詞袋模型( bag of words model)來完成這個轉換,詞袋模型中將每個文字表示為一個數值型向量。看個例子:

這裡寫圖片描述

  • 詞袋模型的第一步就是分詞,將一個句子根據空格將其分散為一個個不相連的單詞。
tokenized_headlines = []
for
item in submissions["headline"]: tokenized_headlines.append(item.split(" "))

Preprocessing

  • 由於大小寫代表的意思相同,因此我們需要將所有的單詞都轉換為小寫
  • 剔除掉標點符號
punctuation = [",", ":", ";", ".", "'", '"', "’", "?", "/", "-", "+", "&", "(", ")"]
clean_tokenized = []
for item in tokenized_headlines:
    tokens = []
    for token in item:
        token = token.lower()
        for punc in punctuation:
            token = token.replace(punc, "")
        tokens.append(token)
    clean_tokenized.append(tokens)

Assembling A Matrix

  • 現在獲取了每個文字的詞袋,下一步就是將這些詞袋求並集。
  • 利用single_tokens 剔除掉了只出現一次的單詞,這樣的單詞沒有多大意義。unique_tokens 自然就是儲存的大於一次的單詞。
  • counts是個值全為0的DataFrame,其中列標籤為unique_tokens 中的單詞,行標籤為標題序號。
import numpy as np
unique_tokens = []
single_tokens = []
for tokens in clean_tokenized:
    for token in tokens:
        if token not in single_tokens:
            single_tokens.append(token)
        elif token in single_tokens and token not in unique_tokens:
            unique_tokens.append(token)

counts = pd.DataFrame(0, index=np.arange(len(clean_tokenized)), columns=unique_tokens)

Counting Tokens

  • 填充上面構造的全零DataFrame,遍歷每個token 中的所有單詞,進行計數:
for i, item in enumerate(clean_tokenized):
    for token in item:
        if token in unique_tokens:
            counts.iloc[i][token] += 1

Removing Extraneous Columns

  • 我們的屬性高達2309,並且其中絕大部分取值為0,這樣不便於分析。較多的屬性只會讓模型更加擬合噪音而不是真正的資訊,因此容易導致過擬合問題。
print(len(unique_tokens))
'''
2309
'''

有兩類特徵會降低模型的精度

  • 第一種:只出現過幾次,這樣的特徵會導致過擬合。因為模型沒有更多的資訊來精確的確定這個特徵是否重要,因為它就只出現了幾次。並且它們在訓練集和測試集中對於目標變數的影響也會有很大的差異,因為出現太少,因此屬性分佈不平衡。
  • 第二種:出現的次數太多,比如像and和to這樣的特徵根本不能給模型帶來任何有意義的資訊,這些詞被稱為停頓詞,應當剔除掉。
  • 因此最終確定保留那些屬性值大於5小於100的屬性:
word_counts = counts.sum(axis=0)
'''
word_counts
Series (<class 'pandas.core.series.Series'>)
         418
and      289
for      298
as        47
you      100
is       158
'''
counts = counts.loc[:,(word_counts >= 5) & (word_counts <= 100)]

Splitting The Data

  • sklearn.cross_validation中有專門劃分訓練集和測試集的函式train_test_split
  • counts中儲存的是分類資料,而submissions[“upvotes”]是類標籤資料,分別對其進行劃分。
from sklearn.cross_validation import train_test_split

X_train, X_test, y_train, y_test = train_test_split(counts, submissions["upvotes"], test_size=0.2, random_state=1)

Making Predictions

from sklearn.linear_model import LinearRegression

clf = LinearRegression()
clf.fit(X_train, y_train)

predictions = clf.predict(X_test)

Calculating Error

  • 計算MSE,也就是平均平方誤差(mean squared error(MSE))
mse = sum((y_test - predictions) ** 2) / len(predictions)
print(mse)
'''
2652.6082512522867
'''

Next Steps

  • 得到的模型的mse是2652.6082512522867,這是一個很大的值,但是關於什麼是好的錯誤率這個沒有硬性規定,因為它取決於具體的問題。在這個問題中,投票的平均值是10,標準差是39.5。MSE的平方根是大約是51。這意味著我們的平均誤差是遠離真正的值的,所以我們預測時有很大偏差的。

可以採取以下措施來降低預測的偏差問題:

  • 利用整個資料集進行模型的建立,因為在這個實驗中我們只是抽樣了3000個文章。如果利用全部的資料集將大大減少出錯率。
  • 新增元特徵( “meta” features),比如標題的長度,單詞的平均長度等等。
  • 利用隨機森林或者其它更強大的機器學習演算法。
  • 在剔除那些少見或者常見單詞的時候,要嘗試不同的閾值,找到最佳的為止。

相關推薦

自然語言處理——簡單模型

What Is Natural Language Processing? 本文將學習自然語言處理,當給予計算機一篇文章,它並不知道這篇文章的含義。為了讓計算機可以從文章中做出推斷,我們需要將文章

自然語言處理Word2Vec向量模型

1.自然語言處理與深度學習 2.語言模型 3.N-gram模型 4.詞向量 5.神經網路模型 6.Hierarchical Softmax 7.CBOW模型例項 8.CBOW求解目標 9.梯度上升求解

深度學習課程之文字預處理模型、word2vec、語言模型(1.9)

詞向量和語言模型 深度學習其實最成功的應用是在影象上,有了 CNN 可以很好地提取影象上的特徵,這些特徵經過幾層的神經網路結構可以很好地組合成比較抽象的特徵。 NLP 常見任務 自動摘要:媒體需要的頭條通過 NLP 自動提取 機器翻譯 主題識別 文字分類

95、自然語言處理svd向量

atp ear logs plt images svd分解 range src for import numpy as np import matplotlib.pyplot as plt la = np.linalg words = ["I","like","enjoy

吳恩達《深度學習》第五門課(2)自然語言處理嵌入

星級 技術 ima lac 個數 應該 ras 時有 根據 2.1詞匯表征 (1)使用one-hot方法表示詞匯有兩個主要的缺點,以10000個詞為例,每個單詞需要用10000維來表示,而且只有一個數是零,其他維度都是1,造成表示非常冗余,存儲量大;第二每個單詞表示的向量相

[NLP自然語言處理]谷歌BERT模型深度解析

BERT模型程式碼已經發布,可以在我的github: NLP-BERT--Python3.6-pytorch 中下載,請記得start哦 目錄 一、前言 二、如何理解BERT模型 三、BERT模型解析       論文的核心:詳解BE

DeepLearning.ai筆記:(5-2) -- 自然語言處理嵌入(NLP and Word Embeddings)

title: ‘DeepLearning.ai筆記:(5-2) – 自然語言處理與詞嵌入(NLP and Word Embeddings)’ id: dl-ai-5-2 tags: dl.ai categories: AI Deep Learning date:

DeepLearning.ai作業:(5-2) -- 自然語言處理嵌入(NLP and Word Embeddings)

title: ‘DeepLearning.ai作業:(5-2) – 自然語言處理與詞嵌入(NLP and Word Embeddings)’ id: dl-ai-5-2h tags: dl.ai homework categories: AI Deep L

吳恩達Coursera深度學習課程 deeplearning.ai (5-2) 自然語言處理嵌入--程式設計作業(一):向量運算

Part 1: 詞向量運算 歡迎來到本週第一個作業。 由於詞嵌入的訓練計算量龐大切耗費時間長,絕大部分機器學習人員都會匯入一個預訓練的詞嵌入模型。 你將學到: 載入預訓練單詞向量,使用餘弦測量相似度 使用詞嵌入解決類別問題,比如 “Man is to

吳恩達Coursera深度學習課程 deeplearning.ai (5-2) 自然語言處理嵌入--程式設計作業(二):Emojify表情包

Part 2: Emojify 歡迎來到本週的第二個作業,你將利用詞向量構建一個表情包。 你有沒有想過讓你的簡訊更具表現力? emojifier APP將幫助你做到這一點。 所以不是寫下”Congratulations on the promotion! L

自然語言處理5 -- 向量

系列文章,請多關注 Tensorflow原始碼解析1 – 核心架構和原始碼結構 帶你深入AI(1) - 深度學習模型訓練痛點及解決方法 自然語言處理1 – 分詞 自然語言處理2 – jieba分詞用法及原理 自然語言處理3 – 詞性標註 自然語言處理4 – 句法分析 自然語言處理5 –

hanlp中文自然語言處理方法介紹

自然語言處理在大資料以及近年來大火的人工智慧方面都有著非同尋常的意義。那麼,什麼是自然語言處理呢?在沒有接觸到大資料這方面的時候,也只是以前在學習計算機方面知識時聽說過自然語言處理。書本上對於自然語言處理的定義或者是描述太多專業化。換一個通俗的說法,自然語言處理就是把我們人類

自然語言處理中的模型

詞袋模型 from sklearn.feature_extraction.text import CountVectorizer import os import re import jieba.posseg as pseg # 載入停用詞表 stop_

自然語言處理(NLP) 三:模型 + 文字分類

1.詞袋模型 (BOW,bag of words) 用詞頻矩陣作為每個樣本的特徵 Are you curious about tokenization ? Let’s see how it works! we need to analyze a coupl

自然語言處理】預測電影影評情感的深度學習模型

翻譯自外網:https://machinelearningmastery.com/deep-learning-bag-of-words-model-sentiment-analysis/ 教程概述: 1.電影評論集 2.資料準備 3.詞包表示法 4.情感分析模型 1.電

自然語言處理向量模型-word2vec

技術分享 alt 自然語言 inf bsp word 學習 向量 9.png 自然語言處理與深度學習: 語言模型: N-gram模型: 自然語言處理詞向量模型-word2vec

自然語言處理(四)神經網路語言模型向量

神經網路語言模型 用句子 S S S的概率

自然語言處理中傳統向量表示VS深度學習語言模型(三):word2vec向量

        在前面的部落格中,我們已經梳理過語言表示和語言模型,之所以將這兩部分內容進行梳理,主要是因為分散式的詞向量語言表示方式和使用神經網路語言模型來得到詞向量這兩部分,構成了後來的word2vec的發展,可以說是word2vec的基礎。1.什麼是詞向量       

自然語言處理---用隱馬爾科夫模型(HMM)實現詞性標註---1998年1月份人民日報語料---learn---test---evaluation---Demo---java實現

fileinput 流程 n) 一次 tostring model pen mem rbd 先放上一張Demo的測試圖 測試的句子及每個分詞的詞性標註為: 目前/t 這/rzv 條/q 高速公路/n 之間/f 的/ude1 路段/n 已/d 緊急/a 封閉/v 。/

自然語言處理--LDA主題聚類模型

src 隨機 pos 一個 改變 筆記 整體 應該 定性 LDA模型算法簡介: 算法 的輸入是一個文檔的集合D={d1, d2, d3, ... , dn},同時還需要聚類的類別數量m;然後會算法會將每一篇文檔 di 在 所有Topic上的一個概率值p;這樣每篇