中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

營銷培訓(xùn)班深圳短視頻seo教程

營銷培訓(xùn)班,深圳短視頻seo教程,在商用網(wǎng)站上用明星的名字做昵稱,無錫網(wǎng)站建設(shè)套餐一、說明 維基百科是豐富的信息和知識來源。它可以方便地構(gòu)建為帶有類別和其他文章鏈接的文章,還形成了相關(guān)文檔的網(wǎng)絡(luò)。我的 NLP 項(xiàng)目下載、處理和應(yīng)用維基百科文章上的機(jī)器學(xué)習(xí)算法。 在我的上一篇文章中,KMeans 聚類應(yīng)用于一組大約 300 篇維基百科文…

一、說明?

????????維基百科是豐富的信息和知識來源。它可以方便地構(gòu)建為帶有類別和其他文章鏈接的文章,還形成了相關(guān)文檔的網(wǎng)絡(luò)。我的 NLP 項(xiàng)目下載、處理和應(yīng)用維基百科文章上的機(jī)器學(xué)習(xí)算法。

在我的上一篇文章中,KMeans 聚類應(yīng)用于一組大約 300 篇維基百科文章。如果沒有任何預(yù)期的標(biāo)簽,則只能通過檢查哪些文章被分組在一起以及哪個單詞最常出現(xiàn)來接近聚類結(jié)果。結(jié)果并不令人信服,例如有關(guān)人工智能的文章與有關(guān)太空探索的文章歸為一類。

為了提高聚類結(jié)果,本文實(shí)現(xiàn)了三個不同的目標(biāo)。首先,可視化文檔矢量化結(jié)果并繪制聚類。其次,應(yīng)用不同的矢量化方法。第三,使用額外的聚類算法。

本文的技術(shù)背景是Python v3.11scikit-learn v1.2.2。所有示例也應(yīng)該適用于較新的庫版本。

本文最初出現(xiàn)在我的博客admantium.com上。

二、相關(guān)境況

????????本文是有關(guān)使用 Python 進(jìn)行 NLP 的博客系列的一部分。在我之前的文章中,我介紹了如何使用該WikipediaReader對象從“機(jī)器學(xué)習(xí)”、“航天器”和“Python(編程語言)”文章中下載 100 個子頁面,創(chuàng)建了約 300 篇文章的語料庫。這些文章,僅僅是文本文件,由一個對象進(jìn)一步處理WikipediaCorpus,以總結(jié)所有文章的整體。然后創(chuàng)建一個 Pandas DataFrame 對象,其中包含每篇文章的標(biāo)題、文本、預(yù)處理文本和標(biāo)記。最后,將預(yù)處理后的文本矢量化并用作聚類算法的輸入。

2.1 目標(biāo) 1:可視化

第一個目標(biāo)是更好地理解文檔的向量空間。在到目前為止的文章系列中,使用 SciKit Learn 內(nèi)置的 .zip 文件將詞袋詞典轉(zhuǎn)換為向量DictVectorizer。以下代碼片段顯示了它的應(yīng)用并給出了對結(jié)果向量的印象:

from sklearn.feature_extraction import DictVectorizer vectorizer = DictVectorizer(sparse= False ) 
x_train = vectorizer.fit_transform(X[ 'bow' ]) print ( type (x_train)) 
#numpy.ndarray print (x_train) 
#[[ 15. 0. 10 . ... 0.0.0.] 
# [662. 0. 430. ... 0. 0. 0.] 
# [316. 0.143....0.0.0.] 
#... 
#[319. 0.217. ... 0.0.0.] 
# [158. 0.147. ... 0.0.0.] 
# [328. 0. 279. ... 0. 0. 0.]] print (x_train.shape) 
# (272, 52743) print (vectorizer.get_feature_names_out()) 
# array([',', ',1', '. ', ..., 'zy', 'zygomaticus', 'zygote'], dtype=object) print ( len (vectorizer.get_feature_names_out())) 
# 52743

如您所見,生成的向量有 52743 個維度。

為了繪制它們,我們將使用 PCA 進(jìn)行降維,然后繪制它。通過以下代碼實(shí)現(xiàn)對訓(xùn)練數(shù)據(jù)應(yīng)用 2D PCA,然后繪制繪圖:

