๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ํ”„๋กœ์ ํŠธ/๐Ÿค– AI ๋ฐ์Šคํฌํ†ฑ ์ •๋ฆฌ ๐Ÿ–ฅ๏ธ

[Python]_ ํ•œ๊ธ€์˜ ์œ ๋‹ˆ์ฝ”๋“œ ํ‘œํ˜„ ๋ฐฉ์‹ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ_ ํŒŒ์ผ ๋ถ„์„ ์‹คํŒจ ์›์ธ

by hyeong._.ing 2026. 6. 15.

 

 

rules.txt์— ์ ํžŒ ๊ทœ์น™์— ๋งž์ถฐ ํŒŒ์ผ๋ช…์„ ํ™•์ธํ•œ ๋’ค
์–ด๋А ํด๋”๋กœ ๋ฐฐ์น˜ํ•  ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ํŒŒ์ผ์„ ๊ทœ์น™์— ๋งž๊ฒŒ ๋ถ„๋ฆฌํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.
์™œ ๊ทธ๋Ÿฐ๊ฑธ๊นŒ?

 

 

1. ๋ฌธ์ œ

  • rules.txt
    ์ œ๋ชฉ์„ ๋ณด๊ณ  ๊ฐ ํด๋”๋กœ ๋ถ„๋ฅ˜ํ•˜๋Š” ์ž‘์—…์„ ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ทœ์น™์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
school: ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ, ์„œ์ˆ ํ˜•, ๊ธฐ์‚ฌ
study: ์Šคํ”„๋ง, ๊ฐ•์˜, ๊ณต๋ถ€, ๊ธฐ๋ณธํŽธ
project: project, api, test, lotto
์˜ค๋ฅธ์ชฝ์— ์ ์€ ๋‹จ์–ด๊ฐ€ ์žˆ์œผ๋ฉด ์™ผ์ชฝ ํด๋”๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

 

  • ๊ฒฐ๊ณผํ™”๋ฉด

ํŒŒ์ผ๋ช…์— ์Šคํ”„๋ง์ด ์ ํ˜€์žˆ๋Š”๋ฐ, archive(๋ณด๊ด€ํ•จ) ํด๋”๋ฅผ ์ถ”์ฒœํ•œ๋‹ค๊ณ  ๋งํ•œ๋‹ค. ์ญ‰ ๋ณด๋ฉด [ํƒœ๊ทธ]๋งŒ ์ •ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฅ˜ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” rules.txt๋กœ ๋ถ„๋ฅ˜๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ•œ๋‹ค. ์™œ ๊ทธ๋Ÿฐ๊ฑธ๊นŒ?

 

 

 


 

 

 

 

2. ์›์ธ ๋ถ„์„

  • ํŒŒ์ด์ฌ์ด ํ…์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ, ๋ˆˆ์— ๋ณด์ด๋Š” ๊ธ€์ž๋Š” ๊ฐ™์•„๋„ ์ปดํ“จํ„ฐ ๋‚ด๋ถ€์˜ ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์ œ๋ชฉ์— ์Šคํ”„๋ง์ด ์ ํ˜€์žˆ์–ด๋„, ํŒŒ์ด์ฌ์ด ์ด๋ฅผ ๊ตฌ๋ณ„ํ•ด๋‚ด์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ์œผ๋กœ ์ถ”์ธกํ•œ๋‹ค.
  • ์œ ๋‹ˆ์ฝ”๋“œ๋Š” ๋‘๊ฐ€์ง€์˜ ํ‘œํ˜„ ๋ฐฉ์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    - NFC (์™„์„ฑํ˜•) : '๊ฐ€'๋ฅผ ํ•˜๋‚˜์˜ ์™„์„ฑ๋œ ๊ธ€์ž๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    - NFD (๋ถ„๋ฆฌํ˜•) : '๊ฐ€'๋ฅผ 'ใ„ฑ'+'ใ…'์™€ ๊ฐ™์€ ์ž์Œ๊ณผ ๋ชจ์Œ์œผ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. 
  • rules.txt๋Š” NFC ์ƒํƒœ๋กœ ์ €์žฅ๋˜์–ด ์žˆ์„ ํ™•๋ฅ ์ด ๋†’๋‹ค.
  • ํ•˜์ง€๋งŒ ํŒŒ์ด์ฌ์ด ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์ฝ์–ด์˜จ ํŒŒ์ผ๋ช…์€ NFD ํ˜•ํƒœ๋กœ ์ฝํžŒ ๊ฒƒ ๊ฐ™๋‹ค. 

 

 

 


 

 

 

3. ์ฝ”๋“œ ์ˆ˜์ •

  • classifier.py
    unicodedata๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
import unicodedata
def normalize_text(text):
    """
    ํ•œ๊ธ€ ๋ฌธ์ž์—ด ๋น„๊ต๋ฅผ ์œ„ํ•ด ๋ฌธ์ž์—ด ํ˜•ํƒœ๋ฅผ ํ†ต์ผํ•˜๋Š” ํ•จ์ˆ˜

    macOS์—์„œ๋Š” ํŒŒ์ผ๋ช…์˜ ํ•œ๊ธ€์ด ์ž๋ชจ ๋ถ„๋ฆฌ๋œ ํ˜•ํƒœ๋กœ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
    ์˜ˆ:
    ์Šคํ”„๋ง
    แ„‰แ…ณแ„‘แ…ณแ„…แ…ตแ†ผ

    ์‚ฌ๋žŒ์ด ๋ณด๊ธฐ์—๋Š” ๊ฐ™์ง€๋งŒ ์ปดํ“จํ„ฐ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ,
    NFC ํ˜•ํƒœ๋กœ ํ†ต์ผํ•œ ๋’ค ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ” ๋น„๊ตํ•œ๋‹ค.
    """
    return unicodedata.normalize("NFC", text).lower()
def classify_by_rules(file_path, rules, destination_folder_names):
    """
    rules.txt ๊ทœ์น™์„ ๋ณด๊ณ  ์ด๋™ํ•  ํด๋”๋ฅผ ์ถ”์ฒœํ•˜๋Š” ํ•จ์ˆ˜

    ์กฐ๊ฑด:
    1. ํŒŒ์ผ๋ช… ์•ˆ์— rules.txt์˜ ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    2. ๊ทœ์น™์˜ ํด๋” ์ด๋ฆ„์ด ์‹ค์ œ ์ด๋™ ๋ชฉ์ ์ง€ ํด๋”์— ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.
    """
    filename = file_path.name

    # macOS ํ•œ๊ธ€ ํŒŒ์ผ๋ช… ๋น„๊ต๋ฅผ ์œ„ํ•ด ์ •๊ทœํ™”ํ•œ๋‹ค.
    normalized_filename = normalize_text(filename)

    for folder_name, keywords in rules.items():
        # ์‹ค์ œ ํด๋”๊ฐ€ ์—†๋Š” ๊ทœ์น™์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
        if folder_name not in destination_folder_names:
            continue

        for keyword in keywords:
            normalized_keyword = normalize_text(keyword)

            if normalized_keyword in normalized_filename:
                return {
                    "filename": filename,
                    "targetFolder": folder_name,
                    "reason": f"ํŒŒ์ผ๋ช…์— rules.txt ํ‚ค์›Œ๋“œ '{keyword}'๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.",
                    "source": "RULES_TXT",
                }

    return None

 

 

  • ๋‹ค์‹œ ์‹คํ–‰
    ์ด์   ์ž˜ ๋ถ„๋ฅ˜ํ•œ๋‹ค!