iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
AI & Data

Fast ai 30天系列 第 21

美國專利片語相似度大賽(二)EDA

  • 分享至 

  • xImage
  •  

其實8堂課上完,還是很多東西不太懂,似懂非懂。
有看過書,但他的書也跟他講的課一樣,突然就會飛進來一小節額外的內容
就像前一陣講怎麼玩minst影像,突然就會插進來額外的:彩色影像處理
但minst 是黑白的阿…突然跟我講彩色影像怎麼處理…
所以總結,看他的書之前,需要有基礎
看他的課(影片)之前,需要看過他的書

這樣才能「比較」理解他在做什麼
所以他標榜的有點不實😆😆😆 課程應該是給有經驗的人上的才對。

那我就想藉由第4課的美國專利片語相似度大賽開始
因為第四課只是讓我們知道「nlp」是怎麼一回事,並沒有好好打比賽
雖然講師留了一個更精進的notebook,但是對於上了四堂課的人來說,其實是看不太懂的。

所以我預計看幾篇比較多人投票的筆記,來好好研究一下這個比賽要怎麼打。

所謂知己知彼,百戰百勝?

要想打好比賽,資料的認識應該要更完整。
在前幾天美國專利片語相似度大賽的筆記中,我已經分享了一些講師用到的EDA,
今天就來分享另一名網友的EDA,看看他是怎麼分析資料的。


一開始他分享了什麼是皮爾森相關係數的公式,這個寫得很好,但是沒人想看,
因為直接call library就可以幫忙算了XD

所以焦點放在其他部份

以下分三個部份討論:片語1(anchor)、片語2(target)、分類編號(context)

這邊劇透一下,他的context 是有專門去查專利(CPC classification (version 2021.05))的內容,所以不再是沒文字意義的編號了!

資料總述

這邊講師直接是用summary,但是這位網友提供了infoisnull 也不錯
info() 的資訊其實kaggle 頁面就有,但是我們用程式看的話,還是要學一下
isnull 顧名思義就是找有沒有缺失值,這個在鐵達尼的資料中就有缺失值,所以保持習慣檢查也是必要的。
https://ithelp.ithome.com.tw/upload/images/20231006/20110579PYFIDCo4On.png

檢查完缺失值,就檢查有沒有重複值

train_df[train_df.drop("id", axis = 1).duplicated()]

這個技巧也蠻重要
結果是沒有重複值,也沒有缺失值。
所以這邊網友沒有用summary ,這個是我們之前上課用的,可以觀看各資料頻率

以下就來看看各資料屬性

anchor

來看看這作者有哪些花招

計算有多少種anchor(多少個unique的值)

print(f"Number of uniques values in ANCHOR column: {colored(train_df.anchor.nunique(), 'yellow')}")

#output is Number of uniques values in ANCHOR column: 733

這邊用了train_df.anchor.nunique() 來計算有多少種anchor ,也就是重複的不計算,
一共有 733 種anchor

接下來想看一下都是哪些anchor

https://ithelp.ithome.com.tw/upload/images/20231006/201105790oMRUJAlp8.png

查詢欄位是句包含…

如果想要查
"anchor" 欄位的值必須為 "component composite coating"。
"target" 欄位中必須包含字串 'base'。
則程式如下

pattern = 'base'
mask = train_df['target'].str.contains(pattern, case=False, na=False)
train_df.query("anchor =='component composite coating'")[mask]

https://ithelp.ithome.com.tw/upload/images/20231006/20110579viOBwl0Lfu.png

這邊就可以看到同樣的anchor ,不同的target 的得分有所不同

然後還花俏的展示了文字雲,但我覺得不必要。

統計一下每個欄位有多少詞

這個比較實用一些,我們看一下怎麼寫

train_df['anchor_len'] = train_df['anchor'].str.split().str.len()

print(f"Anchors with maximum lenght of 5: \n{colored(train_df.query('anchor_len == 5')['anchor'].unique(), 'yellow')}")
print(f"\nAnchors with maximum lenght of 4: \n{colored(train_df.query('anchor_len == 4')['anchor'].unique(), 'green')}")

其實他會這樣寫就表示他已經跑過程式,知道最多5個詞
所以第一行他新建了一個欄位'anchor_len',是用anchor這個欄位做空格分隔,然後計算長度,但這邊比較特別的是
.str.len():這是計算每個文本值(經過分割後的單詞列表)的長度,也就是詞的數量,然後返回一個列表
https://ithelp.ithome.com.tw/upload/images/20231006/20110579T3CV2GY77b.png

畫直方圖

我們可以用剛才算好的詞數量,來畫直方圖,看看分佈情況

train_df.anchor_len.hist(orientation='horizontal', color='#FFCF56')

https://ithelp.ithome.com.tw/upload/images/20231006/20110579Tv0Avs5eVd.png

所以看得出來最多5個詞,但2個詞的佔大多數(觀察到這個不知有什麼差?)

