<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>chun-bae.log</title>
        <link>https://velog.io/</link>
        <description>비전공자 춘배네 개발 일기</description>
        <lastBuildDate>Fri, 17 Jan 2025 15:45:30 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>chun-bae.log</title>
            <url>https://velog.velcdn.com/images/festival__log/profile/f03eb170-c9d6-4c4d-84d7-ae435c222967/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. chun-bae.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/festival__log" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[RapidFuzz 맛보기]]></title>
            <link>https://velog.io/@festival__log/RapidFuzz-%EB%A7%9B%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@festival__log/RapidFuzz-%EB%A7%9B%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Fri, 17 Jan 2025 15:45:30 GMT</pubDate>
            <description><![CDATA[<h2 id="rapidfuzz란">RapidFuzz란?</h2>
<p>RapidFuzz는 Levenshtein Distance 알고리즘을 활용해 문자열 유사도를 계산하는 Python 라이브러리입니다. C++로 개발되어 기존의 FuzzyWuzzy 라이브러리보다 훨씬 빠른 속도를 제공합니다.</p>
<h2 id="주요-특징">주요 특징</h2>
<ol>
<li><p><strong>고성능</strong></p>
<ul>
<li>C++로 구현되어 FuzzyWuzzy보다 최대 10배 이상 빠른 성능</li>
<li>멀티스레딩 지원으로 대규모 데이터셋 처리 가능</li>
</ul>
</li>
<li><p><strong>메모리 효율성</strong></p>
<ul>
<li>최적화된 메모리 사용으로 대용량 데이터 처리에 적합</li>
<li>문자열 전처리 캐싱으로 반복 연산 최적화</li>
</ul>
</li>
<li><p><strong>다양한 문자열 매칭 알고리즘</strong></p>
<ul>
<li>Levenshtein Distance</li>
<li>Jaro-Winkler Distance</li>
<li>Longest Common Substring</li>
<li>그 외 다수의 문자열 유사도 측정 알고리즘 지원</li>
</ul>
</li>
</ol>
<h2 id="설치-방법">설치 방법</h2>
<pre><code class="language-bash">pip install rapidfuzz</code></pre>
<h2 id="사용-방법">사용 방법</h2>
<h3 id="1-간단한-문자열-유사도-비교">1. 간단한 문자열 유사도 비교</h3>
<pre><code class="language-python">from rapidfuzz import fuzz

# 기본적인 문자열 유사도 계산
ratio = fuzz.ratio(&quot;hello world&quot;, &quot;hello wold&quot;)
print(f&quot;유사도: {ratio}&quot;)  # 출력: 유사도: 95.2380....

# 부분 문자열 매칭
partial_ratio = fuzz.partial_ratio(&quot;hello world&quot;, &quot;world&quot;)
print(f&quot;부분 유사도: {partial_ratio}&quot;)  # 출력: 부분 유사도: 100.0</code></pre>
<h3 id="2-문자열-목록에서-가장-유사한-항목-찾기">2. 문자열 목록에서 가장 유사한 항목 찾기</h3>
<pre><code class="language-python">from rapidfuzz import process

choices = [&quot;python programming&quot;, &quot;java programming&quot;, &quot;c++ programming&quot;, &quot;javascript&quot;]
query = &quot;pythn programing&quot;

# 가장 유사한 문자열 찾기
results = process.extract(query, choices, limit=len(choices))
for match, score, index in results:
    print(f&quot;매칭: {match}, 점수: {score}&quot;)</code></pre>
<h3 id="3-문자열-전처리">3. 문자열 전처리</h3>
<pre><code class="language-python">from rapidfuzz.utils import default_process
from rapidfuzz import fuzz

# 대소문자 구분 없이 비교
text1 = &quot;Hello World&quot;
text2 = &quot;hello world&quot;
ratio = fuzz.ratio(text1, text2, processor=default_process)
print(f&quot;전처리 후 유사도: {ratio}&quot;)  # 출력: 전처리 후 유사도: 100.0</code></pre>
<h2 id="사용-예제">사용 예제</h2>
<h3 id="1-검색-엔진-개선">1. 검색 엔진 개선</h3>
<pre><code class="language-python">def search_products(query, product_list):
    return process.extract(
        query,
        product_list,
        scorer=fuzz.partial_ratio,
        limit=5
    )

products = [
    &quot;아이폰 13 프로&quot;,
    &quot;갤럭시 S22 울트라&quot;,
    &quot;아이폰 12&quot;,
    &quot;갤럭시 S21&quot;
]

results = search_products(&quot;아이폰&quot;, products)
for product, score, _ in results:
    print(f&quot;제품: {product}, 매칭 점수: {score}&quot;)</code></pre>
<h3 id="2-데이터-정제">2. 데이터 정제</h3>
<pre><code class="language-python">def clean_duplicate_entries(entries):
    unique_entries = []
    for entry in entries:
        # 유사도 90% 이상인 항목이 이미 있는지 확인
        matches = process.extract(entry, unique_entries, limit=1)
        if not matches or matches[0][1] &lt; 90:
            unique_entries.append(entry)
    return unique_entries

data = [&quot;신촌역&quot;, &quot;신촌 역&quot;, &quot;신촌역 (2호선)&quot;, &quot;홍대입구역&quot;, &quot;홍대 입구&quot;]
cleaned_data = clean_duplicate_entries(data)
print(&quot;정제된 데이터:&quot;, cleaned_data)</code></pre>
<h2 id="rapidfuzz의-모든-비교-알고리즘">RapidFuzz의 모든 비교 알고리즘</h2>
<h3 id="1-simple-ratio-fuzzratio">1. Simple Ratio (fuzz.ratio)</h3>
<p>기본적인 레벤슈타인 거리 기반 비교</p>
<pre><code class="language-python">from rapidfuzz import fuzz

# 기본 비교
ratio = fuzz.ratio(&quot;hello world&quot;, &quot;hello wold&quot;)  # 95.24</code></pre>
<ul>
<li><strong>특징</strong>: 전체 문자열을 정확히 비교</li>
<li><strong>사용 사례</strong>: 오타 교정, 비슷한 단어 찾기</li>
<li><strong>시간 복잡도</strong>: O(len1 * len2)</li>
</ul>
<h3 id="2-partial-ratio-fuzzpartial_ratio">2. Partial Ratio (fuzz.partial_ratio)</h3>
<p>더 짧은 문자열이 긴 문자열의 어느 부분과 가장 잘 매칭되는지 계산</p>
<pre><code class="language-python">from rapidfuzz import fuzz

# 부분 문자열 매칭
ratio = fuzz.partial_ratio(&quot;hello world&quot;, &quot;world&quot;)  # 100.0</code></pre>
<ul>
<li><strong>특징</strong>: 부분 문자열 매칭에 최적화</li>
<li><strong>사용 사례</strong>: 긴 텍스트 내 검색, 부분 매칭 필요 시</li>
<li><strong>시간 복잡도</strong>: O(len1 * min(len1, len2))</li>
</ul>
<h3 id="3-token-sort-ratio-fuzztoken_sort_ratio">3. Token Sort Ratio (fuzz.token_sort_ratio)</h3>
<p>단어들을 정렬 후 비교</p>
<pre><code class="language-python">from rapidfuzz import fuzz

# 단어 순서 무관 비교
ratio = fuzz.token_sort_ratio(&quot;world hello&quot;, &quot;hello world&quot;)  # 100.0</code></pre>
<ul>
<li><strong>특징</strong>: 단어 순서 무관한 비교</li>
<li><strong>사용 사례</strong>: 문장 유사도 비교, 키워드 매칭</li>
<li><strong>시간 복잡도</strong>: O(n log n) for sorting + O(len1 * len2) for comparison</li>
</ul>
<h3 id="4-token-set-ratio-fuzztoken_set_ratio">4. Token Set Ratio (fuzz.token_set_ratio)</h3>
<p>공통 토큰과 나머지 토큰을 분리하여 비교</p>
<pre><code class="language-python">from rapidfuzz import fuzz

# 중복 단어 제거 후 비교
ratio = fuzz.token_set_ratio(&quot;hello hello world&quot;, &quot;hello world&quot;)  # 100.0</code></pre>
<ul>
<li><strong>특징</strong>: 중복 단어 처리, 순서 무관</li>
<li><strong>사용 사례</strong>: 문서 유사도, 키워드 매칭</li>
<li><strong>시간 복잡도</strong>: O(n) for set operations + O(len1 * len2) for comparison</li>
</ul>
<h3 id="5-partial-token-sort-ratio-fuzzpartial_token_sort_ratio">5. Partial Token Sort Ratio (fuzz.partial_token_sort_ratio)</h3>
<p>Token Sort Ratio와 Partial Ratio의 조합</p>
<pre><code class="language-python">from rapidfuzz import fuzz

# 정렬 후 부분 매칭
ratio = fuzz.partial_token_sort_ratio(&quot;hello world python&quot;, &quot;world python&quot;)  # 100.0</code></pre>
<ul>
<li><strong>특징</strong>: 정렬 후 부분 매칭</li>
<li><strong>사용 사례</strong>: 긴 문장 내 키워드 검색</li>
<li><strong>시간 복잡도</strong>: O(n log n) + O(len1 * min(len1, len2))</li>
</ul>
<h3 id="6-partial-token-set-ratio-fuzzpartial_token_set_ratio">6. Partial Token Set Ratio (fuzz.partial_token_set_ratio)</h3>
<p>Token Set Ratio와 Partial Ratio의 조합</p>
<pre><code class="language-python">from rapidfuzz import fuzz

# 중복 제거 후 부분 매칭
ratio = fuzz.partial_token_set_ratio(&quot;hello hello world python&quot;, &quot;world python&quot;)  # 100.0</code></pre>
<ul>
<li><strong>특징</strong>: 중복 제거 후 부분 매칭</li>
<li><strong>사용 사례</strong>: 문서 내 키워드 검색</li>
<li><strong>시간 복잡도</strong>: O(n) + O(len1 * min(len1, len2))</li>
</ul>
<h3 id="7-wratio-fuzzwratio">7. WRatio (fuzz.WRatio)</h3>
<p>가중치가 적용된 빠른 비교</p>
<pre><code class="language-python">from rapidfuzz import fuzz

# 가중치 기반 비교
ratio = fuzz.WRatio(&quot;hello world&quot;, &quot;hello wold&quot;)  # 95</code></pre>
<ul>
<li><strong>특징</strong>: 문자열 길이에 따른 가중치 적용</li>
<li><strong>사용 사례</strong>: 일반적인 문자열 비교</li>
<li><strong>시간 복잡도</strong>: Varies based on the string lengths</li>
</ul>
<h3 id="8-qratio-fuzzqratio">8. QRatio (fuzz.QRatio)</h3>
<p>Quick Ratio - 빠른 비교</p>
<pre><code class="language-python">from rapidfuzz import fuzz

# 빠른 비교
ratio = fuzz.QRatio(&quot;hello world&quot;, &quot;hello wold&quot;)  # 95</code></pre>
<ul>
<li><strong>특징</strong>: 빠른 속도 우선</li>
<li><strong>사용 사례</strong>: 대량 데이터 처리</li>
<li><strong>시간 복잡도</strong>: O(min(len1, len2))</li>
</ul>
<h2 id="마치며">마치며</h2>
<p>RapidFuzz는 강력한 성능과 다양한 기능을 제공하는 문자열 매칭 라이브러리입니다. 특히, 한글 데이터 처리에서도 뛰어난 성능을 발휘하여 한국어 기반의 데이터 처리에도 매우 적합합니다.</p>
<p>RapidFuzz에서 사용하는 문자열 비교 알고리즘은 다양한 상황에 맞게 활용할 수 있도록 설계되었습니다. 앞으로 이 알고리즘들에 대해 조금 더 깊이 공부하며, 각 비교 방식의 원리, 계산 방법, 그리고 특징에 대해 정리해 보려고 합니다. 이를 통해 RapidFuzz의 매칭 메커니즘을 더 잘 이해하고, 실무에서 효과적으로 활용할 수 있는 방법을 탐구해 보겠습니다.</p>
<h2 id="참고-자료">참고 자료</h2>
<ul>
<li>RapidFuzz 공식 문서: <a href="https://rapidfuzz.github.io/RapidFuzz">https://rapidfuzz.github.io/RapidFuzz</a></li>
<li>GitHub 저장소: <a href="https://github.com/maxbachmann/RapidFuzz">https://github.com/maxbachmann/RapidFuzz</a></li>
<li>PyPI 페이지: <a href="https://pypi.org/project/rapidfuzz/">https://pypi.org/project/rapidfuzz/</a></li>
</ul>
<blockquote>
<p><a href="https://github.com/donginKim/RapidFuzz">깃허브</a>에도 동시에 예제 sample 코드가 같이 업로드 됩니다.
많은 관심 부탁드립니다. </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024년 회고로 시작하는 첫 벨로그]]></title>
            <link>https://velog.io/@festival__log/2024%EB%85%84-%ED%9A%8C%EA%B3%A0%EB%A1%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EC%B2%AB-%EB%B2%A8%EB%A1%9C%EA%B7%B8</link>
            <guid>https://velog.io/@festival__log/2024%EB%85%84-%ED%9A%8C%EA%B3%A0%EB%A1%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EC%B2%AB-%EB%B2%A8%EB%A1%9C%EA%B7%B8</guid>
            <pubDate>Mon, 06 Jan 2025 01:06:32 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/festival__log/post/a28243bd-3673-4eec-98d7-9df9f8d44d01/image.png" alt=""></p>
