在選單欄上怎麼顯示文字
資料是新的石油,文字是我們需要更深入鑽探的油井。文字資料無處不在,在實際使用之前,我們必須對其進行預處理,以使其適合我們的需求。對於資料也是如此,我們必須清理和預處理資料以符合我們的目的。這篇文章將包括一些簡單的方法來清洗和預處理文字資料以進行文字分析任務。
我們將在Covid-19 Twitter資料集上對該方法進行建模。 這種方法有3個主要組成部分:
首先,我們要清理和過濾所有非英語的推文/文字,因為我們希望資料保持一致。
其次,我們為複雜的文字資料建立一個簡化的版本。
最後,我們將文字向量化並儲存其嵌入以供將來分析。
第1部分:清理和過濾文字
首先,為了簡化文字,我們要將文字標準化為僅為英文字元。此函式將刪除所有非英語字元。
def clean_non_english(txt):
txt = re。sub(r‘\W+’, ‘ ’, txt)
txt = txt。lower()
txt = txt。replace(“[^a-zA-Z]”, “ ”)
word_tokens = word_tokenize(txt)
filtered_word = [w for w in word_tokens if all(ord(c) < 128 for c in w)]
filtered_word = [w + “ ” for w in filtered_word]
return “”。join(filtered_word)
我們甚至可以透過刪除停止詞來做得更好。停詞是出現在英語句子中對意思沒有多大幫助的常見詞。我們將使用nltk包來過濾stopwords。由於我們的主要任務是使用word cloud將tweet的主題視覺化,所以這一步需要避免使用“the,”“a,”等常見單詞。
但是,如果你的任務需要完整的句子結構,比如下一個單詞預測或語法檢查,你可以跳過這一步。
import nltk
nltk。download(‘punkt’) # one time execution
nltk。download(‘stopwords’)
from nltk。corpus import stopwords
stop_words = set(stopwords。words(‘english’))def clean_text(english_txt):
try:
word_tokens = word_tokenize(english_txt)
filtered_word = [w for w in word_tokens if not w in stop_words]
filtered_word = [w + “ ” for w in filtered_word]
return “”。join(filtered_word)
except:
return np。nan
對於tweets,在清理之前我們需要考慮一個特殊的特性:提及@。您的資料可能具有這樣的特殊特性(也可能沒有),這是具體情況,而不是普遍要求。因此,在盲目地清理和預處理資料之前,要充分了解您的資料!
def get_mention(txt):
mention = []
for i in txt。split(“ ”):
if len(i) > 0 and i[0] == “@”:
mention。append(i)
return “”。join([mention[i] + “, ” if i != len(mention) - 1 else mention[i] for i in range(len(mention))]
以前,我們清理非英文字元。現在,我們刪除非英語文字(語義上)。Langdetect是一個python包,它允許檢查文字的語言。它是谷歌的語言檢測庫從Java到Python的直接端移植。
from langdetect import detect
def detect_lang(txt):
try:
return detect(txt)
except:
return np。nan
然後我們過濾掉所有不是“en”語言的列。
第2部分:簡化複雜的資料
對於數值資料,良好的處理方法是縮放,標準化和規範化。此資源有助於理解並將這些方法應用於您的資料。在本文的討論範圍內,由於其他資源在此方面做得很好,因此我將不做進一步討論。
對於分類資料,有許多方法。兩種名義上的方法是標籤編碼器(為每個標籤分配一個不同的編號)和一種熱編碼(以0和1的向量表示)。有關這些分類值的方法的更多詳細資訊,請參見此處。與我提到的這兩種資源相比,此資源非常豐富,具有更多型別的編碼。
這篇文章將介紹一些減少資料特別是位置資料複雜性的方法。在我的資料集中,有一列位置,帶有作者的地址。但是,由於這些原始資料過於混亂和複雜(具有城市,縣,州,國家/地區),因此我無法對其進行太多分析。因此,我們可以將文字標準化,並將其縮小到“國家”級別。處理位置資料的程式包是geopy。它可以識別正確的地址並將這些位置重新格式化為標準格式。然後,您可以選擇保留所需的任何資訊。對我來說,國家,國家足夠體面。
from geopy。geocoders import Nominatim
geolocator = Nominatim(user_agent=“twitter”)def get_nation(txt):
try:
location = geolocator。geocode(txt)
x = location。address。split(“,”)[-1]
return x
except:
return np。nan
第3部分:向量化和嵌入
文字向量化將文字轉換為值的向量以表示其含義。 早些時候,我們有一種熱編碼方法,其向量的大小與我們的詞彙量相同,在出現文字的任何地方都為1,在其他地方為0。 如今,我們擁有更高階的方法,例如spacy,GloVe甚至bert嵌入。 對於本專案的範圍,我將向您介紹python和Jupiter筆記本中的GloVe。
首先,我們下載嵌入向量。 您可以在此處手動下載或直接在筆記本中進行下載。
!wget nlp。stanford。edu/data/glove。6B。zip
!unzip glove*。zip
然後,我們建立一個向量向量化每個資料點的函式。 句子是每個單詞的平均表示。 對於空句子,我們將其預設為零向量。
def vectorize(value, word_embeddings, dim = 100):
sentences = value。to_list()
sentence_vectors = []
for i in sentences:
if len(i) != 0:
v = sum([word_embeddings。get(w, np。zeros((dim,))) for w in i。split()])/(len(i。split())+0。001)
else:
v = np。zeros((dim,))
sentence_vectors。append(v)
sentence_vectors = np。array(sentence_vectors)
return sentence_vectors
最後,我們對整個資料集進行向量化處理,並將向量化的numpy陣列另存為檔案,因此我們不必在每次執行程式碼時都再次進行此過程。 向量化版本將以。npy檔案的形式儲存為numpy陣列。 Numpy包方便儲存和處理海量陣列資料。
作為我的個人標準做法,我嘗試將每個部分之後的所有資料儲存為單獨的檔案,以評估資料並更靈活地更改程式碼。
def vectorize_data(data = data, value = ‘english_text’, dim = 100):
# Extract word vectors
word_embeddings = {}
f = open(‘glove。6B。{}d。txt’。format(str(dim)), encoding=‘utf-8’)
for line in f:
values = line。split()
word = values[0]
coefs = np。asarray(values[1:], dtype=‘float32’)
word_embeddings[word] = coefs
f。close() text_vec = vectorize(data[value], word_embeddings, dim)
np。save(“vectorized_{}。npy”。format(str(dim)), text_vec)
print(“Done。 Data:”, text_vec。shape)
return True
總結
資料預處理,特別是文字預處理,可能是一個非常麻煩的過程。 機器學習工程師工作流程的很大一部分將用於這些清理和格式化資料(如果您的資料已經完全清理好了,那麼,幸運的是,對於所有實現這一目標的工程師來說,他們都感到很榮幸)。
這篇文章中的所有程式碼都是非常抽象的,可以應用於許多資料專案(您只需更改列名,所有程式碼都可以正常工作)。 在筆記本中,我還添加了異常功能來處理故障情況,以確保您的程式碼不會在中途崩潰。 我希望它對您的專案有幫助,就像對我的幫助一樣。
最後,所有的程式碼可以在這裡找到:github/viethoangtranduong/covid19-tweets
作者:Viet Hoang Tran Duong
deephub翻譯組