Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
言
文本分類是商業問題中常見的自然語言處理任務,目標是自動將文本文件分到一個或多個已定義好的類別中。文本分類的一些例子如下:
目錄
本文將詳細介紹文本分類問題并用Python實現這個過程:
文本分類是有監督學習的一個例子,它使用包含文本文檔和標簽的數據集來訓練一個分類器。端到端的文本分類訓練主要由三個部分組成:
1. 準備數據集:第一步是準備數據集,包括加載數據集和執行基本預處理,然后把數據集分為訓練集和驗證集。
特征工程:第二步是特征工程,將原始數據集被轉換為用于訓練機器學習模型的平坦特征(flat features),并從現有數據特征創建新的特征。
2. 模型訓練:最后一步是建模,利用標注數據集訓練機器學習模型。
3. 進一步提高分類器性能:本文還將討論用不同的方法來提高文本分類器的性能。
注意:本文不深入講述NLP任務,如果你想先復習下基礎知識,可以通過這篇文章
https://www.analyticsvidhya.com/blog/2017/01/ultimate-guide-to-understand-implement-natural-language-processing-codes-in-python/
準備好你的機器
先安裝基本組件,創建Python的文本分類框架。首先導入所有所需的庫。如果你沒有安裝這些庫,可以通過以下官方鏈接來安裝它們。
#導入數據集預處理、特征工程和模型訓練所需的庫
from sklearn import model_selection, preprocessing, linear_model, naive_bayes, metrics, svm
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn import decomposition, ensemble
import pandas, xgboost, numpy, textblob, string
from keras.preprocessing import text, sequence
from keras import layers, models, optimizers
一、準備數據集
在本文中,我使用亞馬遜的評論數據集,它可以從這個鏈接下載:
https://gist.github.com/kunalj101/ad1d9c58d338e20d09ff26bcc06c4235
這個數據集包含3.6M的文本評論內容及其標簽,我們只使用其中一小部分數據。首先,將下載的數據加載到包含兩個列(文本和標簽)的pandas的數據結構(dataframe)中。
數據集鏈接:
https://drive.google.com/drive/folders/0Bz8a_Dbh9Qhbfll6bVpmNUtUcFdjYmF2SEpmZUZUcVNiMUw1TWN6RDV3a0JHT3kxLVhVR2M
#加載數據集
data = open('data/corpus').read()
labels, texts = [], []
for i, line in enumerate(data.split("\n")):
content = line.split()
labels.append(content[0])
texts.append(content[1])
#創建一個dataframe,列名為text和label
trainDF = pandas.DataFrame()
trainDF['text'] = texts
trainDF['label'] = labels
接下來,我們將數據集分為訓練集和驗證集,這樣我們可以訓練和測試分類器。另外,我們將編碼我們的目標列,以便它可以在機器學習模型中使用:
#將數據集分為訓練集和驗證集
train_x, valid_x, train_y, valid_y = model_selection.train_test_split(trainDF['text'], trainDF['label'])
# label編碼為目標變量
encoder = preprocessing.LabelEncoder()
train_y = encoder.fit_transform(train_y)
valid_y = encoder.fit_transform(valid_y)
二、特征工程
接下來是特征工程,在這一步,原始數據將被轉換為特征向量,另外也會根據現有的數據創建新的特征。為了從數據集中選出重要的特征,有以下幾種方式:
接下來分別看看它們如何實現:
2.1 計數向量作為特征
計數向量是數據集的矩陣表示,其中每行代表來自語料庫的文檔,每列表示來自語料庫的術語,并且每個單元格表示特定文檔中特定術語的頻率計數:
#創建一個向量計數器對象
count_vect = CountVectorizer(analyzer='word', token_pattern=r'\w{1,}')
count_vect.fit(trainDF['text'])
#使用向量計數器對象轉換訓練集和驗證集
xtrain_count = count_vect.transform(train_x)
xvalid_count = count_vect.transform(valid_x)
2.2 TF-IDF向量作為特征
TF-IDF的分數代表了詞語在文檔和整個語料庫中的相對重要性。TF-IDF分數由兩部分組成:第一部分是計算標準的詞語頻率(TF),第二部分是逆文檔頻率(IDF)。其中計算語料庫中文檔總數除以含有該詞語的文檔數量,然后再取對數就是逆文檔頻率。
TF(t)=(該詞語在文檔出現的次數)/(文檔中詞語的總數)
IDF(t)= log_e(文檔總數/出現該詞語的文檔總數)
TF-IDF向量可以由不同級別的分詞產生(單個詞語,詞性,多個詞(n-grams))
#詞語級tf-idf
tfidf_vect = TfidfVectorizer(analyzer='word', token_pattern=r'\w{1,}', max_features=5000)
tfidf_vect.fit(trainDF['text'])
xtrain_tfidf = tfidf_vect.transform(train_x)
xvalid_tfidf = tfidf_vect.transform(valid_x)
# ngram 級tf-idf
tfidf_vect_ngram = TfidfVectorizer(analyzer='word', token_pattern=r'\w{1,}', ngram_range=(2,3), max_features=5000)
tfidf_vect_ngram.fit(trainDF['text'])
xtrain_tfidf_ngram = tfidf_vect_ngram.transform(train_x)
xvalid_tfidf_ngram = tfidf_vect_ngram.transform(valid_x)
#詞性級tf-idf
tfidf_vect_ngram_chars = TfidfVectorizer(analyzer='char', token_pattern=r'\w{1,}', ngram_range=(2,3), max_features=5000)
tfidf_vect_ngram_chars.fit(trainDF['text'])
xtrain_tfidf_ngram_chars = tfidf_vect_ngram_chars.transform(train_x)
xvalid_tfidf_ngram_chars = tfidf_vect_ngram_chars.transform(valid_x)
2.3 詞嵌入
詞嵌入是使用稠密向量代表詞語和文檔的一種形式。向量空間中單詞的位置是從該單詞在文本中的上下文學習到的,詞嵌入可以使用輸入語料本身訓練,也可以使用預先訓練好的詞嵌入模型生成,詞嵌入模型有:Glove, FastText,Word2Vec。它們都可以下載,并用遷移學習的方式使用。想了解更多的詞嵌入資料,可以訪問:
https://www.analyticsvidhya.com/blog/2017/06/word-embeddings-count-word2veec/
接下來介紹如何在模型中使用預先訓練好的詞嵌入模型,主要有四步:
1. 加載預先訓練好的詞嵌入模型
2. 創建一個分詞對象
3. 將文本文檔轉換為分詞序列并填充它們
4. 創建分詞和各自嵌入的映射
#加載預先訓練好的詞嵌入向量
embeddings_index = {}
for i, line in enumerate(open('data/wiki-news-300d-1M.vec')):
values = line.split()
embeddings_index[values[0]] = numpy.asarray(values[1:], dtype='float32')
#創建一個分詞器
token = text.Tokenizer()
token.fit_on_texts(trainDF['text'])
word_index = token.word_index
#將文本轉換為分詞序列,并填充它們保證得到相同長度的向量
train_seq_x = sequence.pad_sequences(token.texts_to_sequences(train_x), maxlen=70)
valid_seq_x = sequence.pad_sequences(token.texts_to_sequences(valid_x), maxlen=70)
#創建分詞嵌入映射
embedding_matrix = numpy.zeros((len(word_index) + 1, 300))
for word, i in word_index.items():
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
embedding_matrix[i] = embedding_vector
2.4 基于文本/NLP的特征
創建許多額外基于文本的特征有時可以提升模型效果。比如下面的例子:
這些特征有很強的實驗性質,應該具體問題具體分析。
trainDF['char_count'] = trainDF['text'].apply(len)
trainDF['word_count'] = trainDF['text'].apply(lambda x: len(x.split()))
trainDF['word_density'] = trainDF['char_count'] / (trainDF['word_count']+1)
trainDF['punctuation_count'] = trainDF['text'].apply(lambda x: len("".join(_ for _ in x if _ in string.punctuation)))
trainDF['title_word_count'] = trainDF['text'].apply(lambda x: len([wrd for wrd in x.split() if wrd.istitle()]))
trainDF['upper_case_word_count'] = trainDF['text'].apply(lambda x: len([wrd for wrd in x.split() if wrd.isupper()]))
trainDF['char_count'] = trainDF['text'].apply(len)
trainDF['word_count'] = trainDF['text'].apply(lambda x: len(x.split()))
trainDF['word_density'] = trainDF['char_count'] / (trainDF['word_count']+1)
trainDF['punctuation_count'] = trainDF['text'].apply(lambda x: len("".join(_ for _ in x if _ in string.punctuation)))
trainDF['title_word_count'] = trainDF['text'].apply(lambda x: len([wrd for wrd in x.split() if wrd.istitle()]))
trainDF['upper_case_word_count'] = trainDF['text'].apply(lambda x: len([wrd for wrd in x.split() if wrd.isupper()]))
pos_family = {
'noun' : ['NN','NNS','NNP','NNPS'],
'pron' : ['PRP','PRP$','WP','WP$'],
'verb' : ['VB','VBD','VBG','VBN','VBP','VBZ'],
'adj' : ['JJ','JJR','JJS'],
'adv' : ['RB','RBR','RBS','WRB']
}
#檢查和獲得特定句子中的單詞的詞性標簽數量
def check_pos_tag(x, flag):
cnt = 0
try:
wiki = textblob.TextBlob(x)
for tup in wiki.tags:
ppo = list(tup)[1]
if ppo in pos_family[flag]:
cnt += 1
except:
pass
return cnt
trainDF['noun_count'] = trainDF['text'].apply(lambda x: check_pos_tag(x, 'noun'))
trainDF['verb_count'] = trainDF['text'].apply(lambda x: check_pos_tag(x, 'verb'))
trainDF['adj_count'] = trainDF['text'].apply(lambda x: check_pos_tag(x, 'adj'))
trainDF['adv_count'] = trainDF['text'].apply(lambda x: check_pos_tag(x, 'adv'))
trainDF['pron_count'] = trainDF['text'].apply(lambda x: check_pos_tag(x, 'pron'))
2.5 主題模型作為特征
主題模型是從包含重要信息的文檔集中識別詞組(主題)的技術,我已經使用LDA生成主題模型特征。LDA是一個從固定數量的主題開始的迭代模型,每一個主題代表了詞語的分布,每一個文檔表示了主題的分布。雖然分詞本身沒有意義,但是由主題表達出的詞語的概率分布可以傳達文檔思想。如果想了解更多主題模型,請訪問:
https://www.analyticsvidhya.com/blog/2016/08/beginners-guide-to-topic-modeling-in-python/
我們看看主題模型運行過程:
#訓練主題模型
lda_model = decomposition.LatentDirichletAllocation(n_components=20, learning_method='online', max_iter=20)
X_topics = lda_model.fit_transform(xtrain_count)
topic_word = lda_model.components_
vocab = count_vect.get_feature_names()
#可視化主題模型
n_top_words = 10
topic_summaries = []
for i, topic_dist in enumerate(topic_word):
topic_words = numpy.array(vocab)[numpy.argsort(topic_dist)][:-(n_top_words+1):-1]
topic_summaries.append(' '.join(topic_words)
三、建模
文本分類框架的最后一步是利用之前創建的特征訓練一個分類器。關于這個最終的模型,機器學習中有很多模型可供選擇。我們將使用下面不同的分類器來做文本分類:
接下來我們詳細介紹并使用這些模型。下面的函數是訓練模型的通用函數,它的輸入是分類器、訓練數據的特征向量、訓練數據的標簽,驗證數據的特征向量。我們使用這些輸入訓練一個模型,并計算準確度。
def train_model(classifier, feature_vector_train, label, feature_vector_valid, is_neural_net=False):
# fit the training dataset on the classifier
classifier.fit(feature_vector_train, label)
# predict the labels on validation dataset
predictions = classifier.predict(feature_vector_valid)
if is_neural_net:
predictions = predictions.argmax(axis=-1)
return metrics.accuracy_score(predictions, valid_y)
3.1 樸素貝葉斯
利用sklearn框架,在不同的特征下實現樸素貝葉斯模型。
樸素貝葉斯是一種基于貝葉斯定理的分類技術,并且假設預測變量是獨立的。樸素貝葉斯分類器假設一個類別中的特定特征與其它存在的特征沒有任何關系。
想了解樸素貝葉斯算法細節可點擊:
A Naive Bayes classifier assumes that the presence of a particular feature in a class is unrelated to the presence of any other feature
#特征為計數向量的樸素貝葉斯
accuracy = train_model(naive_bayes.MultinomialNB(), xtrain_count, train_y, xvalid_count)
print "NB, Count Vectors: ", accuracy
#特征為詞語級別TF-IDF向量的樸素貝葉斯
accuracy = train_model(naive_bayes.MultinomialNB(), xtrain_tfidf, train_y, xvalid_tfidf)
print "NB, WordLevel TF-IDF: ", accuracy
#特征為多個詞語級別TF-IDF向量的樸素貝葉斯
accuracy = train_model(naive_bayes.MultinomialNB(), xtrain_tfidf_ngram, train_y, xvalid_tfidf_ngram)
print "NB, N-Gram Vectors: ", accuracy
#特征為詞性級別TF-IDF向量的樸素貝葉斯
accuracy = train_model(naive_bayes.MultinomialNB(), xtrain_tfidf_ngram_chars, train_y, xvalid_tfidf_ngram_chars)
print "NB, CharLevel Vectors: ", accuracy
#輸出結果
NB, Count Vectors: 0.7004
NB, WordLevel TF-IDF: 0.7024
NB, N-Gram Vectors: 0.5344
NB, CharLevel Vectors: 0.6872
3.2 線性分類器
實現一個線性分類器(Logistic Regression):Logistic回歸通過使用logistic / sigmoid函數估計概率來度量類別因變量與一個或多個獨立變量之間的關系。如果想了解更多關于logistic回歸,請訪問:
https://www.analyticsvidhya.com/blog/2015/10/basics-logistic-regression/
# Linear Classifier on Count Vectors
accuracy = train_model(linear_model.LogisticRegression(), xtrain_count, train_y, xvalid_count)
print "LR, Count Vectors: ", accuracy
#特征為詞語級別TF-IDF向量的線性分類器
accuracy = train_model(linear_model.LogisticRegression(), xtrain_tfidf, train_y, xvalid_tfidf)
print "LR, WordLevel TF-IDF: ", accuracy
#特征為多個詞語級別TF-IDF向量的線性分類器
accuracy = train_model(linear_model.LogisticRegression(), xtrain_tfidf_ngram, train_y, xvalid_tfidf_ngram)
print "LR, N-Gram Vectors: ", accuracy
#特征為詞性級別TF-IDF向量的線性分類器
accuracy = train_model(linear_model.LogisticRegression(), xtrain_tfidf_ngram_chars, train_y, xvalid_tfidf_ngram_chars)
print "LR, CharLevel Vectors: ", accuracy
#輸出結果
LR, Count Vectors: 0.7048
LR, WordLevel TF-IDF: 0.7056
LR, N-Gram Vectors: 0.4896
LR, CharLevel Vectors: 0.7012
3.3 實現支持向量機模型
支持向量機(SVM)是監督學習算法的一種,它可以用來做分類或回歸。該模型提取了分離兩個類的最佳超平面或線。如果想了解更多關于SVM,請訪問:
https://www.analyticsvidhya.com/blog/2017/09/understaing-support-vector-machine-example-code/
#特征為多個詞語級別TF-IDF向量的SVM
accuracy = train_model(svm.SVC(), xtrain_tfidf_ngram, train_y, xvalid_tfidf_ngram)
print "SVM, N-Gram Vectors: ", accuracy
#輸出結果
SVM, N-Gram Vectors: 0.5296
3.4 Bagging Model
實現一個隨機森林模型:隨機森林是一種集成模型,更準確地說是Bagging model。它是基于樹模型家族的一部分。如果想了解更多關于隨機森林,請訪問:
https://www.analyticsvidhya.com/blog/2014/06/introduction-random-forest-simplified/
#特征為計數向量的RF
accuracy = train_model(ensemble.RandomForestClassifier(), xtrain_count, train_y, xvalid_count)
print "RF, Count Vectors: ", accuracy
#特征為詞語級別TF-IDF向量的RF
accuracy = train_model(ensemble.RandomForestClassifier(), xtrain_tfidf, train_y, xvalid_tfidf)
print "RF, WordLevel TF-IDF: ", accuracy
#輸出結果
RF, Count Vectors: 0.6972
RF, WordLevel TF-IDF: 0.6988
3.5 Boosting Model
實現一個Xgboost模型:Boosting model是另外一種基于樹的集成模型。Boosting是一種機器學習集成元算法,主要用于減少模型的偏差,它是一組機器學習算法,可以把弱學習器提升為強學習器。其中弱學習器指的是與真實類別只有輕微相關的分類器(比隨機猜測要好一點)。如果想了解更多,請訪問:
https://www.analyticsvidhya.com/blog/2016/01/xgboost-algorithm-easy-steps/
#特征為計數向量的Xgboost
accuracy = train_model(xgboost.XGBClassifier(), xtrain_count.tocsc(), train_y, xvalid_count.tocsc())
print "Xgb, Count Vectors: ", accuracy
#特征為詞語級別TF-IDF向量的Xgboost
accuracy = train_model(xgboost.XGBClassifier(), xtrain_tfidf.tocsc(), train_y, xvalid_tfidf.tocsc())
print "Xgb, WordLevel TF-IDF: ", accuracy
#特征為詞性級別TF-IDF向量的Xgboost
accuracy = train_model(xgboost.XGBClassifier(), xtrain_tfidf_ngram_chars.tocsc(), train_y, xvalid_tfidf_ngram_chars.tocsc())
print "Xgb, CharLevel Vectors: ", accuracy
#輸出結果
Xgb, Count Vectors: 0.6324
Xgb, WordLevel TF-IDF: 0.6364
Xgb, CharLevel Vectors: 0.6548
3.6 淺層神經網絡
神經網絡被設計成與生物神經元和神經系統類似的數學模型,這些模型用于發現被標注數據中存在的復雜模式和關系。一個淺層神經網絡主要包含三層神經元-輸入層、隱藏層、輸出層。如果想了解更多關于淺層神經網絡,請訪問:
https://www.analyticsvidhya.com/blog/2017/05/neural-network-from-scratch-in-python-and-r/
def create_model_architecture(input_size):
# create input layer
input_layer = layers.Input((input_size, ), sparse=True)
# create hidden layer
hidden_layer = layers.Dense(100, activation="relu")(input_layer)
# create output layer
output_layer = layers.Dense(1, activation="sigmoid")(hidden_layer)
classifier = models.Model(inputs = input_layer, outputs = output_layer)
classifier.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy')
return classifier
classifier = create_model_architecture(xtrain_tfidf_ngram.shape[1])
accuracy = train_model(classifier, xtrain_tfidf_ngram, train_y, xvalid_tfidf_ngram, is_neural_net=True)
print "NN, Ngram Level TF IDF Vectors", accuracy
#輸出結果:
Epoch 1/1
7500/7500 [==============================] - 1s 67us/step - loss: 0.6909
NN, Ngram Level TF IDF Vectors 0.5296
3.7 深層神經網絡
深層神經網絡是更復雜的神經網絡,其中隱藏層執行比簡單Sigmoid或Relu激活函數更復雜的操作。不同類型的深層學習模型都可以應用于文本分類問題。
卷積神經網絡中,輸入層上的卷積用來計算輸出。本地連接結果中,每一個輸入單元都會連接到輸出神經元上。每一層網絡都應用不同的濾波器(filter)并組合它們的結果。
如果想了解更多關于卷積神經網絡,請訪問:
https://www.analyticsvidhya.com/blog/2017/06/architecture-of-convolutional-neural-networks-simplified-demystified/
def create_cnn():
# Add an Input Layer
input_layer = layers.Input((70, ))
# Add the word embedding Layer
embedding_layer = layers.Embedding(len(word_index) + 1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
embedding_layer = layers.SpatialDropout1D(0.3)(embedding_layer)
# Add the convolutional Layer
conv_layer = layers.Convolution1D(100, 3, activation="relu")(embedding_layer)
# Add the pooling Layer
pooling_layer = layers.GlobalMaxPool1D()(conv_layer)
# Add the output Layers
output_layer1 = layers.Dense(50, activation="relu")(pooling_layer)
output_layer1 = layers.Dropout(0.25)(output_layer1)
output_layer2 = layers.Dense(1, activation="sigmoid")(output_layer1)
# Compile the model
model = models.Model(inputs=input_layer, outputs=output_layer2)
model.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy')
return model
classifier = create_cnn()
accuracy = train_model(classifier, train_seq_x, train_y, valid_seq_x, is_neural_net=True)
print "CNN, Word Embeddings", accuracy
#輸出結果
Epoch 1/1
7500/7500 [==============================] - 12s 2ms/step - loss: 0.5847
CNN, Word Embeddings 0.5296
與前饋神經網絡不同,前饋神經網絡的激活輸出僅在一個方向上傳播,而循環神經網絡的激活輸出在兩個方向傳播(從輸入到輸出,從輸出到輸入)。因此在神經網絡架構中產生循環,充當神經元的“記憶狀態”,這種狀態使神經元能夠記住迄今為止學到的東西。RNN中的記憶狀態優于傳統的神經網絡,但是被稱為梯度彌散的問題也因這種架構而產生。這個問題導致當網絡有很多層的時候,很難學習和調整前面網絡層的參數。為了解決這個問題,開發了稱為LSTM(Long Short Term Memory)模型的新型RNN:
如果想了解更多關于LSTM,請訪問:
https://www.analyticsvidhya.com/blog/2017/12/fundamentals-of-deep-learning-introduction-to-lstm/
def create_rnn_lstm():
# Add an Input Layer
input_layer = layers.Input((70, ))
# Add the word embedding Layer
embedding_layer = layers.Embedding(len(word_index) + 1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
embedding_layer = layers.SpatialDropout1D(0.3)(embedding_layer)
# Add the LSTM Layer
lstm_layer = layers.LSTM(100)(embedding_layer)
# Add the output Layers
output_layer1 = layers.Dense(50, activation="relu")(lstm_layer)
output_layer1 = layers.Dropout(0.25)(output_layer1)
output_layer2 = layers.Dense(1, activation="sigmoid")(output_layer1)
# Compile the model
model = models.Model(inputs=input_layer, outputs=output_layer2)
model.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy')
return model
classifier = create_rnn_lstm()
accuracy = train_model(classifier, train_seq_x, train_y, valid_seq_x, is_neural_net=True)
print "RNN-LSTM, Word Embeddings", accuracy
#輸出結果
Epoch 1/1
7500/7500 [==============================] - 22s 3ms/step - loss: 0.6899
RNN-LSTM, Word Embeddings 0.5124
門控遞歸單元是另一種形式的遞歸神經網絡,我們在網絡中添加一個GRU層來代替LSTM。
defcreate_rnn_gru():
# Add an Input Layer
input_layer = layers.Input((70, ))
# Add the word embedding Layer
embedding_layer = layers.Embedding(len(word_index) + 1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
embedding_layer = layers.SpatialDropout1D(0.3)(embedding_layer)
# Add the GRU Layer
lstm_layer = layers.GRU(100)(embedding_layer)
# Add the output Layers
output_layer1 = layers.Dense(50, activation="relu")(lstm_layer)
output_layer1 = layers.Dropout(0.25)(output_layer1)
output_layer2 = layers.Dense(1, activation="sigmoid")(output_layer1)
# Compile the model
model = models.Model(inputs=input_layer, outputs=output_layer2)
model.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy')
return model
classifier = create_rnn_gru()
accuracy = train_model(classifier, train_seq_x, train_y, valid_seq_x, is_neural_net=True)
print "RNN-GRU, Word Embeddings", accuracy
#輸出結果
Epoch 1/1
7500/7500 [==============================] - 19s 3ms/step - loss: 0.6898
RNN-GRU, Word Embeddings 0.5124
RNN層也可以被封裝在雙向層中,我們把GRU層封裝在雙向RNN網絡中。
defcreate_bidirectional_rnn():
# Add an Input Layer
input_layer = layers.Input((70, ))
# Add the word embedding Layer
embedding_layer = layers.Embedding(len(word_index) + 1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
embedding_layer = layers.SpatialDropout1D(0.3)(embedding_layer)
# Add the LSTM Layer
lstm_layer = layers.Bidirectional(layers.GRU(100))(embedding_layer)
# Add the output Layers
output_layer1 = layers.Dense(50, activation="relu")(lstm_layer)
output_layer1 = layers.Dropout(0.25)(output_layer1)
output_layer2 = layers.Dense(1, activation="sigmoid")(output_layer1)
# Compile the model
model = models.Model(inputs=input_layer, outputs=output_layer2)
model.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy')
return model
classifier = create_bidirectional_rnn()
accuracy = train_model(classifier, train_seq_x, train_y, valid_seq_x, is_neural_net=True)
print "RNN-Bidirectional, Word Embeddings", accuracy
#輸出結果
Epoch 1/1
7500/7500 [==============================] - 32s 4ms/step - loss: 0.6889
RNN-Bidirectional, Word Embeddings 0.5124
如果基本的架構已經嘗試過,則可以嘗試這些層的不同變體,如遞歸卷積神經網絡,還有其它變體,比如:
defcreate_rcnn():
# Add an Input Layer
input_layer = layers.Input((70, ))
# Add the word embedding Layer
embedding_layer = layers.Embedding(len(word_index) + 1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
embedding_layer = layers.SpatialDropout1D(0.3)(embedding_layer)
# Add the recurrent layer
rnn_layer = layers.Bidirectional(layers.GRU(50, return_sequences=True))(embedding_layer)
# Add the convolutional Layer
conv_layer = layers.Convolution1D(100, 3, activation="relu")(embedding_layer)
# Add the pooling Layer
pooling_layer = layers.GlobalMaxPool1D()(conv_layer)
# Add the output Layers
output_layer1 = layers.Dense(50, activation="relu")(pooling_layer)
output_layer1 = layers.Dropout(0.25)(output_layer1)
output_layer2 = layers.Dense(1, activation="sigmoid")(output_layer1)
# Compile the model
model = models.Model(inputs=input_layer, outputs=output_layer2)
model.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy')
return model
classifier = create_rcnn()
accuracy = train_model(classifier, train_seq_x, train_y, valid_seq_x, is_neural_net=True)
print "CNN, Word Embeddings", accuracy
#輸出結果
Epoch 1/1
7500/7500 [==============================] - 11s 1ms/step - loss: 0.6902
CNN, Word Embeddings 0.5124
進一步提高文本分類模型的性能
雖然上述框架可以應用于多個文本分類問題,但是為了達到更高的準確率,可以在總體框架中進行一些改進。例如,下面是一些改進文本分類模型和該框架性能的技巧:
1. 清洗文本:文本清洗有助于減少文本數據中出現的噪聲,包括停用詞、標點符號、后綴變化等。這篇文章有助于理解如何實現文本分類:
https://www.analyticsvidhya.com/blog/2014/11/text-data-cleaning-steps-python/
2. 組合文本特征向量的文本/NLP特征:特征工程階段,我們把生成的文本特征向量組合在一起,可能會提高文本分類器的準確率。
模型中的超參數調優:參數調優是很重要的一步,很多參數通過合適的調優可以獲得最佳擬合模型,例如樹的深層、葉子節點數、網絡參數等。
3. 集成模型:堆疊不同的模型并混合它們的輸出有助于進一步改進結果。如果想了解更多關于模型集成,請訪問:
https://www.analyticsvidhya.com/blog/2015/08/introduction-ensemble-learning/
寫在最后
本文討論了如何準備一個文本數據集,如清洗、創建訓練集和驗證集。使用不同種類的特征工程,比如計數向量、TF-IDF、詞嵌入、主題模型和基本的文本特征。然后訓練了多種分類器,有樸素貝葉斯、Logistic回歸、SVM、MLP、LSTM和GRU。最后討論了提高文本分類器性能的多種方法。
、算法設計
Python 的數據結構,算法和設計模式的實現。另請參閱真棒算法。
演算法
algorithms 數據結構和算法的最小示例。
https://github.com/keon/algorithms
python-ds 用于采訪采訪的數據結構和算法的集合。
https://github.com/prabhupant/python-ds
sortedcontainers 排序集合的快速和純 Python 實現。
https://github.com/grantjenks/python-sortedcontainers
TheAlgorithms- 用 Python 實現的所有算法。
https://github.com/TheAlgorithms/Python
設計模式
PyPattyrn- 一個簡單但有效的庫,用于實現常見的設計模式。
https://github.com/tylerlaberge/PyPattyrn
python-patterns -Python 中設計模式的集合。
https://github.com/faif/python-patterns
transitions - 一種輕量級的,面向對象的有限狀態機實現。
https://github.com/pytransitions/transitions
二、聲音、視頻、圖像、文字處理
用于處理音頻及其元數據的庫。
聲音的
audioread- 跨庫(GStreamer + 核心音頻 + MAD + FFmpeg)音頻解碼。
https://github.com/beetbox/audioread
dejavu- 音頻指紋識別。
https://github.com/worldveil/dejavu
kapre - Keras 音頻預處理器
https://github.com/keunwoochoi/kapre
librosa- 用于音頻和音樂分析的 Python 庫
https://github.com/librosa/librosa
matchering - 一個用于自動參考音頻制作的庫。
https://github.com/sergree/matchering
mingus- 帶有 MIDI 文件和播放支持的高級音樂理論和樂譜包。
http://bspaans.github.io/python-mingus/
pyAudioAnalysis- 音頻特征提取,分類,分段和應用。
https://github.com/tyiannak/pyAudioAnalysis
pydub- 使用簡單易用的高級界面處理音頻。
https://github.com/jiaaro/pydub
TimeSide- 開放的 Web 音頻處理框架。
https://github.com/Parisson/TimeSide
Metadata
beets- 音樂庫管理器和 MusicBrainz 標記器。
https://github.com/beetbox/beets
eyeD3- 一種用于處理音頻文件的工具,特別是包含 ID3 元數據的 MP3 文件。
https://github.com/nicfit/eyeD3
mutagen- 處理音頻元數據的 Python 模塊。
https://github.com/quodlibet/mutagen
tinytag- 用于讀取 MP3,OGG,FLAC 和 Wave 文件的音樂元數據的庫。
https://github.com/devsnd/tinytag
用于處理視頻和 GIF 的庫。
moviepy- 用于基于腳本的電影編輯的模塊,具有多種格式,包括動畫 GIF。
https://zulko.github.io/moviepy/
scikit-video -SciPy 的視頻處理例程。
https://github.com/aizvorski/scikit-video
vidgear- 最強大的多線程視頻處理框架。
https://github.com/abhiTronix/vidgear
用于處理圖像的庫。
hmap- 圖像直方圖重新映射。
https://github.com/rossgoodwin/hmap
imgSeek- 使用視覺相似性搜索圖像集合的項目。
https://sourceforge.net/projects/imgseek/
nude.py- 裸露檢測。
https://github.com/hhatto/nude.py
pagan - 復古 identicon(阿凡達)根據輸入的字符串和哈希生成。
https://github.com/daboth/pagan
pillow- 枕頭是友好的 PIL 叉。
https://github.com/python-pillow/Pillow
python- barcode - 在 Python 中創建條形碼,沒有任何額外的依賴關系。
https://github.com/WhyNotHugo/python-barcode
pygram- 類似 Instagram 的圖像過濾器。
https://github.com/ajkumar25/pygram
PyMatting -Alpha 遮罩的庫。
http://github.com/pymatting/pymatting
python-qrcode- 一個純 Python QR Code 生成器。
https://github.com/lincolnloop/python-qrcode
pywal- 一種從圖像生成配色方案的工具。
https://github.com/dylanaraps/pywal
pyvips- 具有低內存需求的快速圖像處理庫。
https://github.com/libvips/pyvips
Quads - 基于四叉樹的計算機藝術。
https://github.com/fogleman/Quads
scikit-image- 用于(科學)圖像處理的 Python 庫。
http://scikit-image.org/
thumbor- 智能影像服務。它可以按需裁剪,調整圖像大小和翻轉圖像。
https://github.com/thumbor/thumbor
wand - MagickWand 的 Python 綁定,ImageMagick 的 C API。
https://github.com/dahlia/wand
用于解析和處理純文本的庫。
一般的
chardet- 與 Python 2/3 兼容的字符編碼檢測器。
https://github.com/chardet/chardet
difflib-(Python 標準庫)用于計算增量的幫助程序。
https://docs.python.org/3/library/difflib.html
ftfy- 自動使 Unicode 文本更清晰,更一致。
https://github.com/LuminosoInsight/python-ftfy
Fuzzywuzzy- 模糊字符串匹配。
https://github.com/seatgeek/fuzzywuzzy
Levenshtein- 快速計算 Levenshtein 距離和字符串相似度。
https://github.com/ztane/python-Levenshtein/
pangu.py- 偏執的文字間距。
https://github.com/vinta/pangu.py
pyfiglet- 用 Python 編寫的 figlet 的實現。
https://github.com/pwaller/pyfiglet
pypinyin- 將漢字(Hanzi)轉換為拼音(Pyyin)。
https://github.com/mozillazg/python-pinyin
textdistance- 使用 30 多種算法計算序列之間的距離。
https://github.com/orsinium/textdistance
unidecode -Unicode 文本的 ASCII 音譯。
https://pypi.org/project/Unidecode/
Slugify
awesome-slugify- 一個可以保留 unicode 的 Python slugify 庫。
https://github.com/dimka665/awesome-slugify
python-slugify- 一個 Python slugify 庫,它將 unicode 轉換為 ASCII。
https://github.com/un33k/python-slugify
unicode-slugify- 一種 Slugifier,它以 Django 為依賴項生成 unicode slug。
https://github.com/mozilla/unicode-slugify
唯一標識符
hashids- 在 Python 中實現 hashids。
https://github.com/davidaurelio/hashids-python
shortuuid- 簡潔,明確和 URL 安全的 UUID 的生成器庫。
https://github.com/skorokithakis/shortuuid
解析器
ply - 的 lex 和 yacc 解析工具的 Python 實現。
https://github.com/dabeaz/ply
pygments- 通用語法熒光筆。
http://pygments.org/
pyparsing- 生成解析器的通用框架。
https://github.com/pyparsing/pyparsing
python-nameparser - 將人名解析為它們的各個組成部分。
https://github.com/derek73/python-nameparser
python-phonenumbers- 解析,格式化,存儲和驗證國際電話號碼。
https://github.com/daviddrysdale/python-phonenumbers
python-user-agents- 瀏覽器用戶代理解析器。
https://github.com/selwin/python-user-agents
sqlparse- 一個非驗證的 SQL 解析器。
https://github.com/andialbrecht/sqlparse
三、日期和時間
用于處理日期和時間的庫。
Arrow- 一個 Python 庫,提供了一種明智且人性化的方法來創建,操作,格式化和轉換日期,時間和時間戳。
https://arrow.readthedocs.io/en/latest/
Chronyk- 一個 Python 3 庫,用于解析人類編寫的時間和日期。
https://github.com/KoffeinFlummi/Chronyk
dateutil- 標準 Python datetime 模塊的擴展。
https://github.com/dateutil/dateutil
delorean- 一個庫,用于清除與日期時間有關的不便的事實。
https://github.com/myusuf3/delorean/
maya- 人類的日期時間。
https://github.com/timofurrer/maya
moment - 一個 Python 庫用于處理日期 / 時間。受到 Moment.js 的啟發。
https://github.com/zachwill/moment
Pendulum-Python 日期時間變得容易。
https://github.com/sdispater/pendulum
PyTime- 一個易于使用的 Python 模塊,旨在按字符串操作日期 / 時間 / 日期時間。
https://github.com/shinux/PyTime
pytz- 世界時區定義,現代和歷史。將 tz 數據庫帶入 Python。
https://launchpad.net/pytz
when.py- 提供用戶友好的功能來幫助執行常見的日期和時間操作。
https://github.com/dirn/When.py
四、爬蟲
自動執行 Web 抓取。
cola- 分布式抓取框架。
https://github.com/chineking/cola
feedparser- 通用供稿解析器。
https://pythonhosted.org/feedparser/
grab - 網站抓取框架。
https://github.com/lorien/grab
MechanicalSoup- 用于自動與網站進行交互的 Python 庫。
https://github.com/MechanicalSoup/MechanicalSoup
portia - Scrapy 的視覺抓取。
https://github.com/scrapinghub/portia
pyspider- 強大的蜘蛛系統。
https://github.com/binux/pyspider
robobrowser- 一個簡單的 Pythonic 庫,無需獨立的 Web 瀏覽器即可瀏覽 Web。
https://github.com/jmcarp/robobrowser
scrapy- 快速的高級屏幕抓取和網絡爬網框架。
https://scrapy.org/
用于提取 Web 內容的庫。
html2text- 將 HTML 轉換為 Markdown 格式的文本。
https://github.com/Alir3z4/html2text
lassie- 人類的 Web 內容檢索。
https://github.com/michaelhelmick/lassie
micawber- 一個小型庫,用于從 URL 中提取豐富的內容。
https://github.com/coleifer/micawber
newspaper -Python 中的新聞提取,文章提取和內容管理。
https://github.com/codelucas/newspaper
python- readability - arc90 的可讀性工具的快速 Python 端口。
https://github.com/buriy/python-readability
requests-html –適用于人類的 Pythonic HTML 解析。
https://github.com/psf/requests-html
sumy- 自動匯總文本文檔和 HTML 頁面的模塊。
https://github.com/miso-belica/sumy
textract- 從任何文檔,Word,PowerPoint,PDF 等中提取文本
https://github.com/deanmalmgren/textract
toapi- 每個網站都提供 API。
https://github.com/gaojiuli/toapi
五、HTML、XML
用于處理 HTML 和 XML 的庫。
BeautifulSoup- 提供 Pythonic 慣用法來迭代,搜索和修改 HTML 或 XML。
bleach –基于白名單 HTML 清理和文本 linkification 庫中的。
cssutils- 一個 Python 的 CSS 庫。
html5lib- 一個符合標準的庫,用于解析和序列化 HTML 文檔和片段。
lxml- 一個非常快速,易于使用的通用庫,用于處理 HTML 和 XML。
MarkupSafe- 為 Python 實現 XML / HTML / XHTML 標記安全字符串。
pyquery- 用于解析 HTML 的類似 jQuery 的庫。
untangle –將 XML 文檔轉換為 Python 對象,以方便訪問。
WeasyPrint- 用于 HTML 和 CSS 的可視渲染引擎,可以導出為 PDF。
xmldataset- 簡單的 XML 解析。
xmltodict- 使用 XML 就像使用 JSON。
六、HTTP 客戶端
使用 HTTP 的庫。
grequests- 異步 HTTP 請求的 request + gevent。
httplib2- 全面的 HTTP 客戶端庫。
httpx- 用于 Python 的下一代 HTTP 客戶端。
requests -HTTP 對人類的請求。
treq -Python 請求,例如在 Twisted 的 HTTP 客戶端之上構建的 API。
七、office 模塊
用于解析和處理特定文本格式的庫。
General
tablib -XLS,CSV,JSON,YAML 中的表格數據集的模塊。
Office
docxtpl- 通過 jinja2 模板編輯 docx 文檔
openpyxl- 用于讀取和寫入 Excel 2010 xlsx /xlsm/xltx /xltm 文件的庫。
pyexcel- 提供一個用于讀取,操作和寫入 csv,ods,xls,xlsx 和 xlsm 文件的 API。
python-docx- 讀取,查詢和修改 Microsoft Word 2007/2008 docx 文件。
python-pptx- 用于創建和更新 PowerPoint(.pptx)文件的 Python 庫。
unoconv- 在 LibreOffice / OpenOffice 支持的任何文檔格式之間轉換。
XlsxWriter- 一個用于創建 Excel .xlsx 文件的 Python 模塊。
xlwings -BSD 許可的庫,可以輕松地從 Excel 調用 Python,反之亦然。
xlwt / xlrd- 從 Excel 文件寫入和讀取數據以及格式化信息。
PDF 格式
PDFMiner- 一種從 PDF 文檔提取信息的工具。
PyPDF2- 一個能夠拆分,合并和轉換 PDF 頁面的庫。
ReportLab- 允許快速創建豐富的 PDF 文檔。
Markdown
Mistune-Markdown 最快,功能最全的純 Python 解析器。
Python-Markdown -John Gruber 的 Markdown 的 Python 實現。
YAML
PyYAML- 適用于 Python 的 YAML 實現。
CSV
csvkit- 轉換為 CSV 并使用 CSV 的實用程序。
Archive
unp- 一個命令行工具,可以輕松地解壓縮檔案。
八、序列化
用于序列化復雜數據類型的庫
marshmallow- 一個輕量級的庫,用于將復雜的對象與簡單的 Python 數據類型相互轉換。
pysimdjson - 一個 Python 綁定 simdjson。
python-rapidjson- 一個 Python 包裝周圍 RapidJSON。
ultrajson- 使用 Python 綁定用 C 編寫的快速 JSON 解碼器和編碼器。
九、代碼分析、測試
碼質量檢查器的工具。另請參閱令人敬畏的靜態分析。
代碼分析
Coala- 語言獨立且易于擴展的代碼分析應用程序。
code2flow- 將您的 Python 和 JavaScript 代碼轉換為 DOT 流程圖。
prospector- 分析 Python 代碼的工具。
pycallgraph- 一個可視化 Python 應用程序流程(調用圖)的庫。
vulture- 查找和分析無效的 Python 代碼的工具。
Code Linters
flake8 - 一個包裝器 pycodestyle,pyflakes 和麥凱布。
很棒的片狀 8 擴展
pylama- 用于 Python 和 JavaScript 的代碼審核工具。
pylint- 完全可定制的源代碼分析器。
wemake-python-styleguide- 有史以來最嚴格,最自以為是的 python linter。
代碼格式化程序
black –毫不妥協的 Python 代碼格式化程序。
isort- 用于對導入進行排序的 Python 實用程序 / 庫。
yapf- 另一個來自 Google 的 Python 代碼格式化程序。
靜態類型檢查器,另請參見 awesome-python-typing
mypy- 在編譯期間檢查變量類型。
pyre-check- 性能類型檢查。
typeshed- 具有靜態類型的 Python 庫存根的集合。
靜態類型注釋生成器
MonkeyType- 一個用于 Python 的系統,通過收集運行時類型來生成靜態類型注釋。
pyannotate- 自動生成 PEP-484 注釋。
pytype -pytype 檢查并推斷 Python 代碼的類型 - 無需類型注釋。
滲透測試的框架和工具。
fsociety- 滲透測試框架。
setoolkit- 社會工程的工具包。
sqlmap- 自動 SQL 注入和數據庫接管工具。
用于測試代碼庫和生成測試數據的庫。
測試框架
hypothesis –假設是一個高級的 Quickcheck 樣式基于屬性的測試庫。
nose2 -nose 基于 `unittest2。的后繼者。
pytest- 一個成熟的功能齊全的 Python 測試工具。
Robot Framework 通用的測試自動化框架。
unittest-(Python 標準庫)單元測試框架。
測試選手
green - 干凈,多彩的測試運行器。
mamba -Python 的權威測試工具。生于 BDD 的旗幟下。
tox- 自動構建和測試多個 Python 版本的發行版
GUI / Web 測試
locust- 用 Python 編寫的可擴展用戶負載測試工具。
PyAutoGUI -PyAutoGUI 是適用于人類的跨平臺 GUI 自動化 Python 模塊。
Schemathesis- 用于對基于 Open API / Swagger 規范構建的 Web 應用程序進行基于屬性的自動測試的工具。
Selenium - Selenium WebDriver 的 Python 綁定。
sixpack- 與語言無關的 A / B 測試框架。
splinter- 用于測試 Web 應用程序的開源工具。
Mock
doublex- 強大的 Python 測試框架加倍。
Frozengun- 通過模擬 datetime 模塊來穿越時間。
httmock- 一個針對 Python 2.6 + 和 3.2 + 的請求的模擬庫。
httpretty- 適用于 Python 的 HTTP 請求模擬工具。
mock-(Python 標準庫)一個模擬和修補庫。
mocket - 具有 gevent /asyncio/ SSL 支持的套接字模擬框架。
responses 一個實用程序庫,用于模擬請求 Python 庫。
VCR.py- 記錄并重放測試中的 HTTP 交互。
對象工廠
factory_boy -Python 的測試裝置替代品。
mixer- 另一種燈具更換。支持 Django,Flask,SQLAlchemy,Peewee 等
model_mommy- 創建隨機夾具以在 Django 中進行測試。
代碼覆蓋率
coverage- 代碼覆蓋率度量。
偽數據
fake2db- 偽數據庫生成器。
faker- 一個生成偽造數據的 Python 包。
mimesis- 是一個 Python 庫,可幫助您生成虛假數據。
radar - 生成隨機的日期時間 / 時間。
用于驗證數據的庫。
Cerberus- 一個輕量級和可擴展的數據驗證庫。
colander- 驗證和反序列化通過 XML,JSON 和 HTML 表單發布獲得的數據。
jsonschema - Python 的 JSON 模式的實現。
schema- 用于驗證 Python 數據結構的庫。
Schematics –數據結構驗證。
valideer - 輕量級可擴展數據驗證和適配庫。
voluptuous - 的 - 一個 Python 數據驗證庫。
十、web 框架
傳統的全棧 Web 框架。另請參閱 RESTful API。
同步
Django -Python 中最流行的 Web 框架。
很棒的 django
很棒的 django
Flask -Python 的微框架。
很棒的燒瓶
Pyramid- 一個小型,快速,扎實的開源 Python Web 框架。
真棒金字塔
Masonite- 以開發人員為中心的現代 Python Web 框架。
異步
Tornado- 一個 Web 框架和異步網絡庫。
十一、搜索
用于對數據建立索引并執行搜索查詢的庫和軟件。
django-haystack- 模塊化搜索 Django。
elasticsearch-dsl-py -Elasticsearch 的官方高級 Python 客戶端。
elasticsearch-py - Elasticsearch 的官方低層 Python 客戶端。
pysolr - Apache Solr 的輕量級 Python 包裝器。
whoosh- 一個快速的純 Python 搜索引擎庫。
十二、日志記錄
用于生成和使用日志的庫。
logbook - - 記錄 Python 的替換記錄。
logging-(Python 標準庫)Python 的日志記錄工具。
loguru- 旨在以 Python 帶來令人愉悅的日志記錄的庫。
sentry- python - 適用于 Python 的 Sentry SDK。
structlog- 結構化日志變得容易。
十三、并發與并行
用于并發和并行執行的庫。另請參閱 awesome-asyncio。
parallel.futures-(Python 標準庫)用于異步執行可調用對象的高級接口。
eventlet- 具有 WSGI 支持的異步框架。
gevent- 使用 greenlet 的基于協程的 Python 網絡庫。
multiprocessing-(Python 標準庫)基于進程的并行性。
scoop -Python 中的可伸縮并發操作。
uvloop - 在.NET 之上的 asyncio 事件循環的超快速實現 libuv。
十四、任務隊列
用于處理任務隊列的庫。
celery- 基于分布式消息傳遞的異步任務隊列 / 作業隊列。
Dramatiq- 用于 Python 3 的快速可靠的后臺任務處理庫。
huey- 小多線程任務隊列。
mrq- 使用 Redis 和 gevent 的 Python 中的分布式工作者任務隊列。
rq -Python 的簡單作業隊列。
十五、自然語言處理
用于使用人類語言的圖書館。
一般的
gensim- 人類主題建模。
langid.py- 獨立的語言識別系統。
nltk- 用于構建 Python 程序以使用人類語言數據的領先平臺。
pattern- 一個 Web 挖掘模塊。
polyglot- 支持數百種語言的自然語言管道。
pytext 的 - 基于 PyTorch 自然語言建模框架。
PyTorch-NLP- 一種工具包,可用于研究的快速深度學習 NLP 原型。
spacy - 一種用于 Python 和用 Cython 工業強度的自然語言處理庫。
Stanza -Stanford NLP Group 的官方 Python 庫,支持 60 多種語言。
中國人
funNLP- 中國 NLP 的工具和數據集的集合。
jieba- 最受歡迎的中文文本分割庫。
pkuseg-python- 用于各種領域的中文分詞的工具包。
snownlp- 用于處理中文文本的庫。
十六、深度學習、機器學習、計算機視覺
神經網絡和深度學習框架。另請參閱真棒深度學習。
caffe- 深度學習的快速開放框架。
keras- 一個高級神經網絡庫,能夠在 TensorFlow 或 Theano 之上運行。
mxnet- 專為效率和靈活性而設計的深度學習框架。
pytorch- 具有強大 GPU 加速功能的 Python 中的張量和動態神經網絡。
SerpentAI- 游戲代理框架。使用任何視頻游戲作為深度學習沙箱。
tensorflow- 由 Google 創建的最受歡迎的深度學習框架。
Theano- 一個用于快速數值計算的庫。
機器學習圖書館。另請參閱很棒的機器學習。
健身房 - 用于開發和比較強化學習算法的工具包。
H2O- 開源快速可擴展機器學習平臺。
指標 - 機器學習評估指標。
NuPIC -Numenta 智能計算平臺。
scikit-learn- 最受歡迎的機器學習 Python 庫。
Spark ML - Apache Spark 的可擴展機器學習庫。
vowpal_porpoise- 用于 Vowpal Wabbit 的輕量級 Python 包裝器。
xgboost- 一個可擴展,可移植和分布式的梯度增強庫。
MindsDB -MindsDB 是現有數據庫的開源 AI 層,可讓您使用標準查詢輕松地開發,訓練和部署最新的機器學習模型。
計算機視覺圖書館。
EasyOCR- 支持 40 多種語言的即用型 OCR。
人臉識別 - 簡單的人臉識別庫。
Kornia - PyTorch 的開源可區分計算機視覺庫。
OpenCV- 開源計算機視覺庫。
pytesseract - Google Tesseract OCR 的包裝。
SimpleCV- 用于構建計算機視覺應用程序的開源框架。
tesserocr-tesseract-ocr 用于 OCR 的 API 的另一種簡單,對枕頭友好的包裝。
十七、數據分析、可視化
用于數據分析的庫。
AWS Data Wrangler -AWS 上的 Pandas。
Blaze -NumPy 和 Pandas 連接到大數據。
Pandas 界面中的 Open Mining- 商業智能(BI)。
Optimus –敏捷數據科學的工作流程變得容易與 PySpark。
Orange –通過可視化編程或腳本進行數據挖掘,數據可視化,分析和機器學習。
Pandas- 一個提供高性能,易于使用的數據結構和數據分析工具的庫。
用于可視化數據的庫。另請參閱 awesome-javascript。
Altair- 用于 Python 的聲明性統計可視化庫。
Bokeh- 用于 Python 的交互式 Web 繪圖。
bqplot -Jupyter Notebook 的交互式繪圖庫
Cartopy- 具有 matplotlib 支持的制圖 python 庫
短跑 - 建立在燒瓶頂部,反應,Plotly 旨在分析 Web 應用程序。
很棒的破折號
圖表 - 圖表為代碼。
Matplotlib- 一個 Python 2D 繪圖庫。
plotnine- 基于 ggplot2 的 Python 圖形語法。
Pygal- 一個 Python SVG 圖表創建器。
PyGraphviz - Graphviz 的 Python 接口。
PyQtGraph- 交互式和實時 2D / 3D / 圖像繪制以及科學 / 工程小部件。
Seaborn - 使用 Matplotlib 統計數據可視化。
VisPy- 基于 OpenGL 的高性能科學可視化。
十八、數據庫驅動程序
用于連接和操作數據庫的庫。
MySQL- 很棒的 MySQL
mysqlclient- 支持 Python 3 的 MySQL 連接器(mysql-python fork)。
PyMySQL- 與 mysql-python 兼容的純 Python MySQL 驅動程序。
PostgreSQL- 很棒的 Postgres
psycopg2- 最受歡迎的 Python PostgreSQL 適配器。
查詢 -psycopg2 庫的包裝,用于與 PostgreSQL 交互。
SQlite- 很棒的 SQLite
sqlite3-(Python 標準庫)與 DB-API 2.0 兼容的 SQlite 接口
SuperSQLite- 建立在 apsw 之上的增壓 SQLite 庫。
其他關系數據庫
pymssql -Microsoft SQL Server 的簡單數據庫接口。
clickhouse-driver- 具有 ClickHouse 本地接口的 Python 驅動程序。
NoSQL 數據庫
cassandra-driver -Apache Cassandra 的 Python 驅動程序。
happybase -Apache HBase 的開發人員友好型庫。
kafka-python -Apache Kafka 的 Python 客戶端。
py2neo- 用于 Neo4j 的客戶端庫和工具包。
pymongo -MongoDB 的官方 Python 客戶端。
redis-py -Redis 的 Python 客戶端。
異步客戶端
motor -MongoDB 的異步 Python 驅動程序。
十九、DevOps 工具
DevOps 的軟件和庫。
配置管理
ansible- 一個非常簡單的 IT 自動化平臺。
cloudinit- 一個多分發包,用于處理云實例的早期初始化。
OpenStack- 用于構建私有和公共云的開源軟件。
pyinfra- 通用的 CLI 工具和 python 庫,可自動執行基礎架構。
saltstack- 基礎結構自動化和管理系統。
SSH 樣式的部署
cuisine - 類似于 Fabric 的廚師功能。
fabric - 一個簡單的,Python 化工具,用于遠程執行和部署。
fabtools- 編寫很棒的 Fabric 文件的工具。
流程管理
honcho - Foreman 的 Python 克隆,用于管理基于 Procfile 的應用程序。
supervisor - 用于 UNIX 監事過程控制系統。
監控方式
psutil- 跨平臺的流程和系統實用程序模塊。
后備
BorgBackup- 具有壓縮和加密功能的重復數據刪除存檔器。
其他
docker- compose- 使用 Docker 的快速隔離開發環境。
二十、分布式計算
分布式計算的框架和庫。
批量處理
dask- 用于分析計算的靈活并行計算庫。
luigi- 一個模塊,可幫助您構建批處理作業的復雜管道。
mrjob- 在 Hadoop 或 Amazon Web Services 上運行 MapReduce 作業。
PySpark - Apache Spark Python API。
Ray- 用于并行和分布式 Python 的系統,統一了機器學習生態系統。
流處理
faust- 流處理庫,將想法從 Kafka Streams 移植到 Python。
streamparse- 通過 Apache Storm 針對實時數據流運行 Python 代碼。
二十一、配置、打包構建
用于存儲和解析配置選項的庫。
configobj- 帶有驗證的 INI 文件解析器。
configparser-(Python 標準庫)INI 文件解析器。
hydra -Hydra 是用于優雅配置復雜應用程序的框架。
profig- 使用值轉換從多種格式進行配置。
python-decouple- 嚴格將設置與代碼分開。
用于創建打包的可執行文件以進行發行的庫。
dh-virtualenv- 以 Debian 軟件包的形式構建和分發 virtualenv。
Nuitka - 將腳本,模塊,程序包編譯為可執行文件或擴展模塊。
py2app- 凍結 Python 腳本(Mac OS X)。
py2exe- 凍結 Python 腳本(Windows)。
pyarmor- 一種用于混淆 python 腳本,將混淆后的腳本綁定到固定計算機或使混淆后的腳本失效的工具。
PyInstaller- 將 Python 程序轉換為獨立的可執行文件(跨平臺)。
pynsist- 用于構建 Windows 安裝程序的工具,安裝程序將 Python 本身捆綁在一起。
shiv- 命令行實用程序,用于構建完全獨立的 zipapp(PEP 441),但包括其所有依賴項。
二十二、虛擬環境
用于 Python 版本和虛擬環境管理的庫。
pyenv- 簡單的 Python 版本管理。
virtualenv- 創建隔離的 Python 環境的工具。
二十三、界面開發
用于處理圖形用戶界面應用程序的庫。
curses - - 內置包裝器 ncurses 的用于創建終端 GUI 的應用程序。
Eel- 一個用于制作簡單的類似于電子的脫機 HTML / JS GUI 應用程序的庫。
enaml- 使用聲明性語法(如 QML)創建漂亮的用戶界面。
Flexx -Flexx 是用于創建 GUI 的純 Python 工具包,它使用 Web 技術進行呈現。
Gooey - 使用命令行將命令行程序轉換為完整的 GUI 應用程序。
kivy- 用于創建 NUI 應用程序的庫,可在 Windows,Linux,Mac OS X,Android 和 iOS 上運行。
pyglet -Python 的跨平臺窗口和多媒體庫。
PyGObject -GLib / GObject / GIO / GTK +(GTK + 3)的 Python 綁定。
PyQt - Qt 跨平臺應用程序和 UI 框架的 Python 綁定。
PySimpleGUI - tkinter,Qt,WxPython 和 Remi 的包裝。
pywebview- 圍繞 webview 組件的輕量級跨平臺本機包裝器。
Tkinter -Tkinter 是 Python 的事實上的標準 GUI 軟件包。
Toga -Python 本機,OS 本機 GUI 工具箱。
urwid- 一個用于創建終端 GUI 應用程序的庫,該庫對小部件,事件,豐富的顏色等具有強大的支持。
wxPython -wxWidgets C ++ 類庫與 Python 的混合。
DearPyGui- 一個簡單的 GPU 加速的 Python GUI 框架
二十四、游戲開發
很棒的游戲開發庫。
Arcade -Arcade 是一個現代 Python 框架,用于制作具有引人注目的圖形和聲音的游戲。
Cocos2d -cocos2d 是用于構建 2D 游戲,演示和其他圖形 / 交互應用程序的框架。
Harfang3D- 用于 3D,VR 和游戲開發的 Python 框架。
Panda3D- 迪士尼開發的 3D 游戲引擎。
Pygame -Pygame 是一組旨在編寫游戲的 Python 模塊。
PyOgre -Ogre 3D 渲染引擎的 Python 綁定,可用于游戲,模擬或任何 3D。
PyOpenGL -OpenGL 及其相關 API 的 Python ctypes 綁定。
PySDL2 -SDL2 庫的基于 ctypes 的包裝器。
RenPy- 一個視覺小說引擎
二十五、任務調度器
用于計劃作業的庫。
Airflow 氣流是一個以編程方式編寫,安排和監視工作流的平臺。
APScheduler- 輕巧但功能強大的進程內任務計劃程序,可讓您計劃功能。
django-schedule -Django 的日歷應用程序。
doit- 一個任務運行器和構建工具。
gunnery - 具有基于 Web 界面的分布式系統的多用途任務執行工具。
Joblib- 一套在 Python 中提供輕量級流水線的工具。
Plan - 像用吊飾一樣用 Python 編寫 crontab 文件。
Prefect- 一個現代的工作流程編排框架,可輕松構建,調度和監視強大的數據管道。
schedule- 針對人類的 Python 作業調度。
Spiff- 用純 Python 實現的功能強大的工作流引擎。
TaskFlow- 一個 Python 庫,可幫助簡化,一致且可靠的任務執行
二十六、科學計算
用于科學計算的圖書館。另請參見 Python for-Scientists。
astropy- 天文學的社區 Python 庫。
bcbio-nextgen- 提供最佳實踐流水線,用于全自動高通量測序分析。
bccb- 收集與生物學分析有關的有用代碼。
Biopython -Biopython 是一套免費的生物計算工具。
cclib- 一個用于解析和解釋計算化學程序包結果的庫。
Colour - 實施大量的顏色理論轉換和算法。
Karate Club - 用于圖形結構化數據的無監督機器學習工具箱。
NetworkX- 用于復雜網絡的高生產率軟件。
NIPY- 神經影像工具箱的集合。
NumPy- 使用 Python 進行科學計算的基本軟件包。
ObsPy- 地震學的 Python 工具箱。
Open Babel- 一種化學工具箱,旨在講多種化學數據語言。
PyDy -Python Dynamics 的縮寫,用于協助工作流進行動態運動建模。
PyMC- 馬爾可夫鏈蒙特卡洛采樣工具包。
QuTiP -Python 中的 Quantum Toolbox。
RDKit- 化學信息學和機器學習軟件。
SciPy- 用于數學,科學和工程的基于 Python 的開源軟件生態系統。
SimPy- 一個基于過程的離散事件模擬框架。
statsmodels -Python 中的統計建模和計量經濟學。
SymPy- 一個用于符號數學的 Python 庫。
Zipline- 一個 Pythonic 算法交易庫。
RPC
RPC 兼容服務器。
RPyC(遠程 Python 調用)- 用于 Python 的透明且對稱的 RPC 庫
zeroRPC -zerorpc 是基于 ZeroMQ 和 MessagePack 的靈活 RPC 實現。
ython 提供了多種庫來處理純文本數據,這些庫可以應對從基本文本操作到復雜文本分析的各種需求。以下是一些常用的純文本處理相關的庫:
# 分割字符串
text = "hello, world"
print(text.split(",")) # 輸出:['hello', ' world']
# 連接字符串
words = ["Python", "is", "awesome"]
print(" ".join(words)) # 輸出:Python is awesome
# 替換字符串中的子字符串
text = "Hello World"
print(text.replace("World", "Python")) # 輸出:Hello Python
import re
text = "The rain in Spain"
x = re.search("^The.*Spain$", text)
if x:
print("YES! We have a match!")
else:
print("No match")
import string
# 示例:使用 string 常量
print(string.ascii_lowercase) # 輸出:abcdefghijklmnopqrstuvwxyz
import textwrap
sample_text = '''
This is a very very very very very long string.
'''
print(textwrap.fill(sample_text, width=50))
import difflib
text1 = "Python is great"
text2 = "Python is good"
d = difflib.Differ()
diff = d.compare(text1.split(), text2.split())
print('\n'.join(diff))
import codecs
# 讀取一個 UTF-8 編碼的文件
with codecs.open('example.txt', 'r', 'utf-8') as f:
print(f.read())
import unicodedata
# 獲取字符的名稱
char = '?'
name = unicodedata.name(char)
print(name) # 輸出:LATIN SMALL LETTER N WITH TILDE
import csv
with open('example.csv', mode='r') as file:
reader = csv.reader(file)
for row in reader:
print(row)
import json
data = {'key': 'value'}
json_data = json.dumps(data)
print(json_data)
import xml.etree.ElementTree as ET
# 解析XML
tree = ET.parse('example.xml')
root = tree.getroot()
# 遍歷XML文檔
for child in root:
print(child.tag, child.attrib)
from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print("Start tag:", tag)
def handle_endtag(self, tag):
print("End tag:", tag)
def handle_data(self, data):
print("Data:", data)
parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
'<body><h1>Parse me!</h1></body></html>')
import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize
text = "Hello Mr. Smith, how are you doing today?"
tokens = word_tokenize(text)
print(tokens)
通過使用這些庫,Python 程序員能夠執行各種文本處理任務,從簡單的字符串操作到復雜的文本分析和處理。根據項目的具體需求,正確選擇合適的庫對于提高效率和代碼質量至關重要。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。