<h1 id="2024년-도파민의-늪에서">2024년, 도파민의 늪에서</h1>
<p>회사에 이직한 지 어느덧 4년이 넘었다.
회사의 전성기부터 매각 이슈까지, 복지 축소와 불확실한 시장 상황 속에서 걱정만 하며 무기력해진 나날이 이어졌다.
‘이직해야지, 공부해야지’라고 말만 하면서 정작 운동·게임·술·숏츠에 빠져 도파민에 찌든 매일을 보내게 되었다.</p>
<h2 id="25월-지옥-같은-프로젝트와-자존감-추락">2~5월: 지옥 같은 프로젝트와 자존감 추락</h2>
<p>•    새로운 프로젝트: ‘상품 - 카탈로그 자동매칭’이라는 복잡하고 부담스러운 과제를 맡았다.
•    열혈 신입 개발자: 열정 가득한 동료와 비교되면서 내 코딩 역량과 자존감이 한없이 떨어졌다.
•    SI적 사고의 한계: “시키면 일단 한다”는 오래된 습관 탓에 전체 흐름을 보지 못했고, 챌린지 해결에서 지연이 발생했다.
•    자기개발 부족: 2022년 이후로 기술 공부를 거의 손 놓고, 틈틈이 찍먹 수준의 학습만 하며 실력이 정체·후퇴해 있었다.</p>
<h2 id="인생의-터닝-포인트">인생의 터닝 포인트</h2>
<p>•    새로운 인연: 갑작스럽게 찾아온 사랑으로 결혼을 결심하게 되었고, 한 가정을 꾸린다는 책임감이 생겼다.
•    바쁜 결혼 준비: 2024년 12월에 결혼을 치르며, 정신없이 1년을 보냈다.
•    정신적 변화: ‘앞으로는 더 이상 게으름을 부릴 수 없다’는 절박함과 함께 새로운 목표들이 생겨났다.</p>
<hr>
<h1 id="2025년-다시-시작하는-마음">2025년, 다시 시작하는 마음</h1>
<p>결혼과 함께 한 해를 마무리하며, 나는 2025년에 세 가지 목표를 세웠다. 이전까지는 “굳이 이걸 해야 해?”라고 미뤄 두었던 것들이지만, 이제야 조금씩 용기를 내어 시도해보려 한다.</p>
<h3 id="1-기술블로그-시작">1. 기술블로그 시작</h3>
<p>•    내가 배운 것들을 기록하고 공유하며, 꾸준히 글 쓰는 습관을 들이고자 한다.
•    “어제의 나보다 조금 더 나은 나”가 되기 위한 가장 확실한 방법 중 하나라고 믿는다.</p>
<h3 id="2-책-읽기-시작">2. 책 읽기 시작</h3>
<p>•    다양한 분야의 책을 통해 폭넓은 시야를 갖추고, 호기심과 상상력을 키우려 한다.
•    개발 서적뿐 아니라 인문·경제·사회 등 다양한 장르에 도전할 예정이다.</p>
<h3 id="3-수학-공부-시작">3. 수학 공부 시작</h3>
<p>•    비전공자로서 기초가 부족했던 부분을 탄탄히 다지기 위함이다.
•    논리적으로 사고하는 습관과 수리적 사고력은 개발자로서도 분명 큰 도움이 된다고 생각한다.</p>
<hr>
<h1 id="마무리하며">마무리하며</h1>
<p>2024년은 긴 수렁처럼 느껴졌지만, 돌이켜 보면 나태함에서 벗어날 수 있게 해준 값진 자극이었다.
결혼이라는 큰 결심과 함께, 이제는 더 이상 ‘대충’ 살아갈 수 없다는 의지가 생겼다.
<strong>기술 블로그, 책 읽기, 수학 공부</strong> 라는 세 가지 키워드를 지켜 나가며, 내년 이맘때는 “내가 꽤 많이 성장했구나”라고 자랑스럽게 회고할 수 있길 바란다.</p>
<pre><code>앞으로도 끊임없이 기록하고, 회고하며 방향을 잡자!</code></pre><p>앞으로도 스스로를 부지런히 채찍질하며, 계속 성장하는 사람이 될 수 있도록 노력하겠다.</p>
]]></description>
        </item>
    </channel>
</rss>