本身也是剛剛入門。。python
沒臉把本身的代碼放上去,先用別人的。正則表達式
加上本身的解析,挺全面的,但願有用。app
import re import pandas as pd import numpy as np from sklearn.metrics import roc_auc_score from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB as MNB #樸素貝葉斯公式 from sklearn.model_selection import cross_val_score def proces(review): #把review轉成詞序列 review_text=re.sub("[^a-zA-Z]"," ",review) #非大小寫字母的字符替換成空格 #re.sub是正則表達式的函數,實現比普通字符串更強大的替換功能 #print(review_text) words=review_text.lower().split() #全轉換爲小寫後,根據空格分割單詞 #print(words) return words train=pd.read_csv('train.csv',lineterminator='\n') #使用pandas的read讀取文件,以換行符號爲止爲一段數據 ''' 官方文件: pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, doublequote=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None) https://blog.csdn.net/sinat_35562946/article/details/81058221 這個博客講的還行 ''' print(train.head(5)) x=train['review'] #print(x) y=train['label'] #print(y) ''' x與y分離train中的記錄和標籤 ''' class_mapping = {'Negative': 0, 'Positive': 1} y=y.map(class_mapping) #把label中的Negative,Positive轉換成0,1標籤 test=pd.read_csv('test.csv', lineterminator='\n') z=test['review'] w=test['label'] ''' x與y分離test中的記錄和標籤 ''' w=w.map(class_mapping) train_data=[] for i in range(len(x)): train_data.append(' '.join(proces(x[i]))) #用空格將train.data的list裏的words串聯在一塊兒 pass test_data=[] for i in range(len(z)): test_data.append(' '.join(proces(z[i]))) #用空格將test_data的list裏的words串聯在一塊兒 pass data_all=train_data+test_data #全部詞合併成大表data #print(data_all) #TF-IDF傾向於過濾掉常見的詞語,保留重要的詞語。 count_vec = TfidfVectorizer(min_df=2, #嚴格忽略低於給出閾值的文檔頻率的詞條,語料指定的停用詞。 analyzer='word', #定義特徵爲詞(word) ngram_range=(1, 3), #ngram_range(min,max)是指將text分紅min,min+1,min+2,.........max 個不一樣的詞組 use_idf=1, #使用idf從新計算權重 smooth_idf=1, #分母加一 sublinear_tf=1, #線性縮放TF stop_words='english' #忽略英文停用詞 ) ''' min_df:float in range [0.0, 1.0] or int, optional, 1.0 by default 當構建詞彙表時,嚴格忽略低於給出閾值的文檔頻率的詞條,語料指定的停用詞。 若是是浮點值,該參數表明文檔的比例,整型絕對計數值,若是詞彙表不爲None,此參數被忽略。 analyzer:string,{‘word’, ‘char’} or callable 定義特徵爲詞(word)或n-gram字符,若是傳遞給它的調用被用於抽取未處理輸入源文件的特徵序列 ngram_range: tuple(min_n, max_n) 要提取的n-gram的n-values的下限和上限範圍,在min_n <= n <= max_n區間的n的所有值 中ngram_range(min,max)是指將text分紅min,min+1,min+2,.........max 個不一樣的詞組 好比'Python is useful'中ngram_range(1,3)以後可獲得: 'Python' 'is' 'useful' 'Python is' 'is useful' 和'Python is useful'若是是ngram_range (1,1) 則只能獲得單個單詞'Python' 'is'和'useful' use_idf:boolean, optional 啓動inverse-document-frequency從新計算權重 smooth_idf:boolean,optional 經過加1到文檔頻率(底數)平滑idf權重,爲防止除零 <-> 加入一個額外的文檔 sublinear_tf:boolean, optional 應用線性縮放TF,例如,使用1+log(tf)覆蓋tf。注意,python中log默認取天然對數! ''' lenth=len(train_data) count_vec.fit(data_all) data_all=count_vec.transform(data_all) train_data=data_all[:lenth] test_data=data_all[lenth:] #訓練樸素貝葉斯分類器 model=MNB() model.fit(train_data,y) pred=model.predict(test_data) MNB(alpha=1.0, class_prior=None, fit_prior=True) #print("roc_auc",roc_auc_score(w, pred)) MX = 0; for i in range(5, 10): MX = max(MX, np.mean(cross_val_score(model, train_data, y, cv=i, scoring='roc_auc'))) #2分類模型 print("多項式貝葉斯分類器10折交叉驗證得分: ", MX) ''' 不一樣的訓練集、測試集分割的方法致使其準確率不一樣. 而交叉驗證的基本思想是:將數據集進行一系列分割,生成一組不一樣的訓練測試集,而後分別訓練模型並計算測試準確率, 最後對結果進行平均處理。這樣來有效下降測試準確率的差別。 '''