日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python 文本向量化_Python文本特征抽取与向量化算法学习

發(fā)布時間:2024/9/27 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 文本向量化_Python文本特征抽取与向量化算法学习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文為大家共享了Python文本特征抽取與向量化的詳細(xì)代碼,供大家參考,詳細(xì)內(nèi)容如下

假設(shè)我們剛看完諾蘭的大片《星際穿越》,設(shè)想怎么讓機器來自動分析各位觀眾對電影的評價到底是“贊”(positive)還是“踩”(negative)呢?

這類問題就屬于情感分析問題。這類問題處理的第一步,就是將文本轉(zhuǎn)換為特征。

因此,這章我們只學(xué)習(xí)第一步,怎么從文本中抽取特征,并將其向量化。

由于中文的處理涉及到分詞問題,本文用一個簡單的例子來介紹怎么使用Python的機器學(xué)習(xí)庫,對英文進(jìn)行特征提取。

1、數(shù)據(jù)準(zhǔn)備

Python的sklearn.datasets支持從目錄讀取所有分類好的文本。不過目錄必須按照一個文件夾一個標(biāo)簽名的規(guī)則放好。比如本文使用的數(shù)據(jù)集共有2個標(biāo)簽,一個為“net”,一個為“pos”,每個目錄下面有6個文本文件。目錄如下所示:

neg

1.txt

2.txt

......

pos

1.txt

2.txt

....

12個文件的內(nèi)容匯總起來如下所示:

neg:

shit.

waste my money.

waste of money.

sb movie.

waste of time.

a shit movie.

pos:

nb! nb movie!

nb!

worth my money.

I love this movie!

a nb movie.

worth it!

2、文本特征

怎么從這些英文中抽取情感態(tài)度而進(jìn)行分類呢?

最直觀的做法就是抽取單詞。通常認(rèn)為,很多關(guān)鍵詞能夠反映說話者的態(tài)度。比如上面這個簡單的數(shù)據(jù)集,很容易發(fā)現(xiàn),凡是說了“shit”的,就一定屬于neg類。

當(dāng)然,上面數(shù)據(jù)集是為了方便描述而簡單設(shè)計的。現(xiàn)實中一個詞經(jīng)常會有穆棱兩可的態(tài)度。但是仍然有理由相信,某個單詞在neg類中出現(xiàn)的越多,那么他表示neg態(tài)度的概率越大。

同樣我們注重到有些單詞對情感分類是毫無意義的。比如上述數(shù)據(jù)中的“of”,“I”之類的單詞。這類詞有個名字,叫“Stop_Word”(停用詞)。這類詞是可以完全忽略掉不做統(tǒng)計的。顯然忽略掉這些詞,詞頻記錄的存儲空間能夠得到完善,而且構(gòu)建速度也更快。

把每個單詞的詞頻作為重點的特征也存在一個問題。比如上述數(shù)據(jù)中的”movie“,在12個樣本中出現(xiàn)了5次,但是出現(xiàn)正反兩邊次數(shù)差不多,沒有什么區(qū)分度。而”worth“出現(xiàn)了2次,但卻只出現(xiàn)在pos類中,顯然更具有強烈的剛晴色彩,即區(qū)分度很高。

因此,我們需要引入TF-IDF(Term Frequency-Inverse Document Frequency,詞頻和逆向文件頻率)對每個單詞做進(jìn)一步考量。

TF(詞頻)的計算很簡單,就是針對一個文件t,某個單詞Nt 出現(xiàn)在該文檔中的頻率。比如文檔“I love this movie”,單詞“l(fā)ove”的TF為1/4。如果去掉停用詞“I"和”it“,則為1/2。

IDF(逆向文件頻率)的意義是,對于某個單詞t,凡是出現(xiàn)了該單詞的文檔數(shù)Dt,占了全部測試文檔D的比例,再求自然對數(shù)。

比如單詞“movie“一共出現(xiàn)了5次,而文檔總數(shù)為12,因此IDF為ln(5/12)。

很顯然,IDF是為了凸顯那種出現(xiàn)的少,但是占有強烈感情色彩的詞語。比如“movie”這樣的詞的IDF=ln(12/5)=0.88,遠(yuǎn)小于“l(fā)ove”的IDF=ln(12/1)=2.48。

TF-IDF就是把二者簡單的乘在一起就行了。這樣,求出每個文檔中,每個單詞的TF-IDF,就是我們提取得到的文本特征值。

3、向量化

有了上述基礎(chǔ),就能夠?qū)⑽臋n向量化了。我們先看代碼,再來分析向量化的意義:

# -*- coding: utf-8 -*-

import scipy as sp

import numpy as np

from sklearn.datasets import load_files

from sklearn.cross_validation import train_test_split