import matplotlib.pyplot as plt 
from sklearn.decomposition import PCA def  pca_reduce ( vec_list,dimensions= 2 ): return PCA(dimensions).fit_transform(vec_list) def  d2_plot ( data ): plt.plot(data, 'o' ) d2_plot( pca_reduce(x_train, 2 ))

數(shù)據(jù)點(diǎn)沒有明顯的分離,它們或多或少以 y 軸為中心,具有零值和一些異常值。當(dāng)使用另一種降維機(jī)制時,這個圖會改變嗎?

以下代碼將TruncatedSVD應(yīng)用于數(shù)據(jù)。

import matplotlib.pyplot as plt 
from sklearn.decomposition import TruncatedSVD def  pca_reduce ( vec_list,dimensions= 2 ): return TruncatedSVD(dimensions, n_iter= 40 ).fit_transform(vec_list) def  d2_plot ( data ): plt.plot(data, '. ' ) d2_plot(pca_reduce(x_train, 2 ))

該圖看起來有點(diǎn)不同,y 軸上值小于 0 的異常值較少。

最后,讓我們以 3D 圖表的形式查看數(shù)據(jù)。

import matplotlib.pyplot as plt 
from sklearn.decomposition import PCA def  pca_reduce ( vec_list,dimensions ): return PCA(dimensions).fit_transform(vec_list) def  d3_plot ( data ): Fig = plt.figure() ax = Fig.add_subplot(projection = '3d' ) for _, v in  enumerate (data[: 90 ]): ax.scatter(v[ 0 ],v[ 1 ], v[ 2 ],marker= '.' , color= 'r' ) for _, v in  enumerate (data[ 90 : 180 ]): ax.scatter(v[ 0 ],v[ 1 ], v[ 2 ],marker= '.' , color= 'g' ) for _, v在 enumerate (data[ 180 :]) 中:ax.scatter(v[ 0 ],v[ 1 ], v[ 2 ],marker = '.' , color= 'b' ) plt.show() d3_plot(pca_reduce( x_train, 3 ))

在此圖中,數(shù)據(jù)點(diǎn)也非常密切相關(guān)。

這些可視化顯示了使用詞袋文檔表示的一個明顯缺點(diǎn):生成的向量彼此接近,使得聚類算法難以正確分離文檔。為了更好地區(qū)分?jǐn)?shù)據(jù),我們需要使用另一種向量化方法并直觀地比較得到的向量空間。

2.2 目標(biāo) 2:應(yīng)用不同的矢量化方法

????????假設(shè)更改向量化方法可以導(dǎo)致更好的分離向量,從而獲得更好的聚類,本節(jié)介紹兩種不同的向量化方法:Tfidf 和 WordVectors。

2.2.1 Tfidf矢量化

????????SciKit Learn 具有內(nèi)置的 Tfidf Vector,可應(yīng)用于原始文本數(shù)據(jù)。preprocessed在該項(xiàng)目的設(shè)置過程中,生成了原始數(shù)據(jù)的特殊表示,其中所有單詞都表示為其引理,并且刪除了大多數(shù)停用詞。將根據(jù)該數(shù)據(jù)計(jì)算 Tfidf 向量。

????????這是相關(guān)代碼:

from sklearn.feature_extraction.text import TfidfVectorizerx_train = X['preprocessed'].tolist()vectorizer = TfidfVectorizer()
x_train = vectorizer.fit_transform(x_train)print(x_train.shape)
# (272, 40337)print(x_train)
# (0, 1002) 0.010974360184074128
# (0, 5031) 0.011294684416460914
# (0, 30935) 0.013841666362619034
# (0, 1004) 0.010228010133798603
# (0, 22718) 0.009819505656781956
# (0, 1176) 0.012488241517746365
# (0, 4398) 0.012488241517746365
# (0, 8803) 0.015557383558602929
# (0, 36287) 0.028985349686940432

生成的向量空間只有 40337 維。對結(jié)果向量應(yīng)用 2D 和 3D PCA 得出以下圖表:

2D 圖表顯示了數(shù)據(jù)點(diǎn)之間更清晰的分離,而在 3D 圖表中,我們看到紅色和綠色標(biāo)記點(diǎn)之間存在一些差異。

