Perfume(ν₯μ) κ³Ό TI Amo(μ¬λν΄) μ κ²°ν©
μ£Όμ : λΉ λ°μ΄ν° κΈ°λ° ν₯μ μΆμ² μ¬μ΄νΈ
κ°λ° κΈ°κ° : 2021.08.30 ~ 2021.10.08 [7μ£Ό]
5. μ¬μ΄νΈ λ μ΄μ΄μ λ° λμμΈ
νμλ€μ μ₯μ μ΄ νμ€νκ³ κ·Έ μ₯μ λ€μ΄ μ μ΄μ°λ¬μ§ νμ΄μμ΅λλ€. μ΄μ μ΄ λμΉλ κΆμ€μ° νμ, μ΄λ €μ΄ μ νμ κ°λ¦ΌκΈΈμμ νμ μ³μ μ νμ νλλ‘ λ¦¬λνλ μμ리 νμ, λ€λ₯Έ νμλ€μ μ견μ μ μ 리ν΄μ£Όλ μ μ§μ νμ, κΉλνκ² μ½λλ₯Ό 리ν©ν λ§ ν΄μ£Όλ μ‘μλ―Ό νμ, κΌΌκΌΌνκ² μλ‘μ΄ κΈ°μ μ μ 리ν΄μ£Όλ μ€μ§μ νμ κ·Έλ¦¬κ³ νλ‘ νΈμ λ°±μλλ₯Ό κ°λ¦¬μ§ μμ μν΅μ μ°½κ΅¬κ° λμ΄μ€ μ₯νμ νμκΉμ§ μ΄λ ν λͺ μλ‘μ λΆμ‘±ν¨μ ννμ§ μκ³ κ·Έ λΆμ‘±ν¨μ μ±μλκ° μ μλλ‘ μλ²½μ κ°κΉμ΄ νλ ₯μ νλ νμ΄μμ΅λλ€.
- κΆμ€μ°(FE) : λΉ λ°μ΄ν° μΆμ² μκ³ λ¦¬μ¦ κ΅¬ν / teller νμ΄μ§ ꡬν / μ¬μ΄νΈ λ°°ν¬ λ° CI/CD μμ
- μμ리(FE) : main, search, about νμ΄μ§ ꡬν / UCC μ μ / μ€κ° λ°ν
- μ‘μλ―Ό(FE) : social login/logout, detail, error, loading νμ΄μ§ ꡬν / Reduxλ₯Ό μ΄μ©ν μν κ΄λ¦¬
- μ μ§μ(BE) : ν₯μ 리μ€νΈ, ν₯μ κ²μ, ν₯μ μΈλΆ μ 보, μ΄λ¬μ ν₯μ ꡬν / μ΅μ’ λ°ν
- μ€μ§μ(BE) : social login/logout, λ§μ΄νμ΄μ§, ν₯μ μ’μμ, μ¬μ©μ μ·¨ν₯ νμ ꡬν / λ°μ΄ν° ν¬λ‘€λ§ λ° DB κ΄λ¦¬
- μ₯νμ (BE) : λΉ λ°μ΄ν° μΆμ² μκ³ λ¦¬μ¦ κ΅¬ν / μ¬μ©μ μ·¨ν₯ νμ ꡬν / λ°μ΄ν° ν¬λ‘€λ§ λ° DB κ΄λ¦¬ / AWS RDS
- κ³΅ν΅ μμ : νλ‘μ νΈ κΈ°ν λ° μλ£ μ 리 / λ°ν μλ£ μ€λΉ / μ€κ° λ°ν
λΉ λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ ν₯μλ₯Ό μΆμ²ν΄μ£Όλ μ¬μ΄νΈ
μ½λ‘λλ‘ μΈν μ λΆ λ°©μμ§μΉ¨μ λ°λΌ λ°±νμ μμλ μμ, μμ, μν₯ λ±μ κΈμ§νμΌλ©°, μ΄μ λ°λΌ νμ₯ν 맀μΆμ κ°μνμ§λ§ ν₯μ 맀μΆμ μ€νλ € λμ΄λ¬λ€. μ κ³μμλ νμ₯ λμ μμ μ ννν μ μλ μλ¨μΌλ‘ ν₯μκ° κ°κ΄λ°κ³ μλ κ²μΌλ‘ λ³΄κ³ μλ€. μ΄λ¬ν νλ¦μ λ° λ§μΆμ΄ μ¬μ©μμκ² μ΄μΈλ¦¬λ ν₯μλ₯Ό μΆμ²ν΄μ£Όλ μ¬μ΄νΈμ νμμ±μ λλΌκ³ PE' AMO νλ‘μ νΈλ₯Ό κΈ°ννκ² λμλ€.
- ν₯μλ₯Ό μ²μ ꡬ맀νλ €λ μ¬ν μ΄λ μμκ²λ λ§μ μ§μ μ₯λ²½μ΄ μλ€. μ°λ¦¬ μ¬μ΄νΈμμλ μ΄λ° μ§μ μ₯λ²½μ νλ¬Όκ³ κ°λ¨ν μ§λ¬Έμ ν΅ν΄ μ¬μ©μμ μ νΈλλ₯Ό νμ νκ³ κ·Έμ λ§λ ν₯μλ₯Ό μΆμ²ν΄μ€λ€.
- ν₯μλ κ°μ ν₯μ λΈλ€κ³ νλλΌλ ν¬ν¨λ λ ΈνΈλ€μ λ°λΌ μ ν λ€λ₯Έ ν₯κΈ°κ° λλ€. μ΄λ° λ¬Έμ λ‘ κ³ λ―Όμ νλ ꡬ맀μλ€μκ² μμ μ΄ μ¬μ©νλ ν₯μλ₯Ό κ²μνλ©΄ κ·Έ ν₯μμ κ°μ₯ λΉμ·ν ν₯μλ₯Ό μ°Ύμμ μΆμ²ν΄μ€λ€.
- ν₯μλ₯Ό μ²μ μ νλ μ¬μ©μλ€ μν ν₯μ μΆμ² κΈ°λ₯μΌλ‘ μ΄ 3κ°μ§μ ν₯μλ₯Ό μΆμ²νμ¬ μ€λ€.
- 6κ°μ κ°λ¨ν μ§λ¬Έμ ν΅ν΄ νν°λ§λ ν₯μλ€ μ€ 'μ’μμ' μκ° κ°μ₯ λμ ν₯μ νλλ₯Ό λ½μλΈ ν, μ΄ ν₯μμ κ°μ₯ μ μ¬λκ° λμ ν₯μ 2κ°λ₯Ό CBF(Content Based Filtering) μΆμ² μκ³ λ¦¬μ¦μ μ΄μ©νμ¬ μΆμΆνλ€. μ΄λ κ² μ νλ 3κ°μ ν₯μλ₯Ό μ¬μ©μμκ² μ΄μΈλ¦¬λ ν₯μλ‘ μΆμ²νμ¬ μ€λ€.
- μ΄λ―Έ μ¬μ©νκ³ μλ ν₯μκ° μκ³ κΈ°μ‘΄ μ¬μ©ν ν₯μμ μ μ¬ν ν₯μλ₯Ό μ°Ύκ³ μΆμ μ¬μ©μλ₯Ό μν κΈ°λ₯μ΄λ€.
- μ½ 40,000 κ°μ ν₯μλ₯Ό κ²μ λ° μμΈ μ 보λ₯Ό νμΈν μ μλ€.
- ν₯μ μ΄λ¦μΌλ‘ κ²μμ νλ©΄ ν΄λΉ ν₯μλ₯Ό μ°Ύμ μ μκ³ , μ΄λ―Έμ§λ₯Ό ν΄λ¦ μ ν΄λΉ ν₯μμ μμΈ λͺ¨λ¬ μ°½μ΄ λ¨κ² λλ€. μ΄ λͺ¨λ¬ μ°½μμ ν₯μμ μμΈ μ 보(note μ 보, μ±λ³ λ±)μ ν¨κ» CBF(Content Based Filtering) μΆμ² μκ³ λ¦¬μ¦μ μ΄μ©νμ¬ μ΄ ν₯μμ μ μ¬λκ° κ°μ₯ λμ 2κ°μ ν₯μλ₯Ό 보μ¬μ€λ€.
- Spring Boot
- My SQL
- Amazon RDS
- React.js
- Redux
- Material UI
- Pandas
- Numpy
- Scikit-learn
- AWS EC2
- Jenkins
- Docker
-
Git
-
Notion
-
Jira
μΆμ² μκ³ λ¦¬μ¦μ λνμ μΈ λ κ°μ§ λ°©μμΈ CBF(Content Based Filtering) λ°©μκ³Ό CF(Collaborative Filtering) λ°©μ μ€ CBF λ°©μμ μ¬μ©
[
{
'id': ν₯μ id(int),
'imgurl': ν₯μ imgurl(string),
'brand': λΈλλ id(id),
'name': ν₯μ μ΄λ¦(string),
'gender': ν₯μ νκ² μ±λ³(int),
'top_notes': [note id](int list),
'middle_notes': [note id](int list),
'base_notes': [note id](int list),
'categories': [categort id](int, list)
},
...
]
# row : ν₯μ id / column : ν₯μ λ
ΈνΈ id μΈ DataFrame μμ±
df = pd.DataFrame(columns=note_nums, index=perfume_ids)
# κ° ν₯μκ° κ°μ§κ³ μλ note λ€μ 1λ‘ νμ
for perfume in perfumes:
id, top_notes, middle_notes, base_notes = perfume['id'], perfume[
'top_notes'], perfume['middle_notes'], perfume['base_notes']
# λ
ΈνΈκ° μλ ν₯μλ pass
cnt = len(top_notes) + len(middle_notes) + len(base_notes)
if cnt == 0:
continue
for note in top_notes:
df.loc[id, note] = 1
for note in middle_notes:
df.loc[id, note] = 1
for note in base_notes:
df.loc[id, note] = 1
Pandas λΌμ΄λΈλ¬λ¦¬λ₯Ό μ΄μ©νμ¬ νμ ν₯μ id, μ΄μ ν₯μ noteλ‘ μ΄λ£¨μ΄μ§ DataFrame μμ±
ν΄λΉ DataFrame μ μ΄μ©νμ¬ κ° ν₯μλ€ κ°μ μ μ¬λλ₯Ό cosine similarity λ₯Ό μ΄μ©νμ¬ κ³μ°νλ€. cosine similarity κ° 1μ κ°κΉμΈ μλ‘ μ μ¬λκ° λκΈ° λλ¬Έμ μ μ¬λκ° λμ 2κ°μ ν₯μλ₯Ό μ°Ύμ μ¬μ©μμκ² μΆμ²νμ¬ μ€λ€.
# μμ±ν DataFrameμ similarity κ³μ°
similarity = cosine_similarity(df)
n_df = pd.DataFrame(similarity, columns=df.index, index=df.index)
n_df = n_df.drop_duplicates() # μ€λ³΅ μ κ±°
value = []
i = 0
# κ° ν₯μ λ³λ‘ μ μ¬λκ° λμ 2κ°μ ν₯μ μΆμΆ
for std in n_df.index:
i += 1
sort_df = n_df.loc[std, :].sort_values(ascending=False)
id_list = sort_df.head(3).index
value_list = sort_df.head(3).values
temp = [std, id_list[1], value_list[1]]
value.append(temp)
temp = [std, id_list[2], value_list[2]]
value.append(temp)
- μν€ν μ²