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