2.2.2 詞向量向量化

????????詞向量用多維值表示每個詞,該多維值表示其在訓(xùn)練的語料庫材料的上下文中的含義。正如前面的文章所述,存在不同的預(yù)訓(xùn)練詞向量表示,Gensim 庫提供它們方便的下載。

????????在以下示例中,使用具有 50 個維度的 Glove Gigaword 預(yù)訓(xùn)練向量。DataFrame 對象已經(jīng)定義了一個token從預(yù)處理文本派生的列表(只有引理,沒有停用詞),并從中創(chuàng)建一個包含單詞向量的新列。

import gensim.downloader as api
import numpy as npvocab = corpus.vocab()
vector_lookup = api.load('glove-wiki-gigaword-50')
word_vector(tokens):return np.array([vector_lookup[token]for token in tokensif token in vocab and token in vector_lookup])X['word_vector'] = X['tokens'].apply(lambda tokens: word_vector(tokens))

運(yùn)行此代碼會生成以下增強(qiáng)的 DataFrame 對象:

在目前的形式中,詞向量具有不同的長度。詳細(xì)打印它們的長度并繪制直方圖是通過以下代碼實(shí)現(xiàn)的:

word_vector_length = np.array([len(tokens) for tokens in X['word_vector'].to_numpy().flatten()])print(word_vector_length[:5])
# [760, 157, 7566, 2543, 2086]bins=int(np.max(word_vector_length)/1000)plt.hist(x=word_vector_length,  bins=bins, density=False)
plt.show()print(f'Mean: {word_vector_length.mean()}')
# Mean: 2248.904411764706

直方圖清楚地表明較短的文章文本是常態(tài):

要應(yīng)用 PCA,需要填充和截?cái)嘞蛄?。我選擇最大字長為 6000,這意味著填充/截?cái)酁?300000。

def pad_word_vectors(vec_list, padding_value):res = []for vec in vec_list:con = np.array([v for v in vec]).reshape(-1)con_padded = np.pad(con, (0, padding_value))con_truncated = con_padded[:padding_value]res.append(con_truncated)return np.array(res)def pca_reduce(vec_list, n_components):return PCA(n_components).fit_transform(vec_list)X = pd.read_pickle('ml29_01_word_vectors.pkl')x_train = X['word_vector'].to_numpy()
x_train_padded = pad_word_vectors(x_train,300000)
x_train_2d = pca_reduce(x_train_padded,2)
x_train_3d = pca_reduce(x_train_padded,3)

截?cái)嗪吞畛涞南蛄勘硎緸?2D 和 3D 向量:

兩張圖都顯示了數(shù)據(jù)點(diǎn)的清晰分離。

總結(jié)一下:DictVectorizer詞袋的首字母使文檔彼此非常接近。使用 Tfidf,尤其是 WordVectors 顯然可以更好地分發(fā)文檔。

2.3 目標(biāo) 3:應(yīng)用聚類算法

KMeans 只是眾多聚類算法中的一種。根據(jù)這篇關(guān)于主題建模的博客文章的建議,應(yīng)該根據(jù)數(shù)據(jù)的可分離程度來選擇聚類算法。例如,K 均值適用于小數(shù)據(jù)集上的低維值,而當(dāng)簇的密度和大小可變且數(shù)據(jù)通常為高維時,基于密度的空間聚類 (DBSCAN) 效果更好。這兩種方法都創(chuàng)建平面集群,而另一組算法創(chuàng)建層次集群,例如Ward或由HDBSCAN Paython 庫實(shí)現(xiàn)的基于層次密度的空間聚類方法。

基于此,我決定使用DBSCAN和OPtics算法,文檔稱其更適合大型數(shù)據(jù)集。KMeans 用作基線。

2.3.1 使用 Tfidf 向量進(jìn)行聚類

KMeans 與 Tfidf

使用 KMeans 時,需要預(yù)先給出預(yù)期的簇?cái)?shù)。嘗試不同的數(shù)字并檢查結(jié)果文檔分布是關(guān)鍵。

下面的代碼展示了創(chuàng)建8個集群的結(jié)果:

