做娛樂網站彩票代理重慶森林影評
文本情感分類(二):深度學習模型 - 科學空間|Scientific Spaces
一、代碼理解
cw = lambda x: list(jieba.cut(x)) #定義分詞函數
您給出的代碼定義了一個使用?jieba
?分詞庫的分詞函數。jieba
?是一個用于中文分詞的 Python 庫。該函數?cw
?是一個 lambda 函數,它接受一個字符串?x
?作為輸入,然后使用?jieba.cut(x)
?方法對字符串進行分詞,并返回一個分詞后的列表。
這里是該代碼的一個簡單解釋和如何使用它的例子:
首先,確保您已經安裝了?jieba
?庫。如果沒有,您可以使用 pip 來安裝它:
bash復制代碼
pip install jieba |
然后,您可以使用您定義的?cw
?函數來對中文文本進行分詞:
python復制代碼
import jieba | |
# 定義分詞函數 | |
cw = lambda x: list(jieba.cut(x)) | |
# 使用分詞函數 | |
text = "我來到北京清華大學" | |
words = cw(text) | |
print(words) # 輸出: ['我', '來到', '北京', '清華大學'] |
在上面的例子中,文本 "我來到北京清華大學" 被分詞成了 ['我', '來到', '北京', '清華大學']。
lambda 函數在這里是一個簡單的函數定義方式,對于簡單的函數,使用 lambda 可以使代碼更簡潔。但是,如果函數變得更加復雜,使用常規(guī)的?def
?語句來定義函數會更清晰和易于閱讀。例如:
python復制代碼
def cut_words(x): | |
return list(jieba.cut(x)) | |
# 使用該函數 | |
words = cut_words(text) | |
print(words) # 輸出: ['我', '來到', '北京', '清華大學'] |
這兩種定義方式(使用 lambda 和使用 def)在功能上是等效的。
2.
pn['words'] = pn[0].apply(cw)后pn的內容
3.
comment = comment[comment['rateContent'].notnull()]
DataFrame
?是 Pandas 庫中用于處理表格型數據的核心數據結構。以下是一些常用的?DataFrame
?操作:
- 創(chuàng)建 DataFrame
使用?pd.DataFrame()
?從字典、列表、Series、其他 DataFrame 或其他數據源創(chuàng)建 DataFrame。
python復制代碼
import pandas as pd | |
data = {'A': [1, 2, 3], 'B': [4, 5, 6]} | |
df = pd.DataFrame(data) |
- 查看 DataFrame
使用?head()
,?tail()
,?info()
,?describe()
,?shape
?等方法查看 DataFrame 的內容、結構或統(tǒng)計信息。
python復制代碼
print(df.head()) # 顯示前幾行 | |
print(df.info()) # 顯示摘要信息,包括列名、數據類型和非空值計數 | |
print(df.describe()) # 顯示數值列的統(tǒng)計信息 | |
print(df.shape) # 顯示行數和列數 |
- 選擇數據
使用列名、行標簽、條件表達式、布爾索引等選擇數據。
python復制代碼
print(df['A']) # 選擇列 A | |
print(df.iloc[0]) # 選擇第一行(基于整數位置) | |
print(df.loc[0]) # 選擇第一行(基于標簽) | |
print(df[df['A'] > 1]) # 選擇 A 列大于 1 的行 |
- 設置和修改數據
使用列名、行標簽或條件表達式設置或修改 DataFrame 中的值。
python復制代碼
df['C'] = df['A'] + df['B'] # 添加新列 C,其值為 A 和 B 列的和 | |
df.at[0, 'A'] = 10 # 修改第一行 A 列的值為 10 | |
df.loc[df['A'] > 1, 'B'] = 0 # 將 A 列大于 1 的行對應的 B 列值設置為 0 |
- 排序數據
使用?sort_values()
?方法按列值對 DataFrame 進行排序。
python復制代碼
df_sorted = df.sort_values(by='A') # 按列 A 的值排序 |
- 數據分組和聚合
使用?groupby()
?方法對數據進行分組,并使用聚合函數(如?sum()
,?mean()
,?count()
?等)對每個組進行計算。
python復制代碼
grouped = df.groupby('A').sum() # 按列 A 分組并計算每組的和 |
- 缺失值處理
使用?dropna()
,?fillna()
,?interpolate()
?等方法處理缺失值。
python復制代碼
df_cleaned = df.dropna() # 刪除包含缺失值的行 | |
df_filled = df.fillna(0) # 將缺失值替換為 0 |
- 合并和連接
使用?merge()
,?concat()
,?join()
?等方法合并或連接多個 DataFrame。
python復制代碼
df1 = pd.DataFrame({'key': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'], 'value': range(8)}) | |
df2 = pd.DataFrame({'key': ['B', 'B', 'A', 'A', 'B', 'A'], 'value2': range(6)}) | |
merged = pd.merge(df1, df2, on='key') # 基于 key 列合并 df1 和 df2 |
- 數據導出
使用?to_csv()
,?to_excel()
,?to_sql()
?等方法將 DataFrame 導出到 CSV 文件、Excel 文件、數據庫等。
python復制代碼
df.to_csv('output.csv', index=False) # 將 DataFrame 導出到 CSV 文件,不包含索引列 |
- 其他常用操作
- 重命名列:
df.rename(columns={'old_name': 'new_name'})
- 刪除列:
del df['column_name']
?或?df.drop(columns=['column_name'])
- 刪除行:
df.drop(index=labels_to_drop)
- 轉換數據類型:
df['column_name'] = df['column_name'].astype(new_type)
- 排序索引:
df.sort_index()
- 重置索引:
df.reset_index()
- 轉換日期和時間數據:
pd.to_datetime()
- 等等...
這句話的意思就是選取comment 里面rateContent列里面非空的數據重新賦值給comment
4.d2v_train = pd.concat([pn['words'], comment['words']], ignore_index = True)
pd.concat
?是 Pandas 庫中的一個函數,用于沿一條軸將多個 pandas 對象(如 Series、DataFrame)連接在一起。這個函數在處理多個 DataFrame 或 Series 時非常有用,尤其是當你需要將它們合并成一個更大的數據集時。
基本用法
- 連接 Series
假設你有兩個 Series:
python復制代碼
import pandas as pd | |
s1 = pd.Series(['A', 'B', 'C']) | |
s2 = pd.Series(['D', 'E', 'F']) | |
result = pd.concat([s1, s2]) |
這將把?s2
?連接到?s1
?的后面。
- 連接 DataFrame
你可以沿行(axis=0
)或列(axis=1
)連接 DataFrame。
沿行連接:
python復制代碼
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}) | |
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]}) | |
result = pd.concat([df1, df2], ignore_index=True) |
沿列連接:
python復制代碼
df3 = pd.DataFrame({'C': [9, 10], 'D': [11, 12]}) | |
result = pd.concat([df1, df3], axis=1) |
參數
- objs:要連接的 pandas 對象列表或字典。
- axis:默認為 0,表示沿行連接。如果為 1,則沿列連接。
- join:默認為 'outer',表示連接操作。對于 DataFrame,這可以是 'inner'(交集)或 'outer'(并集)。
- ignore_index:默認為 False。如果為 True,則忽略原始索引并生成一個新的整數索引。
- keys:對于分層索引,可以提供一個列表或數組作為連接鍵。
- ...:還有其他參數,但上述是最常用的。
注意事項
- 當連接 DataFrame 時,確保列名匹配(除非你使用?
join='outer'
?并希望保留不匹配的列)。 - 如果 DataFrame 的索引不同,但在連接時你想忽略它們并生成一個新的整數索引,請使用?
ignore_index=True
。 - 你可以使用字典來連接 DataFrame,其中字典的鍵將用作新的列級索引。例如:
pd.concat({'key1': df1, 'key2': df2}, axis=1)
。
5.dict = pd.DataFrame(pd.Series(w).value_counts())
步驟分解:
-
pd.Series(w)
: 這里假設?w
?是一個可迭代的對象(如列表),您正在將其轉換為一個 Pandas Series。如果?w
?已經是一個 Series,則這一步是多余的。 -
.value_counts()
: 對 Series 對象調用?value_counts()
?方法會計算每個唯一值出現(xiàn)的次數,并返回一個 Series,其中索引是唯一值,值是它們出現(xiàn)的次數。 -
pd.DataFrame(...)
: 接下來,您嘗試將這個 Series 轉換為一個 DataFrame。雖然這是技術上可行的,但通常當您只處理一個 Series(即一列數據)時,沒有必要將其轉換為 DataFrame。
6.dict['id']=list(range(1,len(dict)+1))
7.
pn['sent'] = pn['words'].apply(get_sent) #速度太慢
8.
x = np.array(list(pn['sent']))[::2] #訓練集
在您提供的代碼?x = np.array(list(pn['sent']))[::2]
?中,您正在對?pn['sent']
(假定它是一個Pandas Series、列表或其他可迭代對象)執(zhí)行幾個操作。下面是對這些操作的詳細解釋:
pn['sent']
:這部分代碼假定?pn
?是一個Pandas DataFrame,并且?'sent'
?是其中的一個列名。這個列可能包含文本數據、數字或其他任何類型的可迭代數據。list(pn['sent'])
:這里,您正在將?pn['sent']
?列轉換為Python列表。這通常是因為Pandas Series對象雖然可以像列表一樣迭代,但有時為了與其他Python庫或功能一起使用,您可能需要將其轉換為列表。np.array(...)
:使用NumPy庫的?array
?函數將列表轉換為一個NumPy數組。NumPy數組是優(yōu)化過的數據結構,用于存儲大量同類型數據,并提供高效的數值計算功能。[::2]
:這是一個切片操作,用于從NumPy數組中選取元素。具體來說,[::2]
?意味著從數組的開始到結束,每隔一個元素取一個。因此,如果原始數組是?[a, b, c, d, e]
,那么切片后的數組將是?[a, c, e]
。
最終,x
?將是一個NumPy數組,其中包含?pn['sent']
?列中每隔一個元素的值。
注意:這里有一個潛在的陷阱。如果?pn['sent']
?列中的元素是字符串(例如文本數據),那么將它們轉換為NumPy數組可能不會提供您期望的功能或性能優(yōu)勢,因為NumPy主要用于數值計算,而不是字符串處理。如果您的目標是處理文本數據,那么使用Pandas的字符串方法或Python的內置字符串功能可能更為合適。
總結:
蘇大神的思路是用jieba分詞,將詞匯分出。然后通過詞頻統(tǒng)計對分過的詞進行數字映射。然后這樣每一個句子就變成了一個長短不一的向量,再將向量裁切或增加為規(guī)定大小的長度。之后將裁切的向量與對于的二分類的標簽送入構造的網絡中訓練。訓練后統(tǒng)計準確度。
網絡第一層用embedding層來生成語義向量,向量長度為256維。第二層為LSTM層,第三層為Dropout層,第四層為Dense全連接層,第五層為激活層,激活函數為sigmoid二分類激活函數。
思考能否實現(xiàn)多分類細膩情感?喜怒哀樂?