分隔百度百科中的名人信息与非名人信息
導(dǎo)入python包
import pandas as pd from pandas import Series, DataFrame導(dǎo)入非名人數(shù)據(jù)
notCelebrity=[] for each in 'ABCDEFGHIJKLMNOPQRSTUVWYZ':dataCSV = pd.read_csv('baidubaike_noCelebrity/{}_notCelebrity.csv'.format(each), sep='|', header=None)notCelebrity.extend(dataCSV[4])data_1 = {'content':notCelebrity} dataFrame_1=DataFrame(data_1) dataFrame_1['values']='1'導(dǎo)入名人數(shù)據(jù)
Celebrity=[] dataCSV = pd.read_csv('baidubaike_celebrity.csv', sep='|') for each in dataCSV['Celebrity'].values:if each==each:Celebrity.append(each)data_2 = {'content':Celebrity} dataFrame_2=DataFrame(data_2) dataFrame_2['values']='0'合并名人數(shù)據(jù)與非名人數(shù)據(jù)
dataFrame = dataFrame_1.append(dataFrame_2) dataFrame=dataFrame.dropna(axis=0,how='any')進(jìn)行分詞
import jieba dataFrame['分詞']=dataFrame['content'].apply(lambda x:' '.join(jieba.cut(x))) X=dataFrame['分詞'] y=dataFrame['values']k折交叉切分
from sklearn.model_selection import StratifiedKFold,KFold from sklearn import preprocessing from sklearn.feature_extraction.text import TfidfTransformer,CountVectorizer from sklearn.preprocessing import LabelEncoder,OneHotEncoder from sklearn.naive_bayes import GaussianNB,MultinomialNB from sklearn.metrics import accuracy_scoreskf = StratifiedKFold(n_splits=10, random_state=1, shuffle=False)for train_index, test_index in skf.split(X, y):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]#提取文本特征vectorizer = CountVectorizer()X_train_termcounts = vectorizer.fit_transform(X_train.astype('U'))tfidf_transformer = TfidfTransformer()X_train_tfidf = tfidf_transformer.fit_transform(X_train_termcounts)#獲取詞袋中所有文本的關(guān)鍵字feature_name = vectorizer.get_feature_names()#建立樸素貝葉斯分類器進(jìn)行訓(xùn)練classifier = MultinomialNB().fit(X_train_tfidf, y_train.astype('str'))#模型測試X_input_termcounts = vectorizer.transform(X_test.astype('str'))X_input_tfidf = tfidf_transformer.transform(X_input_termcounts)#模型預(yù)測predicted_categories = classifier.predict(X_input_tfidf)print(accuracy_score(y_test.astype('str'),predicted_categories))生成的預(yù)測結(jié)果:
0.9666283084004603 0.9700115340253749 0.9619377162629758 0.9676674364896074 0.9688221709006929 0.9711316397228638 0.9688221709006929 0.9653579676674365 0.9745958429561201 0.964203233256351我遇到的錯誤
把自己在這個過程中遇到的問題做一個記錄
- TypeError: a bytes-like object is required, not ‘str’
- AttributeError: ‘NoneType’ object has no attribute ‘get_text’
- RandomForestClassfier.fit(): ValueError: could not convert string to float
- ValueError: Expected 2D array, got 1D array instead
- TypeError: ‘<’ not supported between instances of ‘float’ and ‘str’
- Label encoding across multiple columns in scikit-learn
- ValueError: np.nan is an invalid document, expected byte or unicode string
1.TypeError: a bytes-like object is required, not ‘str’
像錯誤提示說的那樣需要的是字節(jié)類型而不是字符串類型,需要注意一下的是bytes-like翻譯為字節(jié)。
2.AttributeError: ‘NoneType’ object has no attribute ‘get_text’
空對象(空類型)沒有g(shù)et_text()方法,這里注意的是NoneType代表的是空None,這個在爬蟲里面應(yīng)該算是常見的錯誤了吧。
3.RandomForestClassfier.fit(): ValueError: could not convert string to float
無法見字符串轉(zhuǎn)換為浮點(diǎn)型,在機(jī)器學(xué)習(xí)過程中遇到的一個問題,stackoverflow上提供的解決方案是LabelEncoder與OneHotEncoder,參考鏈接
4.ValueError: Expected 2D array, got 1D array instead
期待的是2維的排列,而得到的卻是一維的,解決辦法是reshape(-1,1),對于reshape()這個函數(shù)有必要了解一下,它個作用就是改變數(shù)據(jù)的排列方式。
5.TypeError: ‘<’ not supported between instances of ‘float’ and ‘str’
這是一個由于數(shù)據(jù)類型不對而引起的錯誤,看一下這個例子 我相信就一目了然了。我們需要用到astype(“str”)這個函數(shù)來解決問題
6.Label encoding across multiple columns in scikit-learn
在機(jī)器學(xué)習(xí)過程中把數(shù)據(jù)數(shù)字化可以解決很多不必要的麻煩,如何實(shí)現(xiàn)2D(2維)的數(shù)字化可以參照這個
7.ValueError: np.nan is an invalid document, expected byte or unicode string
看最后一句它期待的是byte或者unicode,顯然可以用astype()解決問題。
StratifiedKFold與KFold
k折交叉驗(yàn)證的過程,第一步我們使用不重復(fù)抽樣將原始數(shù)據(jù)隨機(jī)分為k份,第二步 k-1份數(shù)據(jù)用于模型訓(xùn)練,剩下那一份數(shù)據(jù)用于測試模型。然后重復(fù)第二步k次,我們就得到了k個模型和他的評估結(jié)果(譯者注:為了減小由于數(shù)據(jù)分割引入的誤差,通常k折交叉驗(yàn)證要隨機(jī)使用不同的劃分方法重復(fù)p次,常見的有10次10折交叉驗(yàn)證)。
然后我們計(jì)算k折交叉驗(yàn)證結(jié)果的平均值作為參數(shù)/模型的性能評估。使用k折交叉驗(yàn)證來尋找最優(yōu)參數(shù)要比holdout方法更穩(wěn)定。一旦我們找到最優(yōu)參數(shù),要使用這組參數(shù)在原始數(shù)據(jù)集上訓(xùn)練模型作為最終的模型。
StratifiedKFold采用的是分層采樣隨機(jī)采樣,KFold相當(dāng)于StratifiedKFold的低配版只是實(shí)現(xiàn)了隨機(jī)這一性質(zhì)。
CountVectorizer()與TfidfTransformer()
1.詞袋模型
這里可能需要先了解一下詞袋模型(Bag of words,簡稱 BoW )
詞袋模型假設(shè)我們不考慮文本中詞與詞之間的上下文關(guān)系,僅僅只考慮所有詞的權(quán)重。而權(quán)重與詞在文本中出現(xiàn)的頻率有關(guān)。
詞袋模型首先會進(jìn)行分詞,在分詞之后,通過統(tǒng)計(jì)每個詞在文本中出現(xiàn)的次數(shù),我們就可以得到該文本基于詞的特征,如果將各個文本樣本的這些詞與對應(yīng)的詞頻放在一起,就是我們常說的向量化。向量化完畢后一般也會使用 TF-IDF 進(jìn)行特征的權(quán)重修正,再將特征進(jìn)行標(biāo)準(zhǔn)化。 再進(jìn)行一些其他的特征工程后,就可以將數(shù)據(jù)帶入機(jī)器學(xué)習(xí)模型中計(jì)算。
詞袋模型的三部曲:分詞(tokenizing),統(tǒng)計(jì)修訂詞特征值(counting)與標(biāo)準(zhǔn)化(normalizing)。
詞袋模型有很大的局限性,因?yàn)樗鼉H僅考慮了詞頻,沒有考慮上下文的關(guān)系,因此會丟失一部分文本的語義。
在詞袋模型統(tǒng)計(jì)詞頻的時候,可以使用 sklearn 中的 CountVectorizer 來完成。
2.詞頻向量化
CountVectorizer 類會將文本中的詞語轉(zhuǎn)換為詞頻矩陣,例如矩陣中包含一個元素a[i][j],它表示j詞在i類文本下的詞頻。它通過 fit_transform 函數(shù)計(jì)算各個詞語出現(xiàn)的次數(shù),通過get_feature_names()可獲取詞袋中所有文本的關(guān)鍵字,通過 toarray()可看到詞頻矩陣的結(jié)果。
3.TF-IDF處理
F-IDF(Term Frequency–Inverse Document Frequency)是一種用于資訊檢索與文本挖掘的常用加權(quán)技術(shù)。TF-IDF是一種統(tǒng)計(jì)方法,用以評估一個字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時會隨著它在語料庫中出現(xiàn)的頻率成反比下降。TF-IDF加權(quán)的各種形式常被搜索引擎應(yīng)用,作為文件與用戶查詢之間相關(guān)程度的度量或評級。
TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現(xiàn)的頻率TF高,并且在其他文章中很少出現(xiàn),則認(rèn)為此詞或者短語具有很好的類別區(qū)分能力,適合用來分類。TF-IDF實(shí)際上是:TF * IDF。
(1)詞頻(Term Frequency,TF)指的是某一個給定的詞語在該文件中出現(xiàn)的頻率。即詞w在文檔d中出現(xiàn)的次數(shù)count(w, d)和文檔d中總詞數(shù)size(d)的比值。
這個數(shù)字是對詞數(shù) (term count) 的歸一化,以防止它偏向長的文件。(同一個詞語在長文件里可能會比短文件有更高的詞數(shù),而不管該詞語重要與否。)
(2)逆向文件頻率(Inverse Document Frequency,IDF)是一個詞語普遍重要性的度量。某一特定詞語的IDF,可以由總文件數(shù)目除以包含該詞語之文件的數(shù)目,再將得到的商取對數(shù)得到。即文檔總數(shù)n與詞w所出現(xiàn)文件數(shù)docs(w, D)比值的對數(shù)。
某一特定文件內(nèi)的高詞語頻率,以及該詞語在整個文件集合中的低文件頻率,可以產(chǎn)生出高權(quán)重的TF-IDF。因此,TF-IDF傾向于過濾掉常見的詞語,保留重要的詞語。
4.用sklearn進(jìn)行TF-IDF預(yù)處理
#提取文本特征 vectorizer = CountVectorizer() X_train_termcounts = vectorizer.fit_transform(X_train.astype('U'))tfidf_transformer = TfidfTransformer() X_train_tfidf = tfidf_transformer.fit_transform(X_train_termcounts)參考文檔:
https://blog.csdn.net/m0_37324740/article/details/79411651
https://ljalphabeta.gitbooks.io/python-/content/kfold.html
總結(jié)
以上是生活随笔為你收集整理的分隔百度百科中的名人信息与非名人信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: StratifiedKFold()与KF
- 下一篇: 知识点讲解一:代理ip中的proxies