model = KMeans(n_clusters=8, random_state=0, n_init="auto").fit(x_train)print(model)
# KMeans(n_init='auto', random_state=0)print(model.get_params())
#{'algorithm': 'lloyd', 'copy_x': True, 'init': 'k-means++', 'max_iter': 300, 'n_clusters': 8, 'n_init': 'auto', 'random_state': 0, 'tol': 0.0001, 'verbose': 0}print(model.labels_)
#[4 6 6 6 6 4 2 4 2 4 2 4 2 2 2 2 2 2 2 2 4 4 4 4 4 4 2 4 3 4 0 6 5 6 3 2 4
# 1 4 5 4 0 1 2 1 1 2 2 0 6 2 1 2 1 5 5 2 2 7 2 5 5 5 5 5 4 4 2 4 1 2 2 2 2
# 5 2 2 2 4 0 5 5 2 6 6 2 5 0 0 5 0 1 4 4 2 5 0 2 2 2 6 6 4 6 0 0 5 2 2 4 4
# 0 0 5 1 1 1 1 6 2 0 2 2 5 4 2 4 4 4 1 2 1 2 2 2 0 4 4 4 4 2 4 3 6 3 3 7 7
# 3 3 1 2 2 2 2 4 4 1 1 4 4 2 2 2 0 2 2 4 6 6 2 4 0 0 7 6 4 6 7 2 4 6 6 1 7
# 4 1 1 1 4 7 4 4 4 4 4 6 5 7 4 4 7 2 6 4 5 6 6 6 6 6 3 4 5 1 1 5 3 3 5 1 6
# 3 3 6 1 6 6 1 1 6 6 6 6 3 3 2 3 1 3 1 3 3 6 1 6 5 6 5 3 6 6 1 3 3 3 3 5 6
# 5 6 6 3 7 2 3 2 1 4 6 3 1]

視覺表示顯示簇的分離不均勻:

讓我們嘗試創(chuàng)建 5 個集群。

model = KMeans(n_clusters=8, random_state=0, n_init="auto").fit(x_train)print(model.labels_)
# [0 2 2 2 4 0 2 0 4 3 3 4 3 3 3 3 3 3 3 3 0 0 0 0 0 4 3 4 4 4 3 4 2 4 4 3 4
#  4 0 2 3 0 1 3 4 2 4 3 0 4 3 1 3 2 2 2 3 3 0 3 2 2 2 4 4 4 0 3 0 2 3 3 3 3
#  1 3 3 3 4 3 1 4 3 2 2 3 2 0 0 2 0 1 4 4 3 2 0 3 2 2 2 2 0 2 2 0 1 3 2 4 0
#  0 3 4 1 1 1 1 2 3 3 3 3 4 0 3 4 0 0 1 3 1 3 3 3 3 0 0 0 0 3 0 4 2 4 4 0 0
#  4 4 4 3 3 3 3 4 0 1 1 4 0 3 3 3 3 3 3 4 1 2 3 4 0 3 0 4 4 2 0 3 0 2 1 1 0
#  4 1 1 2 4 0 0 0 0 0 0 2 2 0 0 0 0 4 4 4 2 2 2 2 1 2 4 0 2 1 1 2 4 4 4 1 2
#  4 4 2 2 2 2 2 1 4 2 2 2 4 4 3 4 1 4 1 4 4 2 2 2 2 2 2 4 4 2 2 4 4 4 4 2 2
#  2 2 2 4 0 3 4 3 2 0 4 2 1]

5 個簇的直方圖顯示出明顯的分離:

在 3D 圖中繪制文檔也很有前途:

2.4 DBSCAN 與 Tfidf

以下代碼片段加載 pickles 數(shù)據(jù)、提取預(yù)處理文本并應(yīng)用 Tfidf 矢量器。然后,通過實(shí)例化 SciKit learn 對象來創(chuàng)建 DBSCAN 算法。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import DBSCAN
import pandas as pdX = pd.read_pickle('ml29_01.pkl')
x_train = X['preprocessed'].tolist()
vectorizer = TfidfVectorizer()
x_train = vectorizer.fit_transform(x_train)

使用沒有任何參數(shù)化的 DBSCAN 會產(chǎn)生非常令人驚訝的結(jié)果:

model = DBSCAN()
print(model.get_params())
# {'algorithm': 'auto', 'eps': 0.5, 'leaf_size': 30, 'metric': 'euclidean', 'metric_params': None, 'min_samples': 5, 'n_jobs': None, 'p': None}print(model.labels_)
# [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
# -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
# ...
#  -1 -1 -1 -1 -1 -1 -1 -1]

該值-1表示數(shù)據(jù)噪聲太大,無法聚類。這是什么原因呢?是因?yàn)?Tfidf 向量稀疏嗎?這可以通過 TruncatedSVD 來解決。

from sklearn.decomposition import TruncatedSVDdef pca_reduce(vec_list, n_components):return TruncatedSVD(n_components).fit_transform(vec_list)x_train_3d = pca_reduce(x_train, 3)
model = DBSCAN().fit(x_train_3d)print(model.get_params())
# {'algorithm': 'auto', 'eps': 0.5, 'leaf_size': 30, 'metric': 'euclidean', 'metric_params': None, 'min_samples': 5, 'n_jobs': None, 'p': None}print(model.labels_)
# [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# ...
# 0 0 0 0 0 0 0 0 0 0 0 0 0]

現(xiàn)在,所有文檔都被放入唯一的向量中。

三、帶 Tfidf 的光學(xué)器件

光學(xué)算法無法在sparseTfODF 矢量化器返回的矩陣類型上運(yùn)行。需要預(yù)先通過應(yīng)用 Numpy 轉(zhuǎn)換方法將其轉(zhuǎn)換為稠密矩陣。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import OPTICSX = pd.read_pickle('ml29_01.pkl')
x_train = X['preprocessed'].tolist()
vectorizer = TfidfVectorizer()
x_train = vectorizer.fit_transform(x_train).todense()

應(yīng)用具有一個參數(shù)的 OPTICS 算法可得出以下結(jié)果:

model = OPTICS(min_samples=10).fit(np.array(x_train))print(model.get_params())
#{'algorithm': 'auto', 'cluster_method': 'xi', 'eps': None, 'leaf_size': 30, 'max_eps': inf, 'memory': None, 'metric': 'minkowski', 'metric_params': None, 'min_cluster_size': None, 'min_samples': 10, 'n_jobs': None, 'p': 2, 'predecessor_correction': True, 'xi': 0.05}print(model.labels_)
#[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# ...
# 0 0 0 0 0 0 0 0 0 0 0 0 0]

不幸的是,所有文檔都被再次放入一個且只有一個簇中。

四、Tfidf使用總結(jié)

????????使用 Tfidf 向量僅顯示 KMeans 聚類的良好結(jié)果。尤其是5個簇時,可以實(shí)現(xiàn)明顯的分離。相反,DBSCAN 和 Optics 僅將所有文檔放置在同一簇中。

4.1 使用 WordVector 進(jìn)行聚類-帶有詞向量的 KMeans

????????應(yīng)用字向量遵循與上述相同的過程,從 DataFrame 加載其表示,然后對 300.000 個值(6000 個字)應(yīng)用填充和截?cái)唷?/span>

????????這次,KMeans 展現(xiàn)了一個驚喜:當(dāng)使用 300.000 長度的向量時,所有文檔也被放入一個簇中:

x_train_padded = pad_word_vectors(x_train,300000)n_clusters = 5
model = KMeans(n_clusters, random_state=0, n_init="auto").fit(x_train_padded )print(model.labels_)
# [2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
#  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
#  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2
#  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 2
#  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 2 2 2 2 2 2 2 2 2 2 2 2
#  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
#  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2
#  2 2 2 2 2 2 2 2 2 2 2 2 2]

將它們簡化為 3D 向量可實(shí)現(xiàn)良好的分離:

x_train_padded = pad_word_vectors(x_train,300000)
x_train_3d = pca_reduce(x_train_padded,3)n_clusters = 5
model = KMeans(n_clusters, random_state=0, n_init="auto").fit(x_train_3d)print(model.labels_)
#[0 0 1 2 2 2 2 0 0 0 0 4 0 3 0 4 0 2 4 3 4 4 1 0 3 4 0 3 4 0 0 0 4 4 4 4 0
# 4 2 0 0 0 3 2 4 4 2 3 0 4 0 3 0 3 1 2 0 0 0 0 4 0 0 1 4 2 1 1 2 1 0 0 0 0
# 0 2 2 4 0 4 0 0 2 2 3 4 4 4 0 0 0 0 2 2 4 2 1 4 1 2 2 2 3 4 1 3 0 0 3 0 4
# 4 0 0 2 1 4 2 1 4 0 0 3 0 4 2 2 2 4 1 0 0 1 4 3 0 2 3 4 4 0 4 4 2 0 2 0 0
# 4 3 1 0 0 4 0 4 2 1 2 2 3 0 0 0 4 0 0 3 0 2 0 3 0 0 0 3 0 0 0 3 0 2 4 2 0
# 3 0 0 2 4 0 3 1 0 0 4 4 3 0 0 1 0 3 4 4 1 2 0 1 0 4 3 3 2 4 0 1 1 0 0 1 3
# 3 2 3 2 4 0 4 1 4 4 0 0 4 4 4 2 4 0 0 2 2 3 1 1 2 1 1 0 0 4 1 3 4 3 3 1 2
# 1 3 3 0 3 3 4 4 4 2 0 4 1]

以下是所有簇的直方圖和 3D 表示:

另外,讓我們看看集群 1 和 5 的詞云。

可以看出,集群1是關(guān)于Python、軟件、系統(tǒng)和模型的。

第 5 組是關(guān)于航天器、衛(wèi)星和太空的。這種區(qū)別對我來說看起來很有希望。

4.2 數(shù)據(jù)庫掃描

????????讓我們看看DBSCAN如何處理新的集群數(shù)據(jù)。

x_train_padded = pad_word_vectors(x_train,300000)model = DBSCAN().fit(x_train_3d)print(model.labels_)
# [-1  0 -1 -1 -1 -1 -1  0 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
#  -1 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1
#   0 -1 -1 -1  0 -1 -1 -1 -1  0  0 -1 -1  0  0 -1 -1 -1 -1 -1 -1 -1  0 -1
#  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
#  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
#   0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
#  -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  0  0 -1  0 -1 -1
#  -1 -1 -1 -1 -1  0  0 -1  0 -1 -1 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1
#  -1 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
#  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
#  -1 -1 -1 -1 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
#  -1 -1 -1 -1 -1 -1 -1 -1]

????????不幸的是,使用 300.000 維將所有結(jié)果放入 1 個簇中。通過 3D PCA 減少向量,一些文檔仍然被檢測為-1,噪聲太大的數(shù)據(jù)。

