รูปภาพโดยบรรณาธิการ
ด้วยความสนใจที่เพิ่มขึ้นในการประมวลผลภาษาธรรมชาติ ผู้ปฏิบัติงานจำนวนมากขึ้นเรื่อยๆ ประสบปัญหาไม่ใช่เพราะพวกเขาไม่สามารถสร้างหรือปรับแต่ง LLM ได้ แต่เป็นเพราะข้อมูลของพวกเขายุ่งเหยิง!
เราจะแสดงขั้นตอนการเข้ารหัสที่เรียบง่ายแต่มีประสิทธิภาพมากสำหรับการแก้ไขป้ายที่มีเสียงดังในข้อมูลข้อความ เราจะจัดการกับ 2 สถานการณ์ทั่วไปในข้อมูลข้อความจริง:
- มีหมวดหมู่ที่มีตัวอย่างผสมจากหมวดหมู่อื่นสองสามหมวดหมู่ ฉันชอบเรียกหมวดหมู่ประเภทนี้ว่าหมวดหมู่เมตา
- การมี 2 หมวดขึ้นไปที่ควรรวมเป็น 1 หมวด เนื่องจากข้อความที่อยู่ในหมวดนั้นอ้างอิงถึงหัวข้อเดียวกัน
เราจะใช้ชุดข้อมูล ITSM (IT Service Management) ที่สร้างขึ้นสำหรับบทช่วยสอนนี้ (ใบอนุญาต CCO) มีอยู่ใน Kaggle จากลิงค์ด้านล่าง:
https://www.kaggle.com/datasets/nikolagreb/small-itsm-dataset
ถึงเวลาที่จะเริ่มต้นด้วยการนำเข้าไลบรารีทั้งหมดที่จำเป็นและการตรวจสอบข้อมูลพื้นฐาน เตรียมตัวให้พร้อม รหัสกำลังมา!
import pandas as pd
import numpy as np
import string from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import ComplementNB
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn import metrics df = pd.read_excel("ITSM_data.xlsx")
df.info()
RangeIndex: 118 entries, 0 to 117
Data columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID_request 118 non-null int64 1 Text 117 non-null object 2 Category 115 non-null object 3 Solution 115 non-null object 4 Date_request_recieved 118 non-null datetime64[ns] 5 Date_request_solved 118 non-null datetime64[ns] 6 ID_agent 118 non-null int64 dtypes: datetime64[ns](2), int64(2), object(3)
memory usage: 6.6+ KB
แต่ละแถวแสดงถึงหนึ่งรายการในฐานข้อมูล ITSM เราจะพยายามทำนายประเภทของตั๋วตามข้อความของตั๋วที่เขียนโดยผู้ใช้ เรามาเจาะลึกลงไปในฟิลด์ที่สำคัญที่สุดสำหรับกรณีการใช้งานทางธุรกิจที่อธิบายไว้
for text, category in zip(df.Text.sample(3, random_state=2), df.Category.sample(3, random_state=2)): print("TEXT:") print(text) print("CATEGORY:") print(category) print("-"*100)
TEXT:
I just want to talk to an agent, there are too many problems on my pc to be explained in one ticket. Please call me when you see this, whoever you are. (talk to agent)
CATEGORY:
Asana
----------------------------------------------------------------------------------------------------
TEXT:
Asana funktionierte nicht mehr, nachdem ich meinen Laptop neu gestartet hatte. Bitte helfen Sie.
CATEGORY:
Help Needed
----------------------------------------------------------------------------------------------------
TEXT:
My mail stopped to work after I updated Windows.
CATEGORY:
Outlook
----------------------------------------------------------------------------------------------------
หากเราดูที่ตั๋วสองใบแรก แม้ว่าตั๋วใบหนึ่งจะเป็นภาษาเยอรมัน เราจะเห็นว่าปัญหาที่อธิบายนั้นอ้างถึงซอฟต์แวร์เดียวกัน?—?Asana แต่มีป้ายกำกับต่างกัน นี่คือการเริ่มต้นการแจกจ่ายหมวดหมู่ของเรา:
df.Category.value_counts(normalize=True, dropna=False).mul(100).round(1).astype(str) + "%"
Outlook 19.1%
Discord 13.9%
CRM 12.2%
Internet Browser 10.4%
Mail 9.6%
Keyboard 9.6%
Asana 8.7%
Mouse 8.7%
Help Needed 7.8%
Name: Category, dtype: object
ความช่วยเหลือที่จำเป็นดูน่าสงสัย เช่น หมวดหมู่ที่สามารถมีตั๋วจากหมวดหมู่อื่นๆ ได้หลายหมวดหมู่ นอกจากนี้ หมวดหมู่ของ Outlook และ Mail ยังคล้ายกัน บางทีควรรวมเป็นหมวดหมู่เดียว ก่อนที่จะลงลึกในหมวดหมู่ที่กล่าวถึง เราจะกำจัดค่าที่ขาดหายไปในคอลัมน์ที่เราสนใจ
important_columns = ["Text", "Category"]
for cat in important_columns: df.drop(df[df[cat].isna()].index, inplace=True)
df.reset_index(inplace=True, drop=True)
ไม่มีสิ่งทดแทนที่ถูกต้องสำหรับการตรวจสอบข้อมูลด้วยตาเปล่า ฟังก์ชันแฟนซีที่จะทำในแพนด้าคือ .sample() ดังนั้นเราจะทำอย่างนั้นอีกครั้ง ตอนนี้สำหรับหมวดหมู่ที่น่าสงสัย:
meta = df[df.Category == "Help Needed"] for text in meta.Text.sample(5, random_state=2): print(text) print("-"*100)
Discord emojis aren't available to me, I would like to have this option enabled like other team members have.
---------------------------------------------------------------------------
Bitte reparieren Sie mein Hubspot CRM. Seit gestern funktioniert es nicht mehr
---------------------------------------------------------------------------
My headphones aren't working. I would like to order new.
---------------------------------------------------------------------------
Bundled problems with Office since restart:
Messages not sent
Outlook does not connect, mails do not arrive
Error 0x8004deb0 appears when Connection attempt, see attachment
The company account is affected: AB123
Access via Office.com seems to be possible.
---------------------------------------------------------------------------
Asana funktionierte nicht mehr, nachdem ich meinen Laptop neu gestartet hatte. Bitte helfen Sie.
---------------------------------------------------------------------------
แน่นอนว่าเรามีตั๋วที่พูดถึง Discord, Asana และ CRM ดังนั้นควรเปลี่ยนชื่อหมวดหมู่จาก "ต้องการความช่วยเหลือ" เป็นหมวดหมู่ที่มีอยู่และเจาะจงมากขึ้น สำหรับขั้นตอนแรกของกระบวนการกำหนดใหม่ เราจะสร้างคอลัมน์ใหม่ "คำหลัก" ซึ่งจะให้ข้อมูลหากตั๋วมีคำจากรายการหมวดหมู่ในคอลัมน์ "ข้อความ"
words_categories = np.unique([word.strip().lower() for word in df.Category]) # list of categories def keywords(row): list_w = [] for word in row.translate(str.maketrans("", "", string.punctuation)).lower().split(): if word in words_categories: list_w.append(word) return list_w df["Keywords"] = df.Text.apply(keywords) # since our output is in the list, this function will give us better looking final output. def clean_row(row): row = str(row) row = row.replace("[", "") row = row.replace("]", "") row = row.replace("'", "") row = string.capwords(row) return row df["Keywords"] = df.Keywords.apply(clean_row)
นอกจากนี้ โปรดทราบว่าการใช้ “if word in str(words_categories)” แทน “if word in word_categories” จะจับคำจากหมวดหมู่ที่มีมากกว่า 1 คำ (Internet Browser ในกรณีของเรา) แต่ก็ต้องมีการประมวลผลข้อมูลล่วงหน้ามากขึ้นด้วย เพื่อให้ทุกอย่างเรียบง่ายและตรงประเด็น เราจะใช้โค้ดสำหรับหมวดหมู่ที่สร้างจากคำเพียงคำเดียว นี่คือลักษณะของชุดข้อมูลของเราในตอนนี้:
df.head(2)
ออกมาเป็นภาพ:
หลังจากแยกคอลัมน์คำหลัก เราจะถือว่าคุณภาพของตั๋ว สมมติฐานของเรา:
- ตั๋วที่มีคีย์เวิร์ดเพียง 1 คำในช่องข้อความซึ่งตรงกับหมวดหมู่ของตั๋วนั้นจะทำให้ง่ายต่อการจัดประเภท
- ตั๋วที่มีคำหลักหลายคำในช่องข้อความ โดยที่คำหลักอย่างน้อยหนึ่งคำนั้นเหมือนกับหมวดหมู่ของตั๋วที่จะจัดประเภทได้ง่ายในกรณีส่วนใหญ่
- ตั๋วที่มีคำหลัก แต่ไม่มีคำใดที่เท่ากับชื่อหมวดหมู่ของตั๋วนั้นอาจเป็นกล่องป้ายที่มีเสียงดัง
- ตั๋วอื่นๆ เป็นกลางตามคีย์เวิร์ด
cl_list = [] for category, keywords in zip(df.Category, df.Keywords): if category.lower() == keywords.lower() and keywords != "": cl_list.append("easy_classification") elif category.lower() in keywords.lower(): # to deal with multiple keywords in the ticket cl_list.append("probably_easy_classification") elif category.lower() != keywords.lower() and keywords != "": cl_list.append("potential_problem") else: cl_list.append("neutral") df["Ease_classification"] = cl_list
df.Ease_classification.value_counts(normalize=True, dropna=False).mul(100).round(1).astype(str) + "%"
neutral 45.6%
easy_classification 37.7%
potential_problem 9.6%
probably_easy_classification 7.0%
Name: Ease_classification, dtype: object
เราทำการกระจายใหม่และตอนนี้เป็นเวลาตรวจสอบตั๋วที่จัดว่าเป็นปัญหาที่อาจเกิดขึ้น ในทางปฏิบัติ ขั้นตอนต่อไปนี้ต้องการการสุ่มตัวอย่างมากขึ้นและดูข้อมูลจำนวนมากขึ้นด้วยตาเปล่า แต่เหตุผลจะเหมือนกัน คุณควรค้นหาตั๋วที่มีปัญหาและตัดสินใจว่าคุณสามารถปรับปรุงคุณภาพตั๋วหรือคุณควรทิ้งตั๋วจากชุดข้อมูลหรือไม่ เมื่อคุณเผชิญกับชุดข้อมูลขนาดใหญ่ ใจเย็นๆ และอย่าลืมว่าการตรวจสอบข้อมูลและการเตรียมข้อมูลมักจะใช้เวลามากกว่าการสร้างอัลกอริทึม ML!
pp = df[df.Ease_classification == "potential_problem"] for text, category in zip(pp.Text.sample(5, random_state=2), pp.Category.sample(3, random_state=2)): print("TEXT:") print(text) print("CATEGORY:") print(category) print("-"*100)
TEXT:
outlook issue , I did an update Windows and I have no more outlook on my notebook ? Please help !
Outlook
CATEGORY:
Mail
-------------------------------------------------------------------- TEXT:
Please relase blocked attachements from the mail I got from name.surname@company.com. These are data needed for social media marketing campaing.
CATEGORY:
Outlook
--------------------------------------------------------------------
TEXT:
Asana funktionierte nicht mehr, nachdem ich meinen Laptop neu gestartet hatte. Bitte helfen Sie.
CATEGORY:
Help Needed
--------------------------------------------------------------------
เราเข้าใจว่าตั๋วจากหมวดหมู่ Outlook และ Mail เกี่ยวข้องกับปัญหาเดียวกัน ดังนั้นเราจะรวม 2 หมวดหมู่นี้เข้าด้วยกันและปรับปรุงผลลัพธ์ของอัลกอริทึมการจัดประเภท ML ในอนาคตของเรา
mail_categories_to_merge = ["Outlook", "Mail"] sum_mail_cluster = 0
for x in mail_categories_to_merge: sum_mail_cluster += len(df[df["Category"] == x]) print("Number of categories to be merged into new cluster: ", len(mail_categories_to_merge))
print("Expected number of tickets in the new cluster: ", sum_mail_cluster) def rename_to_mail_cluster(category): if category in mail_categories_to_merge: category = "Mail_CLUSTER" else: category = category return category df["Category"] = df["Category"].apply(rename_to_mail_cluster) df.Category.value_counts()
Number of categories to be merged into new cluster: 2
Expected number of tickets in the new cluster: 33
Mail_CLUSTER 33
Discord 15
CRM 14
Internet Browser 12
Keyboard 11
Asana 10
Mouse 10
Help Needed 9
Name: Category, dtype: int64
สุดท้ายแต่ไม่ท้ายสุด เราต้องการติดป้ายกำกับตั๋วใหม่จากหมวดหมู่เมตา “ต้องการความช่วยเหลือ” เป็นหมวดหมู่ที่เหมาะสม
df.loc[(df["Category"] == "Help Needed") & ([set(x).intersection(words_categories) for x in df["Text"].str.lower().str.replace("[^ws]", "", regex=True).str.split()]), "Category"] = "Change" def cat_name_change(cat, keywords): if cat == "Change": cat = keywords else: cat = cat return cat df["Category"] = df.apply(lambda x: cat_name_change(x.Category, x.Keywords), axis=1)
df["Category"] = df["Category"].replace({"Crm":"CRM"}) df.Category.value_counts(dropna=False)
Mail_CLUSTER 33
Discord 16
CRM 15
Internet Browser 12
Asana 11
Keyboard 11
Mouse 10
Help Needed 6
Name: Category, dtype: int64
เราได้ทำการติดฉลากข้อมูลใหม่และทำความสะอาด แต่เราไม่ควรเรียกตัวเองว่านักวิทยาศาสตร์ข้อมูลหากเราไม่ได้ทำการทดลองทางวิทยาศาสตร์อย่างน้อยหนึ่งครั้งและทดสอบผลกระทบของงานของเราในการจำแนกขั้นสุดท้าย เราจะทำเช่นนั้นโดยใช้ตัวแยกประเภท The Complement Naive Bayes ใน sklearn อย่าลังเลที่จะลองใช้อัลกอริทึมอื่นๆ ที่ซับซ้อนกว่านี้ นอกจากนี้ โปรดทราบว่าสามารถล้างข้อมูลเพิ่มเติมได้ เช่น เราสามารถทิ้งตั๋วทั้งหมดที่เหลืออยู่ในหมวด "ต้องการความช่วยเหลือ"
model = make_pipeline(TfidfVectorizer(), ComplementNB()) # old df
df_o = pd.read_excel("ITSM_data.xlsx") important_categories = ["Text", "Category"]
for cat in important_categories: df_o.drop(df_o[df_o[cat].isna()].index, inplace=True) df_o.name = "dataset just without missing"
df.name = "dataset after deeper cleaning" for dataframe in [df_o, df]: # Split dataset into training set and test set X_train, X_test, y_train, y_test = train_test_split(dataframe.Text, dataframe.Category, test_size=0.2, random_state=1) # Training the model with train data model.fit(X_train, y_train) # Predict the response for test dataset y_pred = model.predict(X_test) print(f"Accuracy of Complement Naive Bayes classifier model on {dataframe.name} is: {round(metrics.accuracy_score(y_test, y_pred),2)}")
Accuracy of Complement Naive Bayes classifier model on dataset just without missing is: 0.48
Accuracy of Complement Naive Bayes classifier model on dataset after deeper cleaning is: 0.65
น่าประทับใจใช่มั้ย? ชุดข้อมูลที่เราใช้มีขนาดเล็ก (ตามวัตถุประสงค์ เพื่อให้คุณสามารถดูสิ่งที่เกิดขึ้นในแต่ละขั้นตอนได้อย่างง่ายดาย) ดังนั้นเมล็ดสุ่มที่แตกต่างกันอาจให้ผลลัพธ์ที่แตกต่างกัน แต่ในกรณีส่วนใหญ่ แบบจำลองจะทำงานได้ดีขึ้นอย่างมากในชุดข้อมูลหลังจากล้างข้อมูลเมื่อเปรียบเทียบกัน ไปยังชุดข้อมูลเดิม เราทำได้ดีมาก!
นิโคลา เกร็บ เขียนโค้ดมากว่าสี่ปี และในช่วงสองปีที่ผ่านมา เขาเชี่ยวชาญด้าน NLP ก่อนหันมาทำงานด้านวิทยาศาสตร์ข้อมูล เขาประสบความสำเร็จในด้านการขาย ทรัพยากรบุคคล การเขียน และหมากรุก
- เนื้อหาที่ขับเคลื่อนด้วย SEO และการเผยแพร่ประชาสัมพันธ์ รับการขยายวันนี้
- เพลโตบล็อคเชน Web3 Metaverse ข่าวกรอง ขยายความรู้. เข้าถึงได้ที่นี่.
- การสร้างอนาคตโดย Adryenn Ashley เข้าถึงได้ที่นี่.
- ที่มา: https://www.kdnuggets.com/2023/04/dealing-noisy-labels-text-data.html?utm_source=rss&utm_medium=rss&utm_campaign=dealing-with-noisy-labels-in-text-data
- :มี
- :เป็น
- :ไม่
- :ที่ไหน
- 1
- 10
- 100
- 11
- 2%
- 7
- 8
- 9
- a
- เกี่ยวกับเรา
- ลงชื่อเข้าใช้
- ความถูกต้อง
- หลังจาก
- ตัวแทน
- ขั้นตอนวิธี
- อัลกอริทึม
- ทั้งหมด
- ด้วย
- แม้ว่า
- an
- และ
- เป็น
- AS
- At
- ใช้ได้
- ตาม
- ขั้นพื้นฐาน
- BE
- เพราะ
- รับ
- ก่อน
- ด้านล่าง
- ดีกว่า
- ที่ถูกบล็อก
- เบราว์เซอร์
- สร้าง
- การก่อสร้าง
- ธุรกิจ
- แต่
- by
- โทรศัพท์
- CAN
- พกพา
- กรณี
- กรณี
- แมว
- จับ
- หมวดหมู่
- หมวดหมู่
- เปลี่ยนแปลง
- หมากรุก
- การจัดหมวดหมู่
- จัด
- แยกประเภท
- การทำความสะอาด
- Cluster
- รหัส
- การเข้ารหัส
- คอลัมน์
- คอลัมน์
- COM
- ร่วมกัน
- บริษัท
- เมื่อเทียบกับ
- ส่วนประกอบ
- ซับซ้อน
- เชื่อมต่อ
- การเชื่อมต่อ
- มี
- ได้
- สร้าง
- ที่สร้างขึ้น
- CRM
- ข้อมูล
- การเตรียมข้อมูล
- วิทยาศาสตร์ข้อมูล
- ฐานข้อมูล
- จัดการ
- การซื้อขาย
- ตัดสินใจ
- ลึก
- อธิบาย
- DID
- ต่าง
- บาดหมางกัน
- การกระจาย
- do
- สวม
- หล่น
- แต่ละ
- อย่างง่ายดาย
- มีประสิทธิภาพ
- เปิดการใช้งาน
- การเข้า
- อีเธอร์ (ETH)
- เผง
- ตัวอย่าง
- ตัวอย่าง
- ที่มีอยู่
- ที่คาดหวัง
- การทดลอง
- อธิบาย
- ตา
- หันหน้าไปทาง
- สองสาม
- สนาม
- สาขา
- สุดท้าย
- หา
- ชื่อจริง
- ดังต่อไปนี้
- สำหรับ
- สี่
- ฟรี
- ราคาเริ่มต้นที่
- ฟังก์ชัน
- ต่อไป
- อนาคต
- ภาษาเยอรมัน
- ได้รับ
- ให้
- จะช่วยให้
- Go
- ดี
- ที่เกิดขึ้น
- มี
- he
- หูฟัง
- ช่วย
- กดปุ่ม
- สรุป ความน่าเชื่อถือของ Olymp Trade?
- hr
- HTTPS
- HubSpot
- i
- ภาพ
- ส่งผลกระทบ
- การดำเนินการ
- นำเข้า
- สำคัญ
- ประทับใจ
- ปรับปรุง
- in
- ดัชนี
- ข้อมูล
- แทน
- อยากเรียนรู้
- อินเทอร์เน็ต
- เข้าไป
- ปัญหา
- IT
- บริการไอที
- เพียงแค่
- แค่หนึ่ง
- KD นักเก็ต
- เก็บ
- ชนิด
- ฉลาก
- ป้ายกำกับ
- ภาษา
- แล็ปท็อป
- ใหญ่
- ที่มีขนาดใหญ่
- ห้องสมุด
- License
- กดไลก์
- LINK
- รายการ
- ดู
- ที่ต้องการหา
- LOOKS
- ความรัก
- ทำ
- ส่วนใหญ่
- การจัดการ
- หลาย
- การตลาด
- ภาพบรรยากาศ
- สมาชิก
- หน่วยความจำ
- กล่าวถึง
- ผสาน
- Meta
- ตัวชี้วัด
- อาจ
- หายไป
- ผสม
- ML
- แบบ
- ข้อมูลเพิ่มเติม
- มากที่สุด
- หลาย
- ชื่อ
- โดยธรรมชาติ
- ภาษาธรรมชาติ
- ประมวลผลภาษาธรรมชาติ
- จำเป็น
- เป็นกลาง
- ใหม่
- NLP
- สมุดบันทึก
- ตอนนี้
- จำนวน
- มึน
- วัตถุ
- of
- Office
- เก่า
- on
- ONE
- ตัวเลือกเสริม (Option)
- or
- ใบสั่ง
- เป็นต้นฉบับ
- อื่นๆ
- ของเรา
- Outlook
- เอาท์พุต
- หมีแพนด้า
- อดีต
- PC
- ดำเนินการ
- ท่อ
- เพลโต
- เพลโตดาต้าอินเทลลิเจนซ์
- เพลโตดาต้า
- กรุณา
- จุด
- เป็นไปได้
- ที่มีศักยภาพ
- การปฏิบัติ
- คาดการณ์
- อาจ
- ปัญหา
- ปัญหาที่เกิดขึ้น
- ขั้นตอน
- กระบวนการ
- การประมวลผล
- ก่อ
- เหมาะสม
- วัตถุประสงค์
- คุณภาพ
- สุ่ม
- โลกแห่งความจริง
- ที่เกี่ยวข้อง
- แสดงให้เห็นถึง
- ต้องการ
- คำตอบ
- ผลสอบ
- กลับ
- กำจัด
- ที่เพิ่มขึ้น
- แถว
- ขาย
- เดียวกัน
- สถานการณ์
- วิทยาศาสตร์
- นักวิทยาศาสตร์
- เห็น
- เมล็ด
- ดูเหมือนว่า
- บริการ
- ชุด
- น่า
- โชว์
- อย่างมีความหมาย
- คล้ายคลึงกัน
- ง่าย
- ตั้งแต่
- เล็ก
- So
- สังคม
- โซเชียลมีเดีย
- ซอฟต์แวร์
- ทางออก
- บาง
- เสียง
- เฉพาะ
- โดยเฉพาะ
- แยก
- เริ่มต้น
- ที่เริ่มต้น
- เข้าพัก
- ขั้นตอน
- หยุด
- ตรง
- เชือก
- ที่ประสบความสำเร็จ
- ควร
- พิรุธ
- เอา
- คุย
- การพูดคุย
- ทีม
- สมาชิกในทีม
- ทดสอบ
- กว่า
- ที่
- พื้นที่
- ข้อมูล
- ของพวกเขา
- พวกเขา
- ที่นั่น
- ล้อยางขัดเหล่านี้ติดตั้งบนแกน XNUMX (มม.) ผลิตภัณฑ์นี้ถูกผลิตในหลายรูปทรง และหลากหลายเบอร์ความแน่นหนาของปริมาณอนุภาคขัดของมัน จะทำให้ท่านได้รับประสิทธิภาพสูงในการขัดและการใช้งานที่ยาวนาน
- พวกเขา
- สิ่ง
- นี้
- ตั๋ว
- บัตรเข้าชม
- เวลา
- ไปยัง
- เกินไป
- หัวข้อ
- รวม
- รถไฟ
- การฝึกอบรม
- การหมุน
- เกี่ยวกับการสอน
- เข้าใจ
- บันทึก
- ให้กับคุณ
- us
- การใช้
- ใช้
- มือสอง
- ผู้ใช้งาน
- การใช้
- มักจะ
- ความคุ้มค่า
- กว้างใหญ่
- มาก
- ผ่านทาง
- ผนัง
- คือ
- we
- อะไร
- เมื่อ
- ที่
- ใครก็ได้
- จะ
- หน้าต่าง
- กับ
- ไม่มี
- คำ
- คำ
- งาน
- การทำงาน
- จะ
- การเขียน
- เขียน
- X
- ปี
- เธอ
- ด้วยตัวคุณเอง
- ลมทะเล