from sklearn.feature_extraction.text import TfidfVectorizer

'''''加載數(shù)據(jù)集,切分?jǐn)?shù)據(jù)集80%訓(xùn)練,20%測試'''

movie_reviews = load_files('endata')

doc_terms_train, doc_terms_test, y_train, y_test\

= train_test_split(movie_reviews.data, movie_reviews.target, test_size = 0.3)

'''''BOOL型特征下的向量空間模型,注重,測試樣本調(diào)用的是transform接口'''

count_vec = TfidfVectorizer(binary = False, decode_error = 'ignore',\

stop_words = 'english')

x_train = count_vec.fit_transform(doc_terms_train)

x_test = count_vec.transform(doc_terms_test)

x = count_vec.transform(movie_reviews.data)

y = movie_reviews.target

print(doc_terms_train)

print(count_vec.get_feature_names())

print(x_train.toarray())

print(movie_reviews.target)

運行結(jié)果如下:

[b'waste of time.', b'a shit movie.', b'a nb movie.', b'I love this movie!', b'shit.', b'worth my money.', b'sb movie.', b'worth it!']

['love', 'money', 'movie', 'nb', 'sb', 'shit', 'time', 'waste', 'worth']

[[ 0.????????? 0.????????? 0.????????? 0.????????? 0.????????? 0.?? 0.70710678? 0.70710678? 0.??????? ]

[ 0.????????? 0.????????? 0.60335753? 0.????????? 0.????????? 0.79747081?? 0.????????? 0.????????? 0.??????? ]

[ 0.????????? 0.????????? 0.53550237? 0.84453372? 0.????????? 0.????????? 0.?? 0.????????? 0.??????? ]

[ 0.84453372? 0.????????? 0.53550237? 0.????????? 0.????????? 0.????????? 0.?? 0.????????? 0.??????? ]

[ 0.????????? 0.????????? 0.????????? 0.????????? 0.????????? 1.????????? 0.?? 0.????????? 0.??????? ]

[ 0.????????? 0.76642984? 0.????????? 0.????????? 0.????????? 0.????????? 0.?? 0.????????? 0.64232803]

[ 0.????????? 0.????????? 0.53550237? 0.????????? 0.84453372? 0.????????? 0.?? 0.????????? 0.??????? ]

[ 0.????????? 0.????????? 0.????????? 0.????????? 0.????????? 0.????????? 0.?? 0.????????? 1.??????? ]]

[1 1 0 1 0 1 0 1 1 0 0 0]

python輸出的比較混亂。我這里做了一個表格如下:

從上表可以發(fā)現(xiàn)如下幾點:

1、停用詞的過濾。

初始化count_vec的時候,我們在count_vec構(gòu)造時傳遞了stop_words = 'english',表示使用默認(rèn)的英文停用詞。可以使用count_vec.get_stop_words()查看TfidfVectorizer內(nèi)置的所有停用詞。當(dāng)然,在這里可以傳遞你自己的停用詞list(比如這里的“movie”)

2、TF-IDF的計算。

這里詞頻的計算使用的是sklearn的TfidfVectorizer。這個類繼承于CountVectorizer,在后者基本的詞頻統(tǒng)計基礎(chǔ)上增加了如TF-IDF之類的功能。

我們會發(fā)現(xiàn)這里計算的結(jié)果跟我們之前計算不太一樣。因為這里count_vec構(gòu)造時默認(rèn)傳遞了max_df=1,因此TF-IDF都做了規(guī)格化處理,以便將所有值約束在[0,1]之間。

3、count_vec.fit_transform的結(jié)果是一個巨大的矩陣。我們可以看到上表中有大量的0,因此sklearn在內(nèi)部實現(xiàn)上使用了稀疏矩陣。本例子數(shù)據(jù)較小。如果讀者有興趣,可以試試機器學(xué)習(xí)科研工作者使用的真實數(shù)據(jù),來自康奈爾大學(xué):http://www.cs.cornell.edu/people/pabo/movie-review-data/。這個網(wǎng)址提供了很多數(shù)據(jù)集,其中有幾個2M左右的數(shù)據(jù)庫,正反例700個左右。這樣的數(shù)據(jù)規(guī)模也不算大,1分鐘內(nèi)還是可以跑完的,建議大家試一試。不過要注重這些數(shù)據(jù)集可能存在非法字符問題。所以在構(gòu)造count_vec時,傳入了decode_error = 'ignore',以忽略這些非法字符。

上表的結(jié)果,就是訓(xùn)練8個樣本的8個特征的一個結(jié)果。這個結(jié)果就可以使用種種分類算法進(jìn)行分類了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持樂購源碼。

總結(jié)

以上是生活随笔為你收集整理的python 文本向量化_Python文本特征抽取与向量化算法学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。