????????為了改善 DBSCAN 結(jié)果,我嘗試了不同的參數(shù),例如DBSCAN(eps=1.0, min_samples=10, algorithm='brute',但無濟(jì)于事 - 聚類結(jié)果仍然存在。另一種選擇是定義自定義距離函數(shù),但我沒有在本文的范圍內(nèi)應(yīng)用它。

五、光學(xué)

????????使用 300.000 維向量時,OPTICS 算法顯示相同的結(jié)果:

x_train_padded = pad_word_vectors(x_train,300000)model = OPTICS(min_samples=10).fit(np.array(x_train_padded))
print(model.labels_)
# [-1  0 -1 -1 -1 -1 -1  0  0 -1  0 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1
#  -1 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1  0  0 -1 -1 -1 -1 -1 -1
#   0 -1 -1 -1  0 -1 -1 -1  0  0  0 -1 -1  0  0 -1 -1 -1 -1 -1 -1 -1  0 -1
#   0 -1  0 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1  0 -1  0  0 -1 -1 -1 -1
#  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
#   0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
#  -1 -1 -1  0 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1  0  0 -1  0  0 -1
#  -1 -1 -1 -1 -1  0  0 -1  0 -1 -1 -1 -1 -1 -1 -1  0 -1  0 -1 -1 -1 -1 -1
#  -1 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  0
#  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
#  -1 -1 -1 -1 -1 -1 -1 -1 -1  0  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
#  -1 -1 -1 -1 -1  0 -1 -1]

????????但在繪制 3D 版本時,簇開始出現(xiàn)。

x_train_3d = pca_reduce(x_train_padded,3)model = OPTICS(min_samples=10).fit(np.array(x_train_3d))
print(model.labels_)
# [-1  2  5 -1 -1 -1 -1  2  2  0  2  3 -1 -1  1  3 -1 -1  4 -1  4  3  5 -1
#  -1  3  0 -1  4  1  2  0 -1  4 -1 -1 -1  4 -1 -1  2  2 -1 -1 -1 -1 -1 -1
#   2 -1  1 -1  2 -1  5 -1  2  2  2  1  4  2  2  5  4 -1  5  5 -1  5  2  0
#   2  0  2 -1 -1  3  0 -1  2  1 -1 -1 -1  3  3 -1  2  0  2  2 -1 -1  4 -1
#   5 -1  5 -1 -1 -1 -1  3 -1 -1  1  2 -1 -1  3  3 -1  1 -1  5  4 -1  5  3
#   2 -1 -1  0 -1 -1 -1 -1 -1  5 -1  1  5  4 -1  1 -1 -1  4  4  1  4 -1 -1
#  -1 -1 -1  2  3 -1  5  1  1  4  0 -1 -1  5 -1 -1 -1  0  2  2 -1  2  2 -1
#  -1 -1 -1 -1  0  2  2 -1  2  1 -1 -1  1 -1 -1 -1  2 -1  2  1 -1  4  0 -1
#   5 -1  1  3  3 -1  2  1  5 -1 -1  4 -1 -1 -1  1  5 -1 -1 -1 -1 -1 -1  2
#  -1  5 -1  1  5 -1 -1 -1 -1 -1 -1  2 -1  5  4 -1 -1  1  3 -1  4 -1 -1  1
#  -1 -1 -1 -1  5  5 -1  5  5  2  2 -1  5 -1 -1 -1 -1 -1 -1 -1 -1 -1  0 -1
#  -1 -1 -1 -1 -1  2 -1 -1]

????????經(jīng)過一些參數(shù)調(diào)整,我最終得到了以下表示:

model = OPTICS(min_samples=5, metric='minkowski').fit(np.array(x_train_3d))print(model.get_params())
# {'algorithm': 'auto', 'cluster_method': 'xi', 'eps': None, 'leaf_size': 30, 'max_eps': inf, 'memory': None, 'metric': 'minkowski', 'metric_params': None, 'min_cluster_size': None, 'min_samples': 5, 'n_jobs': None, 'p': 2, 'predecessor_correction': True, 'xi': 0.05}print(model.labels_)
# [-1 -1 18 -1 -1 12 -1 -1  3 -1  4  8  6 15 -1  9  6 -1 10 -1 10  8 -1 -1
#  -1  8  0 16 10 -1  4  0 11 10  9 11 -1 10 13 -1  5 -1 15 13 11  9 14 -1
#   5  9 -1 15 -1 -1 -1 -1  3  5 -1 -1 10 -1 -1 18 10 -1 -1 -1 -1 -1 -1  0
#  -1  0  2 14 -1  7  0 10  3 -1 14 13 -1  8 -1  9  5  0  3  3 -1 -1 10 -1
#  -1 11 -1 -1 13 -1 15 -1 -1 16 -1  4 16 -1 -1 -1 -1 -1 -1 18 10 13 18  7
#   4 -1 17 -1 11 -1 -1 12 11 -1 -1  1 -1 10 -1 -1 12 17 10 10 -1 10  9 -1
#   6 12 -1 -1  7 -1 18  1 -1 11  0 -1 -1 -1 -1 14 15  0  4  4 11  5  3 -1
#  -1 -1  6 16 -1  4  4 -1 -1 -1 -1 16  1 13 -1 13  5 17  2  1 13 10  0 -1
#  -1 -1  1  7  8 -1  5 -1 -1 -1 15 10  9 19 13 -1 -1 -1  9 -1 -1 13  9  2
#  19 18  6 -1 -1 15 17 12 -1 13  9  2 11 -1 10 11  6 -1  8  9 10 -1  9 -1
#   7 14 12 -1 18 -1 13 18 19  4  2 -1 18 15 11 17 15 19 -1 19 -1 -1  0 -1
#  15 11 10 11 14  3 11 -1]

直方圖和 3D 繪圖顯示簇是分開的:

?WordVectors 使用總結(jié)

????????WordVectors 產(chǎn)生了令人驚訝的結(jié)果。一般來說,使用 300.000 維的原始向量是不適用的:由每個文本的詞序決定的數(shù)據(jù)方差太大,無法找到有意義的聚類。需要應(yīng)用降維技術(shù)。然后,KMeans 再次顯示出最好的分離度,其次是 OPTICS。

六、結(jié)論

????????文檔分類結(jié)果取決于輸入數(shù)據(jù)的形狀以及分類算法。在將簡單的詞袋向量與 KMeans 結(jié)合使用時出現(xiàn)相當(dāng)令人失望的結(jié)果后,本文將 Tfidf 和詞向量與 KMeans、DBSCAN 和 Optics 結(jié)合起來。這些實(shí)驗(yàn)中最關(guān)鍵的學(xué)習(xí)點(diǎn)是:a)Tfidf 提供了干凈的分離,無需降維即可使用,b)WordVectors 只能在降維后應(yīng)用,c)KMeans 提供良好的聚類結(jié)果,無需任何參數(shù)化, d) OPTICS 也提供了很好的集群,但其參數(shù)需要調(diào)整。

