
文本數(shù)據(jù)是數(shù)據(jù)分析和機(jī)器學(xué)習(xí)中最常用的數(shù)據(jù)類型之一。 然而,文本數(shù)據(jù)往往是雜亂無(wú)章的,需要清洗和預(yù)處理才能被有效分析。 Pandas 是一個(gè)強(qiáng)大的 Python 數(shù)據(jù)分析庫(kù),它提供了一個(gè)方便的 str 訪問(wèn)器來(lái)幫助您清理和操作文本數(shù)據(jù)。
Pandas 中的 str 訪問(wèn)器提供了許多有用的字符串操作,可以應(yīng)用于 Pandas 系列的每個(gè)元素。 這些操作包括字符串拆分、連接、替換等。 在這里,我們將了解一些最有用的 str 操作,它們可以幫助您清理和操作文本數(shù)據(jù)。
讓我們從使用文本數(shù)據(jù)創(chuàng)建示例數(shù)據(jù)框開(kāi)始:
import pandas as pd
data = {"text_column": ["this is a text", "an example", "of text data", "in pandas"]}
df = pd.DataFrame(data)
print(df)
輸出
text_column
0 this is a text
1 an example
2 of text data
3 in pandas
1、小寫(xiě)轉(zhuǎn)換
有時(shí),文本數(shù)據(jù)可能包含混合大小寫(xiě)字符,這會(huì)導(dǎo)致難以分析和比較。 str 訪問(wèn)器提供了一個(gè) lower() 方法來(lái)將所有字符轉(zhuǎn)換為小寫(xiě)。
df["text_column"] = df["text_column"].str.lower()
print(df)
輸出
text_column
0 this is a text
1 an example
2 of text data
3 in pandas
2、strip方法
文本數(shù)據(jù)可能包含不需要的字符,如空格、制表符或換行符。 str 訪問(wèn)器提供了 strip() 方法來(lái)從系列中每個(gè)字符串的開(kāi)頭和結(jié)尾刪除這些字符。
df["text_column"] = df["text_column"].str.strip()
print(df)
輸出:
text_column
0 this is a text
1 an example
2 of text data
3 in pandas
3、替代法
str 訪問(wèn)器還提供了一種 replace() 方法,用于在系列的每個(gè)元素中用一個(gè)字符串替換另一個(gè)字符串。 當(dāng)您想要替換文本數(shù)據(jù)中的特定單詞或字符時(shí),這很有用。
df["text_column"] = df["text_column"].str.replace("text", "string")
print(df)
輸出:
text_column
0 this is a string
1 an example
2 of string data
3 in pandas
4、另一個(gè)重要的函數(shù)是extract()
此功能可用于從文本中提取特定模式。 extract() 函數(shù)將正則表達(dá)式模式作為參數(shù),并返回一個(gè)或多個(gè)匹配項(xiàng)作為新的 DataFrame 列。 讓我們看一個(gè)例子:
import pandas as pd
#創(chuàng)建示例 DataFrame
df = pd.DataFrame({'text': ['I love cats!', 'Dogs are the best', 'I love dogs and cats']})
# 使用 extract() 函數(shù)提取“l(fā)ove”這個(gè)詞
df['love'] = df['text'].str.extract(r'(\w+)\s(\w+)')
# Check the DataFrame
print(df)
這將產(chǎn)生以下輸出:
text love
0 I love cats! love
1 Dogs are the best NaN
2 I love dogs and cats love
5、另一個(gè)有用的函數(shù)是split()
此函數(shù)可用于根據(jù)指定的分隔符將文本拆分為多個(gè)部分。 split() 函數(shù)返回從原始文本中拆分出來(lái)的子字符串列表。 讓我們看一個(gè)例子:
import pandas as pd
#創(chuàng)建示例 DataFrame
df = pd.DataFrame({'text': ['I love cats!', 'Dogs are the best', 'I love dogs and cats']})
# 使用 split() 函數(shù)將文本拆分為單詞
df['text'] = df['text'].str.split()
# Check the DataFrame
print(df
這將產(chǎn)生以下輸出:
text
0 [I, love, cats!]
1 [Dogs, are, the, best]
2 [I, love, dogs, and, cats]
如您所見(jiàn),split() 函數(shù)已將文本拆分為單詞并返回子字符串列表。
6、去除標(biāo)點(diǎn)符號(hào)和特殊字符
在文本數(shù)據(jù)中,我們經(jīng)常會(huì)有很多與分析無(wú)關(guān)的標(biāo)點(diǎn)符號(hào)和特殊字符。 要?jiǎng)h除它們,我們可以使用 str.translate() 方法和 str.maketrans() 方法。
import string
#創(chuàng)建特殊字符和標(biāo)點(diǎn)符號(hào)到 None 的映射
translator = str.maketrans("", "", string.punctuation)
# 將翻譯器應(yīng)用于文本列
df["text"] = df["text"].str.translate(translator)
7、刪除停用詞
停用詞是對(duì)文本意義不大的常用詞,通常會(huì)被刪除以簡(jiǎn)化分析。 要?jiǎng)h除停用詞,我們可以使用 nltk 庫(kù)。
import nltk
from nltk.corpus import stopwords
# 下載停用詞語(yǔ)料庫(kù)
nltk.download("stopwords")
# 獲取停用詞列表
stop_words = set(stopwords.words("english"))
# 從文本列中刪除停用詞
df["text"] = df["text"].apply(lambda x: " ".join([word for word in x.split() if word not in stop_words]))
8、對(duì)文本進(jìn)行詞干化或詞形還原
詞干提取和詞形還原是兩種重要的 NLP 技術(shù),用于將單詞簡(jiǎn)化為基本形式。 它們有助于簡(jiǎn)化文本數(shù)據(jù)并使其更易于分析。
詞干提取是將單詞簡(jiǎn)化為基本形式或詞根形式的過(guò)程。 它涉及刪除詞的后綴或詞尾以得到詞根。 例如,“running”、“runner”和“ran”都使用詞干提取法簡(jiǎn)化為詞根形式“run”。
另一方面,詞形還原是使用基于字典的方法將單詞簡(jiǎn)化為基本形式的過(guò)程。 與詞干提取不同,詞形還原考慮單詞的上下文并將它們映射到最有意義的基本形式。 例如,“running”將簡(jiǎn)化為“run”,“is”將簡(jiǎn)化為“be”。
詞干提取和詞形還原都有各自的優(yōu)點(diǎn)和缺點(diǎn),它們之間的選擇取決于用例。 詞干化更快更簡(jiǎn)單,但詞形還原更準(zhǔn)確并產(chǎn)生更有意義的基本形式。
要在 Pandas 中對(duì)文本進(jìn)行詞干化或詞形還原,我們可以使用 nltk 庫(kù)。 以下是如何使用 nltk 執(zhí)行詞干提取的示例:
import nltk
from nltk.stem import PorterStemmer
# 初始化詞干分析器
stemmer = PorterStemmer()
# 定義一個(gè)函數(shù)來(lái)阻止文本
def stem_text(text):
return ' '.join([stemmer.stem(word) for word in text.split()])
# 將詞干提取功能應(yīng)用于文本列
df['text_stemmed'] = df['text'].apply(stem_text)
以下是如何使用 nltk 執(zhí)行詞形還原的示例:
import nltk
from nltk.stem import WordNetLemmatizer
#初始化詞形還原器
lemmatizer = WordNetLemmatizer()
# 定義一個(gè)函數(shù)來(lái)對(duì)文本進(jìn)行詞形還原
def lemmatize_text(text):
return ' '.join([lemmatizer.lemmatize(word) for word in text.split()])
# 將詞形還原函數(shù)應(yīng)用于文本列
df['text_lemmatized'] = df['text'].apply(lemmatize_text)
在這兩種情況下,詞干化或詞形化的文本都存儲(chǔ)在數(shù)據(jù)框中的新列中。 這個(gè)新列可用于進(jìn)一步分析或建模。