觀察欄位有無數字

雖然不知道數字有沒有影響,但是可以先看看

pattern = '[0-9]'
mask = train_df['anchor'].str.contains(pattern, na=False)
train_df['num_anchor'] = mask
train_df[mask]['anchor'].value_counts()

https://ithelp.ithome.com.tw/upload/images/20231006/20110579zcbOvayNXM.png

到此對anchor 觀察完畢,然後我們也會target做一樣的事

target

因為同anchor的方法 ,所以不贅述

context

這邊先去查專利的分類來源:https://en.wikipedia.org/wiki/Cooperative_Patent_Classification

作者還另外找到2個資料集
Cooperative Patent Classification (CPC) Data -> https://www.kaggle.com/datasets/bigquery/cpc
Cooperative Patent Classification Codes Meaning -> https://www.kaggle.com/datasets/xhlulu/cpc-codes

由Wiki可以知道這個分類的編號代表什麼意思

A: Human Necessities
B: Operations and Transport
C: Chemistry and Metallurgy
D: Textiles
E: Fixed Constructions
F: Mechanical Engineering
G: Physics
H: Electricity
Y: Emerging Cross-Sectional Technologies

可以知道前面的英文字母,叫做Section ,後面的編號,叫做class

所以這邊可以將他們拆開來,分別統計看看

train_df['section'] = train_df['context'].astype(str).str[0] #section
train_df['classes'] = train_df['context'].astype(str).str[1:] # class
train_df.head(10)

https://ithelp.ithome.com.tw/upload/images/20231006/20110579ZRSJ7RJGYn.png

不能免俗的要看算一下有幾種,雖然不知道有什麼用,可能要跟數據培養感情
https://ithelp.ithome.com.tw/upload/images/20231006/20110579o5AmSyNwoG.png

直方圖

這邊一樣做個直方圖,只是換掉欄位名稱~一個小技巧

di = {"A" : "A - Human Necessities", 
      "B" : "B - Operations and Transport",
      "C" : "C - Chemistry and Metallurgy",
      "D" : "D - Textiles",
      "E" : "E - Fixed Constructions",
      "F" : "F- Mechanical Engineering",
      "G" : "G - Physics",
      "H" : "H - Electricity",
      "Y" : "Y - Emerging Cross-Sectional Technologies"}

https://ithelp.ithome.com.tw/upload/images/20231006/20110579sxmFsstQzb.png

CPC 資料查詢

這邊是我覺得比較特別的了~因為有特別去查詢CPC資料,讓我們對於section 後面的數字應該會比較有感覺
例如A01,由wiki 查的資料只知道是Human Necessities,但不知道細部的是什麼,如果可以再細分的話,應該對於自然語言分析會更有幫助
根據注解的那個網址,我們可以找到這個notebook,裡面有教我們怎麼去query cpc 的資料

# Cooperative Patent Classification (CPC) Data -> https://www.kaggle.com/datasets/bigquery/cpc

cpc = bq_helper.BigQueryHelper(active_project="cpc", dataset_name="cpc")

def get_cpc_row(cpc_code):
    query = f"""
    SELECT * FROM `patents-public-data.cpc.definition` WHERE symbol="{cpc_code}";
    """
    response = cpc.query_to_pandas_safe(query)
    return response

get_cpc_row('A47')

https://ithelp.ithome.com.tw/upload/images/20231006/20110579kzGyI9tf2n.png

然後透由第二個資料集 https://www.kaggle.com/datasets/xhlulu/cpc-codes
,也可以查到「titles」,看來第二個資料集的titles 的品質較好一點

https://ithelp.ithome.com.tw/upload/images/20231006/20110579n0PpADYGor.png

所以我們把第二個資料集,拿來合併,希望是可以讓anchor, taget , titles ,這3個欄位來做NLP

# Let's join two datasets and add descriprion of context to our training DS

train_df['context_desc'] = train_df['context'].map(cpc_codes_df.set_index('code')['title']).str.lower()
train_df.to_csv("us-train.csv", index = False)
train_df.sample(10)

所以這2份資料可以合併,主要是我們的context ,跟第2份的code 相同,所以train_df['context'].map(cpc_codes_df.set_index('code')['title']):這一行 train_df 中的 'context' 列中的每個元素(CPC 代碼)映射到 cpc_codes_df 中 'code' 列對應的 'title' 列,這樣就可以把title 附加上去。

來看一下整理好的資料
https://ithelp.ithome.com.tw/upload/images/20231006/201105797GEPKjHCUS.png

所以從這篇筆記,可以學到要怎麼觀察資料,檢查資料,還有尋找資料。
這樣至少有一點進步了,明天再來看一篇比較多人推薦的建model的notebook


上一篇
CNN(三)補充處理彩色圖片的觀念
下一篇
美國專利片語相似度大賽(三)網友做法
系列文
Fast ai 30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言