文字嵌入器是一項機器學習任務,用於建立一段文字的向量表示。然後可以將該向量用作機器學習演算法的輸入。文字嵌入的目標是以適合機器學習的方式捕捉文字的含義。
創建文字嵌入的方法有很多種,但最常見的是使用神經網路。神經網路是一種機器學習演算法,非常擅長學習複雜的關係。神經網路的輸入是一個向量,輸出是一個相同大小的向量。神經網路學習以捕捉輸入和輸出之間關係的方式將輸入向量映射到輸出向量。
為了創建文本嵌入,首先在大型文本語料庫上訓練神經網路。訓練資料是一組句子,每個句子表示為一個向量。透過取得句子中單字的單字向量並將它們相加來建立向量。然後訓練神經網路將句子向量映射到固定的向量大小。
一旦神經網路經過訓練,就可以用於為新文字建立文字嵌入。新文本首先被表示為向量,然後使用神經網路將向量映射到固定的向量大小。結果是捕獲文本含義的文本嵌入。
文字嵌入可用於各種機器學習任務。例如,它們可用於提高用於文字分類的機器學習演算法的效能。文字嵌入也可以用於尋找相似的文字片段,或將文字聚集在一起。
建立文字嵌入有多種不同的方法,方法的選擇取決於應用程式。然而,神經網路是一種強大且廣泛使用的創建文本嵌入的方法。
Co:這是一個強大的神經網絡,它可以產生、嵌入和分類文字。在本教程中,我們將使用 Co:here 嵌入描述。要使用 Co:here,您需要在 Co:here 建立帳戶並取得 API 金鑰。
我們將使用Python進行編程,因此我們需要透過pip
安裝cohere
庫
pip install cohere
首先,我們必須實作cohere.Client
。 Client 的參數中應該是您之前產生的 API 金鑰以及版本2021-11-08
。我將創建類CoHere
,它將在接下來的步驟中有用。
class CoHere :
def __init__ ( self , api_key ):
self . co = cohere . Client ( f' { api_key } ' , '2021-11-08' )
self . examples = []
每個神經網路的主要部分是一個資料集。在本教程中,我將使用包含 10 個類別的 1000 個描述的資料集。如果您想使用相同的,可以在這裡下載。
下載的資料集有10個資料夾,每個資料夾有100個files.txt
以及描述。檔案名稱是描述標籤,例如sport_3.txt
。
我們將Random Forest
與Co:here Classifier
進行比較,因此我們必須以兩種方式準備資料。對於Random Forest
我們將使用Co:here Embedder
,我們將在本教程中重點介紹這一點。 Cohere 分類器需要樣本,其中每個樣本應設計為列表[description, label]
,我在先前的教程中做到了這一點(此處)
首先,我們需要載入所有資料來做到這一點。我們建立函數load_examples
。在此函數中,我們將使用三個外部函式庫:
os.path
進入包含資料的資料夾。程式碼在 python 的file.py
路徑中執行。這是一個內部庫,所以我們不需要安裝它。
numpy
這個函式庫對於處理陣列很有用。在本教程中,我們將使用它來產生隨機數。您必須透過 pip pip install numpy
安裝此程式庫。
glob
幫助我們讀取所有檔案和資料夾名稱。這是一個外部函式庫,因此需要安裝 - pip install glob
。
下載的資料集應解壓縮到資料夾data
中。透過os.path.join
我們可以獲得資料夾的通用路徑。
folders_path = os . path . join ( 'data' , '*' )
在 Windows 中,傳回等於data*
。
然後我們可以使用glob
方法來取得所有資料夾的名稱。
folders_name = glob ( folders_path )
folders_name
是一個列表,其中包含資料夾的視窗路徑。在本教程中,這些是標籤的名稱。
[ 'data \ business' , 'data \ entertainment' , 'data \ food' , 'data \ graphics' , 'data \ historical' , 'data \ medical' , 'data \ politics' , 'data \ space' , 'data \ sport' , 'data \ technologie' ]
Co:here
訓練資料集的大小不能大於 50 個範例,每個類別必須至少有 5 個範例,但對於Random Forest
我們可以使用 1000 個範例。透過for
循環我們可以獲得每個檔案的名稱。整個函數看起來像這樣:
import os . path
from glob import glob
import numpy as np
def load_examples ( no_of_ex ):
examples_path = []
folders_path = os . path . join ( 'data' , '*' )
folders_name = glob ( folders_path )
for folder in folders_name :
files_path = os . path . join ( folder , '*' )
files_name = glob ( files_path )
for i in range ( no_of_ex // len ( folders_name )):
random_example = np . random . randint ( 0 , len ( files_name ))
examples_path . append ( files_name [ random_example ])
return examples_path
最後一個循環是隨機取得每個標籤的 N 條路徑並將它們附加到新清單examples_path
。
現在,我們必須建立一個訓練集。為此,我們將使用load_examples()
載入範例。每個路徑中都有一個類別的名稱,我們將使用它來建立範例。描述需要從文件中讀取, texts
不能太長,因此在本教程中,長度將等於100 [descroption, class_name]
因此,返回就是該列表。
def examples ( no_of_ex ):
texts = []
examples_path = load_examples ( no_of_ex )
for path in examples_path :
class_name = path . split ( os . sep )[ 1 ]
with open ( path , 'r' , encoding = "utf8" ) as file :
text = file . read ()[: 100 ]
texts . append ([ text , class_name ])
return texts
我們回到CoHere
課堂。我們必須添加一種方法 - 嵌入範例。
第二種cohere
方法是嵌入文本。此方法有多個參數,例如:
模型的model
尺寸。
要嵌入的文字texts
。
如果文字長於可用標記, truncate
,文字的哪一部分應取LEFT
、 RIGHT
或NONE
。
所有這些您都可以在這裡找到。
在本教程中, cohere
方法將作為CoHere
類別的方法來實作。
def embed ( self , no_of_ex ):
# as a good developer we should split the dataset.
data = pd . DataFrame ( examples ( no_of_ex ))
self . X_train , self . X_test , self . y_train , self . y_test = train_test_split (
list ( data [ 0 ]), list ( data [ 1 ]), test_size = 0.2 , random_state = 0 )
# in the next two lines we create a numeric form of X_train data
self . X_train_embeded = self . co . embed ( texts = X_train ,
model = "large" ,
truncate = "LEFT" ). embeddings
self . X_test_embeded = self . co . embed ( texts = X_test ,
model = "large" ,
truncate = "LEFT" ). embeddings
X_train_embeded
將是一個數字數組,如下所示:
[ 386, 0.39653537, -0.409076, 0.5956299, -0.06624506, 2.0539167, 0.7133603,...
為了創建一個應用程式來比較兩個可能性顯示,我們將使用Stramlit
。這是一個簡單且非常有用的函式庫。
安裝
pip install streamlit
我們需要co:here
API 金鑰的文字輸入。
在streamlit的文檔中我們可以找到方法:
st.header()
在我們的應用程式上建立標題
st.test_input()
發送文字請求
st.button()
建立按鈕
st.write()
顯示 cohere 模型的結果。
st.progress()
顯示進度條
st.column()
分割應用程式
st . header ( "Co:here Text Classifier vs Random Forest" )
api_key = st . text_input ( "API Key:" , type = "password" )
cohere = CoHere ( api_key )
cohere . list_of_examples ( 50 ) # number of examples for Cohere classifier
# showed in the previous tutorial
cohere . embed ( 1000 ) # number of examples for random forest
# initialization of random forest with sklearn library
forest = RandomForestClassifier ( max_depth = 10 , random_state = 0 )
col1 , col2 = st . columns ( 2 )
if col1 . button ( "Classify" ):
# training process of random forest, to do it we use embedded text.
forest . fit ( cohere . X_train_embeded , cohere . y_train )
# prediction process of random forest
predict = forest . predict_proba ( np . array ( cohere . X_test_embeded [ 0 ]). reshape ( 1 , - 1 ))[ 0 ]
here = cohere . classify ([ cohere . X_test [ 0 ]])[ 0 ] # prediction process of cohere classifier
col2 . success ( f"Correct prediction: { cohere . y_test [ 0 ] } " ) # display original label
col1 , col2 = st . columns ( 2 )
col1 . header ( "Co:here classify" ) # predictions for cohere
for con in here . confidence :
col1 . write ( f" { con . label } : { np . round ( con . confidence * 100 , 2 ) } %" )
col1 . progress ( con . confidence )
col2 . header ( "Random Forest" ) # predictions for random forest
for con , pred in zip ( here . confidence , predict ):
col2 . write ( f" { con . label } : { np . round ( pred * 100 , 2 ) } %" )
col2 . progress ( pred )
要運行 Streamlit 應用程序,請使用命令
streamlit run name_of_your_file . py
創建的應用程式如下所示
文字嵌入是一種強大的工具,可用於提高機器學習演算法的效能。神經網路是一種廣泛使用且有效的創建文字嵌入的方法。文本嵌入可用於文本分類、文本相似性和文本聚類等任務。
在本教程中,我們將Random Forest
與Co:here Classifier
進行比較,但Co:here Embedder
的可能性是巨大的。你可以用它來建構很多東西。
請繼續關注未來的教學!該程式碼的存儲庫可以在此處查看。
謝謝你! - Adrian Banachowicz,New Native 資料科學實習生