http://www.risenshineclean.com/news/12188.html

相關(guān)文章:

  • 360搜索建站公司免費(fèi)發(fā)布推廣的網(wǎng)站有哪些
  • 墻蛙網(wǎng)站誰家做的搜索引擎優(yōu)化概述
  • 網(wǎng)站懸浮廣告代碼網(wǎng)站策劃書模板范文
  • 自己做網(wǎng)站教程做銷售有什么技巧和方法
  • 個人網(wǎng)站主頁設(shè)計(jì)網(wǎng)絡(luò)優(yōu)化的基本方法
  • 做用戶運(yùn)營應(yīng)該關(guān)注哪些網(wǎng)站十大輿情網(wǎng)站
  • 網(wǎng)站開發(fā)國內(nèi)外研究狀況九易建網(wǎng)站的建站模板
  • 網(wǎng)站建設(shè)_免費(fèi)視頻武漢剛剛突然宣布
  • 做一個模板網(wǎng)站多少錢如何推廣好一個產(chǎn)品
  • 絞銅機(jī) 東莞網(wǎng)站建設(shè)網(wǎng)站seo排名培訓(xùn)
  • 男的直接做的視頻網(wǎng)站站長seo推廣
  • 北京企業(yè)網(wǎng)站設(shè)計(jì)制作百度關(guān)鍵字推廣費(fèi)用
  • 做拼貨商城網(wǎng)站國際婚戀網(wǎng)站排名
  • 企業(yè)做網(wǎng)站需要哪些材料網(wǎng)絡(luò)優(yōu)化培訓(xùn)騙局
  • ac86u做網(wǎng)站服務(wù)器百度競價推廣方案范文
  • javascript菜鳥教程簡單網(wǎng)站建設(shè)優(yōu)化推廣
  • 公司網(wǎng)站用什么開發(fā)云服務(wù)器免費(fèi)
  • 推廣做網(wǎng)站怎么樣電子商務(wù)網(wǎng)站
  • wordpress的語言優(yōu)化營商環(huán)境條例
  • 北海網(wǎng)站建設(shè)比百度強(qiáng)大的搜索引擎
  • 西寧網(wǎng)站維護(hù)推廣引流網(wǎng)站
  • 網(wǎng)站引導(dǎo)視頻怎么做友情鏈接交換條件
  • 建材網(wǎng)站石家莊網(wǎng)絡(luò)推廣平臺
  • 如何讓百度不收錄網(wǎng)站b2b免費(fèi)發(fā)布平臺
  • 汕頭食品駿域網(wǎng)站建設(shè)廣州seo
  • 用asp.net做的 購物網(wǎng)站視頻百度快速排名平臺
  • seo服務(wù)器多ip國家優(yōu)化防控措施
  • 網(wǎng)站建設(shè)實(shí)踐報(bào)告怎么優(yōu)化網(wǎng)站關(guān)鍵詞的方法
  • 網(wǎng)站建設(shè)與網(wǎng)頁設(shè)計(jì)案例教程pdf下載怎么讓百度快速收錄網(wǎng)站
  • 做直通車任務(wù)的網(wǎng)站做個網(wǎng)頁需要多少錢?