<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>컴공누나의 지식 보관소</title>
    <link>https://jaeyoon-95.tistory.com/</link>
    <description>ML 엔지니어 컴공누나입니다:)    
wodbs9522@gmail.com</description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 14:15:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>컴공누나</managingEditor>
    <image>
      <title>컴공누나의 지식 보관소</title>
      <url>https://tistory1.daumcdn.net/tistory/3415259/attach/dd0756afc1494c038ed8ee390d27ca2a</url>
      <link>https://jaeyoon-95.tistory.com</link>
    </image>
    <item>
      <title>RAG Retrieval 단계 Langchain Document loaders 종류 알아보기</title>
      <link>https://jaeyoon-95.tistory.com/273</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;앞의 포스팅에서 RAG가 무엇인지에 대해 알아봤는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 &lt;b&gt;&lt;u&gt;RAG를 만들기 위한 재료를 어떻게 가져오는지&lt;/u&gt;&lt;/b&gt; 알아볼게요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 재료를 가져오는 것을 바로 &lt;b&gt;&lt;u&gt;Document Loader&lt;/u&gt;&lt;/b&gt;라고 부릅니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하나씩 자세히 알아볼게요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;혹시나 RAG 전반적인 개념이 궁금하시면 아래 포스팅 참고해주세요!&lt;/p&gt;
&lt;figure id=&quot;og_1744029585818&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;RAG(Retrieval-Augmented Generation) 기본 개념 정리 및 Langchain코드 예제&quot; data-og-description=&quot;최근 ChatGPT의 등장으로 LLM에 대한 관심이 커지고 있습니다.하지만 써보신 분들은 아시겠지만, 분명히 LLM도 한계점이 존재합니다.예를 들어,최신 정보 반영이 안되어 있다거나,특정 기업 내에서 &quot; data-og-host=&quot;jaeyoon-95.tistory.com&quot; data-og-source-url=&quot;https://jaeyoon-95.tistory.com/272&quot; data-og-url=&quot;https://jaeyoon-95.tistory.com/272&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bYKL7U/hyYA7fmOYv/rqpDW5mZEXWnV2XdkLM140/img.png?width=800&amp;amp;height=453&amp;amp;face=0_0_800_453,https://scrap.kakaocdn.net/dn/ehCBEr/hyYA3RzVJO/Q9Zzu4fyH5EkhpQFDDx8C1/img.png?width=800&amp;amp;height=453&amp;amp;face=0_0_800_453,https://scrap.kakaocdn.net/dn/Eb7iB/hyYCaCiLTF/kCcoJvN56aPBEog3EVftzK/img.png?width=2172&amp;amp;height=1232&amp;amp;face=0_0_2172_1232&quot;&gt;&lt;a href=&quot;https://jaeyoon-95.tistory.com/272&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jaeyoon-95.tistory.com/272&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bYKL7U/hyYA7fmOYv/rqpDW5mZEXWnV2XdkLM140/img.png?width=800&amp;amp;height=453&amp;amp;face=0_0_800_453,https://scrap.kakaocdn.net/dn/ehCBEr/hyYA3RzVJO/Q9Zzu4fyH5EkhpQFDDx8C1/img.png?width=800&amp;amp;height=453&amp;amp;face=0_0_800_453,https://scrap.kakaocdn.net/dn/Eb7iB/hyYCaCiLTF/kCcoJvN56aPBEog3EVftzK/img.png?width=2172&amp;amp;height=1232&amp;amp;face=0_0_2172_1232');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;RAG(Retrieval-Augmented Generation) 기본 개념 정리 및 Langchain코드 예제&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;최근 ChatGPT의 등장으로 LLM에 대한 관심이 커지고 있습니다.하지만 써보신 분들은 아시겠지만, 분명히 LLM도 한계점이 존재합니다.예를 들어,최신 정보 반영이 안되어 있다거나,특정 기업 내에서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jaeyoon-95.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;001&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Document Loader란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG시스템을 구축 할 때, 참고할 데이터를 가져오는(로드하는) 로더라고 할 수 있습니다. 먼저 가져온 뒤에 LLM이 이해할 수 있도록 변환하는 과정이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PDF 파일을 읽어 LLM이 알아들을 수 있는 텍스트로 바꿔준다.&lt;/li&gt;
&lt;li&gt;웹페이지 HTML 코드를 제거하고 의미있는 텍스트로 바꿔준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등으로 로드할 수 있겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이런 로드는 어떻게 해야할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번 포스팅에서도 말씀드렸듯이, 아주 편한 우리의 LLM라이브러리인 Langchain이 많은 로더를 제공해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래에서 어느 형식의 파일을 읽어올 수 있는지 모두 알아볼게요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Document Loader 종류&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명에 앞서 만약 실행을 하고싶으시다면, Langchain을 먼저 설치해주세요!&lt;/p&gt;
&lt;pre id=&quot;code_1744030074013&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install langchain&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1.TextLoader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트 로더로 .txt파일을 불러올 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744030027512&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import TextLoader

loader = TextLoader(&quot;example.txt&quot;)
documents = loader.load()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. CSVLoader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;csv형태의 데이터를 로드하여 각 행을 문서로 변환합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744030118961&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import CSVLoader

loader = CSVLoader(&quot;example.csv&quot;)
documents = loader.load()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 csv형태 뿐만 아니라 tsv도 가능합니다. 아래처럼 조건을 추가해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마치 pandas로 tsv, csv를 불러올 때와 유사하죠?&lt;/p&gt;
&lt;pre id=&quot;code_1744030472578&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import CSVLoader

loader = CSVLoader(
    file_path=&quot;example.tsv&quot;,
    csv_args={
        &quot;delimiter&quot;: &quot;\t&quot;
    }
)
documents = loader.load()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delimiter만 바꾼다면 ;나 *로 구분된 파일도 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3.JSONLoader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON 형태의 파일을 로드합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744030652476&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import JSONLoader

loader = JSONLoader(&quot;example.json&quot;)
documents = loader.load()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4.Markdown&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Markdown형태의 파일을 로드합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744030674542&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import UnstructuredMarkdownLoader

loader = UnstructuredMarkdownLoader(&quot;example.md&quot;)
documents = loader.load()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5.PyPDFLoader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PDF문서를 페이지 단위로 로드합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744030702044&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader(&quot;example.pdf&quot;)
documents = loader.load()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;6.WebBaseLoader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹페이지 내에 있는 HTML 콘텐츠를 로드하고, 본문에 텍스트를 추출합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744030744559&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import WebBaseLoader

loader = WebBaseLoader(&quot;https://example.com&quot;)
documents = loader.load()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;7.Sitemap&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹사이트의 Sitemap을 분석하여 여러 페이지를 자동으로 크롤링하고 로드합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744030772543&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import SitemapLoader

loader = SitemapLoader(&quot;https://example.com/sitemap.xml&quot;)
documents = loader.load()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;8.RecursiveUrlLoader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 URL에서 시작하여 내부 링크를 따라가며 재귀적으로 페이지를 로드합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744030810958&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import RecursiveUrlLoader

loader = RecursiveUrlLoader(&quot;https://example.com&quot;)
documents = loader.load()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;9.DirectoryLoader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정된 디렉토리 내의 모든 파일을 로드하여, 특정 파일 확장자를 필터링할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744030846327&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import DirectoryLoader

loader = DirectoryLoader(&quot;path/to/directory&quot;, glob=&quot;**/*.txt&quot;)
documents = loader.load()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;10.GDriveLoader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 드라이브에서 파일을 로드합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744030870008&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import GDriveLoader

loader = GDriveLoader(&quot;your_folder_id&quot;, &quot;credentials.json&quot;)
documents = loader.load()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;11.AzureBlobStorageFileLoader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Azure Blob Storage에서 파일을 로드합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744030933360&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import AzureBlobStorageFileLoader

loader = AzureBlobStorageFileLoader(&quot;your_connection_string&quot;, &quot;container_name&quot;, &quot;blob_name&quot;)
documents = loader.load()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로드한 데이터는 아래와 같이 불러와집니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744031093282&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;Document(page_content=&quot;This is a sample text file.\nIt contains multiple lines of information.\nLangChain makes it easy to work with documents.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심적으로 쓰이는 것들만 찾아왔는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외에 정말 다양한 Loader들이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Custom Loader&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정해져있는 Loader를 쓸 수도 있지만, 본인이 원하는대로 만들어서 쓸 수도 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744031507963&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_core.document_loaders import BaseLoader
from langchain_core.documents import Document

class MyCustomLoader(BaseLoader):
    def __init__(self, path):
        self.path = path

    def load(self):
        # Step 1. 데이터 읽기
        with open(self.path, &quot;r&quot;, encoding=&quot;utf-8&quot;) as f:
            raw_text = f.read()

        # Step 2. Document 객체로 변환
        doc = Document(
            page_content=raw_text,
            metadata={&quot;source&quot;: self.path}
        )
        return [doc]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법은 정말 간단합니다. 로드한 데이터를 읽고, 텍스트 형태로 만들어서 Document객체에 넣어주시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서 log 데이터를 불러오고 싶다면 다음과 같이 구현할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1744032171625&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class LogFileLoader(BaseLoader):
    def __init__(self, filepath):
        self.filepath = filepath

    def load(self):
        with open(self.filepath, &quot;r&quot;, encoding=&quot;utf-8&quot;) as file:
            lines = file.readlines()

        logs = &quot;\n&quot;.join(line for line in lines if &quot;ERROR&quot; in line)
        return [Document(page_content=logs, metadata={&quot;source&quot;: self.filepath})]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 Langchain Document loaders 종류에 대해서 알아봤는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 포스팅에서도 RAG를 구현할 수 있는 다음 단계를 차근차근 알려드릴게요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;궁금한 점 있으시면 언제든지 댓글 남겨주세요!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;006&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/006.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/006.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>인공지능공부/LLM</category>
      <category>LLM</category>
      <category>Rag</category>
      <category>Retrieval</category>
      <category>래그</category>
      <author>컴공누나</author>
      <guid isPermaLink="true">https://jaeyoon-95.tistory.com/273</guid>
      <comments>https://jaeyoon-95.tistory.com/273#entry273comment</comments>
      <pubDate>Mon, 7 Apr 2025 22:24:11 +0900</pubDate>
    </item>
    <item>
      <title>RAG(Retrieval-Augmented Generation) 기본 개념 정리 및 Langchain코드 예제</title>
      <link>https://jaeyoon-95.tistory.com/272</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최근 ChatGPT의 등장으로 LLM에 대한 관심이 커지고 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 써보신 분들은 아시겠지만, 분명히 LLM도 한계점이 존재합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최신 정보 반영이 안되어 있다거나,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;특정 기업 내에서 쓰는 비밀 문서 등&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ChatGPT가 답변할 수 없는 부분도 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그렇다면 이 정보를 넣기 위해 큰 모델을 다시 학습시켜야할까요?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아뇨! 꼭 그럴 필요는 없습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;관련된 문서를 프롬프트로 같이 넣어줌으로써 ChatGPT가 이를 이해하고, 답변해 줄 수 있습니다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이것이 바로 RAG의 개념입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ChatGPT에게 관련 문서를 던져주면서 &quot;이게 관련 정보니까 내가 묻는말에 답해!&quot;라고 하는 것과 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 이번 포스팅에서 더 자세히 알아볼게요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;더 나아가 실습까지 할 예정이니 끝까지 봐주시면 더 좋겠습니다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;RAG란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 Retrieval Augmented Generation이라는 이름에서부터 알 수 있듯이, &lt;b&gt;&lt;u&gt;관련된 정보를 검색하여 먼저 찾고, 이를 LLM에 같이 넣어 최종 답변을 생성하는 하나의 파이프라인&lt;/u&gt;&lt;/b&gt;입니다. 간단히 말씀드리자면, 검색 기반의 생성이라고 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 이해하시기 쉽게 플로우를 그려드릴게요!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-03 오후 11.07.35.png&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;1232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byZgQX/btsM6u1SEYz/GIpFQ58JZNQ2fwM22GDzxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byZgQX/btsM6u1SEYz/GIpFQ58JZNQ2fwM22GDzxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byZgQX/btsM6u1SEYz/GIpFQ58JZNQ2fwM22GDzxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyZgQX%2FbtsM6u1SEYz%2FGIpFQ58JZNQ2fwM22GDzxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2172&quot; height=&quot;1232&quot; data-filename=&quot;스크린샷 2025-04-03 오후 11.07.35.png&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;1232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 일반적인 구조를 볼게요. LLM은 별도로 학습하지 않은 이상, 당연히 사내에 있는 A라는 사람의 정보를 모릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 RAG구조에서는 A에 대한 정보를 검색 모델이 문서에서 한번 검색하고, LLM에게 함께 제공하기 때문에, LLM은 잘 답변해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에 검색하여 &lt;b&gt;&lt;u&gt;정보를 제공해 주는 로직이 하나 추가된 것&lt;/u&gt;&lt;/b&gt;이라고 생각하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;RAG의 필요성&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 RAG가 뭔지에 대해 설명을 드렸는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;그냥 LLM 다시 학습시키면 되는거 아님?&quot; 생각이 드실 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 맞는 말입니다. 돈과 시간만 많으면 사실 LLM을 재학습 시키는 것이 가장 편한 방법이긴 하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 웬만한 기업에서도 매번 학습시키기에는 부담이 되는 것은 사실입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습을 한다고 하더라도 LLM에서 자주 나타나는 할루시네이션이 나타날 가능성도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;u&gt;&lt;b&gt;보다 적은 비용으로 정확한 정보를 답변하기 위해 RAG구조를 사용&lt;/b&gt;&lt;/u&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;RAG의 구조&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG가 뭐고, 왜 필요한지 알았으니 이제 자세한 구조에 대해서 알아볼까요?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-03 오후 11.34.36.png&quot; data-origin-width=&quot;2508&quot; data-origin-height=&quot;1018&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0ryFu/btsM6VdmEXV/bZxWrZ5VEKtpkOQCYXa2j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0ryFu/btsM6VdmEXV/bZxWrZ5VEKtpkOQCYXa2j0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0ryFu/btsM6VdmEXV/bZxWrZ5VEKtpkOQCYXa2j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0ryFu%2FbtsM6VdmEXV%2FbZxWrZ5VEKtpkOQCYXa2j0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2508&quot; height=&quot;1018&quot; data-filename=&quot;스크린샷 2025-04-03 오후 11.34.36.png&quot; data-origin-width=&quot;2508&quot; data-origin-height=&quot;1018&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 크게 문서를 검색하는 Retriever, 답변을 생성하는 Generator로 나뉘어져 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;Retriever&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;검색기&quot; 역할을 하는 부분입니다.&lt;/li&gt;
&lt;li&gt;입력받은 질문과 가장 관련 깊은 문서를 찾아줍니다.&lt;/li&gt;
&lt;li&gt;방법으로는 Lexical, Dense, Hybrid Search가 있습니다.&lt;/li&gt;
&lt;li&gt;문서는 다양한 형태가 될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;Generator&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 우리가 알고있는 LLM(GPT, LLama 등)을 뜻합니다.&lt;/li&gt;
&lt;li&gt;Retriever로 부터 받은 정보를 바탕으로 답변을 생성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;간단한 코드 예시(Langchain사용)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Langchain은 LLM을 쉽게 다룰 수 있게 도와주는 파이썬 라이브러리입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Langchain으로도 아주 쉽게 RAG를 구현하실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드가 엄청 간단하죠?&lt;/p&gt;
&lt;pre id=&quot;code_1743691125223&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import TextLoader

# 1. 문서 로드 및 분할
loader = TextLoader(&quot;example.txt&quot;)
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(documents)

# 2. 문서 임베딩 및 벡터 저장 (FAISS 사용)
embedding = OpenAIEmbeddings()
db = FAISS.from_documents(docs, embedding)

# 3. 검색 + 생성 체인 구성
retriever = db.as_retriever()
llm = ChatOpenAI(model_name=&quot;gpt-3.5-turbo&quot;)
qa = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)

# 4. 질문하고 답 받기!
query = &quot;이 문서의 핵심 내용이 뭐야?&quot;
result = qa.run(query)
print(result)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 등장하는 FAISS는 벡터 DB인데요. 사용 방법은 아래 포스팅에 자세히 적어두었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 Langchain 사용법과는 살짝 다르긴 하지만, 기본적인 동작 과정이 궁금하시면 참고해주세요!&lt;/p&gt;
&lt;figure id=&quot;og_1743691236844&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;대용량 데이터의 유사도 검색 라이브러리 faiss 사용하기&quot; data-og-description=&quot;faiss faiss는 대용량의 데이터 간의 유사도를 빠르게 계산해주는 유사도 검색 라이브러리입니다. 예를 들어 유사한 단어를 찾고 싶다! 하시면 미리 임베딩된 단어들로 &amp;quot;인덱스&amp;quot;를 생성해 주시고, &amp;quot;&quot; data-og-host=&quot;jaeyoon-95.tistory.com&quot; data-og-source-url=&quot;https://jaeyoon-95.tistory.com/225&quot; data-og-url=&quot;https://jaeyoon-95.tistory.com/225&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cIUWFy/hyYA3weCwu/zCk81FBtUefGSYzvzK5GKk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bZfVEv/hyYxD62YU5/FrK9JRKA5ZGnT3qmCKeevK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jaeyoon-95.tistory.com/225&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jaeyoon-95.tistory.com/225&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cIUWFy/hyYA3weCwu/zCk81FBtUefGSYzvzK5GKk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bZfVEv/hyYxD62YU5/FrK9JRKA5ZGnT3qmCKeevK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;대용량 데이터의 유사도 검색 라이브러리 faiss 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;faiss faiss는 대용량의 데이터 간의 유사도를 빠르게 계산해주는 유사도 검색 라이브러리입니다. 예를 들어 유사한 단어를 찾고 싶다! 하시면 미리 임베딩된 단어들로 &quot;인덱스&quot;를 생성해 주시고, &quot;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jaeyoon-95.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 RAG 기본 개념에 대해서 알아봤는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;점점 더 심화 과정을 설명할 예정이니, 관심있으신 분들은 봐주시면 좋을 것 같아요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;읽어주셔서 감사합니다:)&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>인공지능공부/LLM</category>
      <category>ChatGPT</category>
      <category>LLM</category>
      <category>Rag</category>
      <category>retrieval_augmented_generation</category>
      <category>자연어처리</category>
      <author>컴공누나</author>
      <guid isPermaLink="true">https://jaeyoon-95.tistory.com/272</guid>
      <comments>https://jaeyoon-95.tistory.com/272#entry272comment</comments>
      <pubDate>Thu, 3 Apr 2025 23:41:58 +0900</pubDate>
    </item>
    <item>
      <title>ChatGPT 프롬프트 엔지니어링 잘 하는 방법</title>
      <link>https://jaeyoon-95.tistory.com/271</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ChatGPT가 나오고 나서 프롬프트 엔지니어링이 정말 중요해졌죠.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;실제로 비개발자 분들도 프롬프트 엔지니어링을 잘 하시면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;앱, 웹 등 쉽게 만드실 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 &lt;b&gt;&lt;u&gt;프롬프트 엔지니어링을 어떻게하면 더 잘하는지&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;엔드류응 교수님께서 직접 올려주신 강의를 토대로 정리해볼게요.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;001&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;프롬프트 엔지니어링 잘하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;명확하고 구체적인 지시&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 방법은 명확하고 구체적인 지시를 하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 방법은 여러가지가 있는데요. 간단하게 먼저 정리해볼게요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;&quot;, ```, ---, &amp;lt;&amp;gt;, &amp;lt;tag&amp;gt;&amp;lt;/tag&amp;gt;등의 구분자를 이용하여 입력의 구분된 부분을 명확하게 표시&lt;/li&gt;
&lt;li&gt;HTML, JSON 형태와 같은 구조화된 출력 요구&lt;/li&gt;
&lt;li&gt;모든 조건이 만족하는지 체크하도록 요구&lt;/li&gt;
&lt;li&gt;적절한 예시 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;사용전&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;사용후&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;이 고양이 장난감은 진짜 잘만든 것 같아요. 우리 야옹이가 진짜 잘 가지고 노는데, 어떻게만드셨나요? 정말 최고입니다.&lt;br /&gt;&lt;br /&gt;위의 텍스트에서 어떤 상품을 산 것인지 알려줘.&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;입력받은 텍스트에 대해 어떤 상품을 산 것인지 JSON 형태로 출력해주세요. 다음을 따라서 해주세요.&lt;br /&gt;&lt;br /&gt;## 예시&lt;br /&gt;-입력 : 강아지 사료가 정말 질이 좋은 것 같아요. 우리 강아지가 건강해졌어요.&lt;br /&gt;-출력 : 강아지 사료&lt;br /&gt;&lt;br /&gt;step1. 입력받은 텍스트에 상품명이 있는지 체크한다.&lt;br /&gt;step2. 출력이 json형태가 맞는지 체크한다.&lt;br /&gt;&lt;br /&gt;## 입력&lt;br /&gt;이 고양이 장난감은 진짜 잘만든 것 같아요. 우리 야옹이가 진짜 잘 가지고 노는데, 어떻게만드셨나요? 정말 최고입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-26 오후 10.15.27.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eGCmcy/btsMXOFaIsq/YoAk19KbFyHo9WMkv3nctk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eGCmcy/btsMXOFaIsq/YoAk19KbFyHo9WMkv3nctk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eGCmcy/btsMXOFaIsq/YoAk19KbFyHo9WMkv3nctk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeGCmcy%2FbtsMXOFaIsq%2FYoAk19KbFyHo9WMkv3nctk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;275&quot; height=&quot;126&quot; data-filename=&quot;스크린샷 2025-03-26 오후 10.15.27.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-26 오후 10.19.57.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgaBpL/btsMYgVxGyd/tlkjCKNaEbTmLM8fZuRv71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgaBpL/btsMYgVxGyd/tlkjCKNaEbTmLM8fZuRv71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgaBpL/btsMYgVxGyd/tlkjCKNaEbTmLM8fZuRv71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgaBpL%2FbtsMYgVxGyd%2FtlkjCKNaEbTmLM8fZuRv71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;254&quot; height=&quot;231&quot; data-filename=&quot;스크린샷 2025-03-26 오후 10.19.57.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 엄청나게 어려운 task를 준 것은 아니라 둘 다 답변을 잘 하는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 명확하고 구체적으로 말한 쪽이 더 정교하게 추출했죠. 어려운 task에 적용할수록 결과값 차이가 많이 납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;모델에게 생각할 시간을 주기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째는 모델에게 자체적으로 생각할 시간을 주는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람도 어떤 문제를 줄 때 급하게 푸는 것과 시간을 가지고 푸는 것의 결과가 꽤 차이가 납니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;step1, step2 등의 작업을 완료하는 데 필요한 단계를 명시&lt;/li&gt;
&lt;li&gt;결론에 도달하기 전 자신만의 해결책을 찾도록 지시&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;사용전&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;사용후&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;철수가&amp;nbsp;사과&amp;nbsp;3개를&amp;nbsp;사고,&amp;nbsp;영희가&amp;nbsp;5개를&amp;nbsp;샀습니다.&amp;nbsp;&lt;br /&gt;둘이&amp;nbsp;합쳐&amp;nbsp;몇&amp;nbsp;개입니까?&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;철수가 사과 3개를 샀고, 영희는 5개를 샀습니다.&lt;br /&gt;Step 1: 철수가 산 개수를 계산하세요.&lt;br /&gt;Step 2: 영희가 산 개수를 계산하세요.&lt;br /&gt;Step 3: 두 개수를 더해서 총합을 구하세요.&lt;br /&gt;마지막으로 정답을 말해주세요.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-26 오후 10.33.17.png&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDFFYC/btsMWWw8R6f/kaJd3Jhcb2K8Dti6CPsHC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDFFYC/btsMWWw8R6f/kaJd3Jhcb2K8Dti6CPsHC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDFFYC/btsMWWw8R6f/kaJd3Jhcb2K8Dti6CPsHC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDFFYC%2FbtsMWWw8R6f%2FkaJd3Jhcb2K8Dti6CPsHC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;254&quot; height=&quot;77&quot; data-filename=&quot;스크린샷 2025-03-26 오후 10.33.17.png&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-26 오후 10.33.34.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF1pS5/btsMXPxiSrD/946rUWkg9xoy5vAM42zlK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF1pS5/btsMXPxiSrD/946rUWkg9xoy5vAM42zlK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF1pS5/btsMXPxiSrD/946rUWkg9xoy5vAM42zlK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF1pS5%2FbtsMXPxiSrD%2F946rUWkg9xoy5vAM42zlK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;257&quot; height=&quot;213&quot; data-filename=&quot;스크린샷 2025-03-26 오후 10.33.34.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에도 간단한 예시라 다들 잘하지만, 확실히 생각할 시간을 주는 쪽이 더 정교하게 일을 처리하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 업무에 사용하다보면, 프롬프트를 어떻게 넣냐에 따라 받는 답변의 만족도가 달라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;반복해서 프롬프트 수정하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 질문의 답변을 잘 받는 방법을 배웠으니, 어떻게 더 나은 프롬프트를 만들 수 있는지 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의에서는 &quot;반복적 작업으로 프롬프트 개발을 해야한다&quot;라고 하셨는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 의미가 무엇인지 한번 살펴볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 제가 파리 여행을 가는 데 chatgpt에게 계획을 세워달라고 하면, 다음과 같은 과정을 거칠 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; text-align: left;&quot;&gt;&lt;b&gt;1step. 초기 계획 짜달라고하기&lt;/b&gt;&lt;br /&gt;- &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;프롬프트 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파리에서 3일간 여행할 건데, 여행 일정 짜줘.&lt;br /&gt;&amp;gt; 너무 일반적인 결과라 답변이 마음에 안들 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;2step. 조금 더 원하는 포인트를 구체적으로 적기(예술,역사 중심 + 걷기 최소화)&lt;/b&gt;&lt;br /&gt;- 프롬프트 : 파리에서&amp;nbsp;3일간&amp;nbsp;여행할&amp;nbsp;건데,&amp;nbsp;예술과&amp;nbsp;역사&amp;nbsp;중심의&amp;nbsp;일정으로&amp;nbsp;짜줘.&amp;nbsp;걷는&amp;nbsp;시간은&amp;nbsp;하루&amp;nbsp;3시간&amp;nbsp;이하로&amp;nbsp;해줘.&lt;br /&gt;&amp;gt; 관심사와 걷기 시간 제한이 생김&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;3step. 더 구체적으로 원하는 포인트 적기(하루에 3개 이하 명소 + 대중교통 위주 + 맛집)&lt;/b&gt;&lt;br /&gt;- 프롬프트 : 파리에서 3일간 예술과 역사 중심으로 여행할 거야. 하루에 3개 이하의 명소만 추천해줘. 대중교통 이동 위주로 계획해줘. 그리고 맛집도 하루에 1곳씩 넣어줘.&lt;br /&gt;&amp;gt; 명소 수 제한, 이동 방식 지정, 맛집 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예는 명확하고 구체적인 예시, 생각할 시간 주기 등의 방식을 쓰지 않고 간단하게 작성해 보았는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 저 두 방법을 다 넣는다고 해도, 완전히 원하는 결과가 나오지 않을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 경우에는 &lt;b&gt;&lt;u&gt;프롬프트를 조금씩 수정해서 원하는 결과가 나오도록 반복적인 작업&lt;/u&gt;&lt;/b&gt;을 해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 프롬프트 엔지니어링 잘 하는 방법에 대해서 알려드렸는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 포스팅에서는 어떤 문제에 LLM을 적용할 수 있을지 말씀드릴게요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;궁금한 부분이 있다면 언제든지 댓글 남겨주세요!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>인공지능공부/LLM</category>
      <category>ChatGPT</category>
      <category>챗지피티</category>
      <category>챗지피티명령어</category>
      <category>챗지피티잘쓰는법</category>
      <category>챗지피티프롬프트</category>
      <category>프롬프트엔지니어링</category>
      <author>컴공누나</author>
      <guid isPermaLink="true">https://jaeyoon-95.tistory.com/271</guid>
      <comments>https://jaeyoon-95.tistory.com/271#entry271comment</comments>
      <pubDate>Wed, 26 Mar 2025 22:57:35 +0900</pubDate>
    </item>
    <item>
      <title>LSA를 활용한 문서 의미 분석과 통계적 임베딩</title>
      <link>https://jaeyoon-95.tistory.com/270</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지난 포스팅에서는 통계적 임베딩 종류 중 하나인 TF-IDF에 대해 알려드렸습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;혹시 놓치신 분들은 아래 포스팅을 참고해주세요.&lt;/p&gt;
&lt;figure id=&quot;og_1741696355756&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;통계적 임베딩으로 문서의 핵심 단어를 찾는 TF-IDF&quot; data-og-description=&quot;지난번 포스팅에서는 임베딩 모델 설명에 들어가기 앞서 토크나이저에 대해 알아봤는데요.아직 못보신 분들은 미리 보시는 것을 추천드립니다.&amp;nbsp;자연어처리 기초 토크나이저의 모든것! 종류부&quot; data-og-host=&quot;jaeyoon-95.tistory.com&quot; data-og-source-url=&quot;https://jaeyoon-95.tistory.com/267&quot; data-og-url=&quot;https://jaeyoon-95.tistory.com/267&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbOF8L/hyYrQXSe8r/dACIfDLYPfHhQ1szI3isZK/img.png?width=632&amp;amp;height=104&amp;amp;face=0_0_632_104,https://scrap.kakaocdn.net/dn/c4Pcfe/hyYqNf9kzc/Aw0kUNtNPLD23xyaU0pYJk/img.png?width=632&amp;amp;height=104&amp;amp;face=0_0_632_104&quot;&gt;&lt;a href=&quot;https://jaeyoon-95.tistory.com/267&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jaeyoon-95.tistory.com/267&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbOF8L/hyYrQXSe8r/dACIfDLYPfHhQ1szI3isZK/img.png?width=632&amp;amp;height=104&amp;amp;face=0_0_632_104,https://scrap.kakaocdn.net/dn/c4Pcfe/hyYqNf9kzc/Aw0kUNtNPLD23xyaU0pYJk/img.png?width=632&amp;amp;height=104&amp;amp;face=0_0_632_104');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;통계적 임베딩으로 문서의 핵심 단어를 찾는 TF-IDF&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;지난번 포스팅에서는 임베딩 모델 설명에 들어가기 앞서 토크나이저에 대해 알아봤는데요.아직 못보신 분들은 미리 보시는 것을 추천드립니다.&amp;nbsp;자연어처리 기초 토크나이저의 모든것! 종류부&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jaeyoon-95.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;추가로 어떤 임베딩 종류가 있는지 궁금하시다면 아래 포스팅을 참고해주세요.&lt;/p&gt;
&lt;figure id=&quot;og_1741696395336&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;자연어 처리 임베딩의 등장 배경과 종류&quot; data-og-description=&quot;어느 순간부터 딥러닝이 점점 핫해지기 시작했는데요.OpenAI의 ChatGPT가 공개되면서 LLM에 대한 관심이 폭주하기 시작했어요.이번 포스팅 시리즈는 초기 LM부터 LLM까지 자연어 처리 모델이 어떻게 &quot; data-og-host=&quot;jaeyoon-95.tistory.com&quot; data-og-source-url=&quot;https://jaeyoon-95.tistory.com/265&quot; data-og-url=&quot;https://jaeyoon-95.tistory.com/265&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cSQu9J/hyYqYPxKWI/nUZ0GrRUZmT05LDTgL2z60/img.png?width=800&amp;amp;height=369&amp;amp;face=0_0_800_369,https://scrap.kakaocdn.net/dn/LynFK/hyYmMQKzcC/KSkZPu8K19EBCxZ8HTkEEK/img.png?width=800&amp;amp;height=369&amp;amp;face=0_0_800_369,https://scrap.kakaocdn.net/dn/hrMH8/hyYrPxTzrA/FkuDR8nvdlsf1WLskZFmhk/img.png?width=2138&amp;amp;height=988&amp;amp;face=0_0_2138_988&quot;&gt;&lt;a href=&quot;https://jaeyoon-95.tistory.com/265&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jaeyoon-95.tistory.com/265&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cSQu9J/hyYqYPxKWI/nUZ0GrRUZmT05LDTgL2z60/img.png?width=800&amp;amp;height=369&amp;amp;face=0_0_800_369,https://scrap.kakaocdn.net/dn/LynFK/hyYmMQKzcC/KSkZPu8K19EBCxZ8HTkEEK/img.png?width=800&amp;amp;height=369&amp;amp;face=0_0_800_369,https://scrap.kakaocdn.net/dn/hrMH8/hyYrPxTzrA/FkuDR8nvdlsf1WLskZFmhk/img.png?width=2138&amp;amp;height=988&amp;amp;face=0_0_2138_988');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;자연어 처리 임베딩의 등장 배경과 종류&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;어느 순간부터 딥러닝이 점점 핫해지기 시작했는데요.OpenAI의 ChatGPT가 공개되면서 LLM에 대한 관심이 폭주하기 시작했어요.이번 포스팅 시리즈는 초기 LM부터 LLM까지 자연어 처리 모델이 어떻게&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jaeyoon-95.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 &lt;b&gt;&lt;u&gt;통계적 임베딩 종류중 하나인 LSA&lt;/u&gt;&lt;/b&gt;에 대해서 알아볼게요.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;003&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;LSA란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LSA(Latent Semantic Analysis)란 잠재 의미 분석이라고 하는데요. LSA는 문서의 잠재 의미를 파악하는 기법입니다. &lt;b&gt;&lt;u&gt;특이값 분해(SVD)를 활용하여 고차원 문서-단어 행렬을 저차원 의미 공간으로 변환하는 것이 핵심 원리&lt;/u&gt;&lt;/b&gt;인데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 말이 어렵게 느껴지시는 분들이 계실겁니다. 조금 더 쉽게 이야기해볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도서관에서 책을 정리하는 일을 하고 있다고 가정할게요. 책 표지에는 어떠한 글자들이 적혀있었지만, 모르는 나라 언어였기 때문에 의미를 자세히 이해하지 못했습니다. 그러다 '비슷한 단어가 많이 등장하는 책들은 같은 주제일 가능성이 크다'라는 생각을 하게 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;  책 1 : &quot;강아지는 귀엽다. 강아지는 사람을 잘 따른다.&quot;&lt;/li&gt;
&lt;li&gt;  책 2 : &quot;고양이는 독립적이고, 시크해서 더 귀엽다.&quot;&lt;/li&gt;
&lt;li&gt;  책 3 : &quot;강아지와 고양이는 너무 귀엽다.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 세 가지 책을 보면 강아지와 고양이는 모두 '귀엽다'라는 단어를 공유하고 있음을 발견할 수 있죠.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강아지 - 귀엽다, 고양이 - 귀엽다 따라서 강아지 - 고양이도 관련이 있음을 알 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼&lt;u&gt;&lt;b&gt; 비슷한 단어가 자주 나오는 문서를 묶어 주는 방법이 LSA&lt;/b&gt;&lt;/u&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 LSA가 어떤 과정을 거쳐서 처리되는지 살펴볼게요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이해를 돕기 위해 또 다른 예시를 정의할게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1. 문서-단어 행렬 생성(TDM, Term Document Matrix)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 예시로 한번 살펴볼게요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;  문서 1 : &quot;고양이는 귀엽고 빠르다.&quot;&lt;/li&gt;
&lt;li&gt;  문서 2 : &quot;강아지는 귀엽고 사랑스럽다.&quot;&lt;/li&gt;
&lt;li&gt;  문서 3 : &quot;고양이는 빠르고 독립적이다.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 133px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 13.1396%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;단어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.8313%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;고양이&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.8807%; text-align: center;&quot;&gt;&lt;b&gt;강아지&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.2528%; text-align: center;&quot;&gt;&lt;b&gt;귀엽다&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.3665%; text-align: center;&quot;&gt;&lt;b&gt;빠르다&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;사랑스럽다&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.2791%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;독립적이다&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 13.1396%; text-align: center; height: 19px;&quot;&gt;문서 1&lt;/td&gt;
&lt;td style=&quot;width: 11.8313%; text-align: center; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 13.8807%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 12.2528%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.3665%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: center; height: 19px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 16.2791%; text-align: center; height: 19px;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 13.1396%; text-align: center; height: 19px;&quot;&gt;문서 2&lt;/td&gt;
&lt;td style=&quot;width: 11.8313%; text-align: center; height: 19px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 13.8807%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.2528%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.3665%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: center; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 16.2791%; text-align: center; height: 19px;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 13.1396%; text-align: center; height: 19px;&quot;&gt;문서 3&lt;/td&gt;
&lt;td style=&quot;width: 11.8313%; text-align: center; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 13.8807%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 12.2528%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 11.3665%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 15%; text-align: center; height: 19px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 16.2791%; text-align: center; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위의 표를 하나의 행렬로 나타내자면 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-19 오후 9.44.20.png&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz0nK2/btsMPv0gO5K/2R9k5rJhTuMp9HuEEH4mY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz0nK2/btsMPv0gO5K/2R9k5rJhTuMp9HuEEH4mY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz0nK2/btsMPv0gO5K/2R9k5rJhTuMp9HuEEH4mY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz0nK2%2FbtsMPv0gO5K%2F2R9k5rJhTuMp9HuEEH4mY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;426&quot; height=&quot;166&quot; data-filename=&quot;스크린샷 2025-03-19 오후 9.44.20.png&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;2. 특이값 분해(SVD, Singular Value Decomposition)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특이값 분해는 행렬을 3개의 작은 행렬로 쪼개는 방법입니다. SVD는 &lt;b&gt;&lt;u&gt;복잡한 데이터를 단순하게 정리하는 마법같은 방법&lt;/u&gt;&lt;/b&gt;이라고 생각하면 되는데요. 아래와 같은 수식을 가집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-11 오후 9.58.15.png&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/19iRb/btsMIttALbH/x67549qsCV3KI4iykGwkB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/19iRb/btsMIttALbH/x67549qsCV3KI4iykGwkB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/19iRb/btsMIttALbH/x67549qsCV3KI4iykGwkB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F19iRb%2FbtsMIttALbH%2Fx67549qsCV3KI4iykGwkB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;196&quot; height=&quot;74&quot; data-filename=&quot;스크린샷 2025-03-11 오후 9.58.15.png&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;U : 문서의 특성을 나타내는 행렬(직교 행렬 mxm)&lt;/li&gt;
&lt;li&gt;&amp;Sigma; : 중요한 정보를 담고 있는 대각 행렬(직교 행렬 mxn)&lt;/li&gt;
&lt;li&gt;V^T : 단어의 특성을 나타내는 행렬(직사각 대각 행렬 nxn)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 직교 행렬 : 자신과 자신의 전치 행렬의 곱 또는 이를 반대로 곱한 결과가 단위행렬이 되는 행렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 대각행렬 : 주대각선을 제외한 곳의 원소가 모두 0인 행렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SVD의 개념이 헷갈리신다면 아래 포스팅에서 확인하시면 좋을 것 같아요!&lt;/p&gt;
&lt;figure id=&quot;og_1742388412832&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;특이값 분해(SVD) 쉽게 이해하기&quot; data-og-description=&quot;특이값 분해 SVD는 머신러닝 공부하시는 분들은 정말 많이 들어보셨을 겁니다.생각보다 개념이 어렵기도 하고, 보고 봐도 이해가 잘 안되는 경우가 많을겁니다.이번 포스팅에서는 최대한 쉽게 &quot; data-og-host=&quot;jaeyoon-95.tistory.com&quot; data-og-source-url=&quot;https://jaeyoon-95.tistory.com/269&quot; data-og-url=&quot;https://jaeyoon-95.tistory.com/269&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dKkppJ/hyYqb30wIZ/KKOmxWg0ABUsLbEXXWh8XK/img.png?width=224&amp;amp;height=76&amp;amp;face=0_0_224_76,https://scrap.kakaocdn.net/dn/bps5lJ/hyYqOnqYkH/Z7hn31YUT9WHKixulS9JJk/img.png?width=224&amp;amp;height=76&amp;amp;face=0_0_224_76,https://scrap.kakaocdn.net/dn/bEiaRP/hyYurc0csy/EzhRz0T4BeWfQVuKK1wCq1/img.png?width=624&amp;amp;height=446&amp;amp;face=0_0_624_446&quot;&gt;&lt;a href=&quot;https://jaeyoon-95.tistory.com/269&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jaeyoon-95.tistory.com/269&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dKkppJ/hyYqb30wIZ/KKOmxWg0ABUsLbEXXWh8XK/img.png?width=224&amp;amp;height=76&amp;amp;face=0_0_224_76,https://scrap.kakaocdn.net/dn/bps5lJ/hyYqOnqYkH/Z7hn31YUT9WHKixulS9JJk/img.png?width=224&amp;amp;height=76&amp;amp;face=0_0_224_76,https://scrap.kakaocdn.net/dn/bEiaRP/hyYurc0csy/EzhRz0T4BeWfQVuKK1wCq1/img.png?width=624&amp;amp;height=446&amp;amp;face=0_0_624_446');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;특이값 분해(SVD) 쉽게 이해하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;특이값 분해 SVD는 머신러닝 공부하시는 분들은 정말 많이 들어보셨을 겁니다.생각보다 개념이 어렵기도 하고, 보고 봐도 이해가 잘 안되는 경우가 많을겁니다.이번 포스팅에서는 최대한 쉽게&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jaeyoon-95.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 위의 값을 하나씩 구해볼게요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-19 오후 9.53.51.png&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZtxBx/btsMQDJMVCJ/AvjxFdc9ZDqsWvx9AAZjd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZtxBx/btsMQDJMVCJ/AvjxFdc9ZDqsWvx9AAZjd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZtxBx/btsMQDJMVCJ/AvjxFdc9ZDqsWvx9AAZjd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZtxBx%2FbtsMQDJMVCJ%2FAvjxFdc9ZDqsWvx9AAZjd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;431&quot; height=&quot;132&quot; data-filename=&quot;스크린샷 2025-03-19 오후 9.53.51.png&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;U는 문서들의 관계를 나타내는 행렬&lt;/b&gt;&lt;/u&gt;이라고 보시면 되는데요. 각 문서를 고유벡터로 표현하는 행렬이고, 비슷한 문서일수록 벡터가 비슷합니다. 문서 1은 (-0.577, -0.707, 0.408), 문서 2는 (-0.577, 0.707, 0.408), 문서 3은 (-0.577, 0, -0.816)입니다. 두 문서가 비슷할수록 이 두 벡터간의 거리는 가까워요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-19 오후 9.54.33.png&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3GceU/btsMO67LfJ2/0W62VsWNzerC7Ok4o0PEDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3GceU/btsMO67LfJ2/0W62VsWNzerC7Ok4o0PEDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3GceU/btsMO67LfJ2/0W62VsWNzerC7Ok4o0PEDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3GceU%2FbtsMO67LfJ2%2F0W62VsWNzerC7Ok4o0PEDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;470&quot; height=&quot;142&quot; data-filename=&quot;스크린샷 2025-03-19 오후 9.54.33.png&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;V^T는 각 단어벡터들의 관계를 나타내는 행렬&lt;/b&gt;&lt;/u&gt;이라고 보시면 되는데요. 각 열이 하나의 단어라고 생각하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 고양이는 (-0.577, 0.577, -0.577, 0, 0, 0), 강아지는 (-0.577, 0.577, -0.577, 0, 0, 0)입니다. 두 벡터가 거의 동일하기 때문에, 문서에서 비슷한 의미로 쓰일 가능성이 큽니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-19 오후 9.53.54.png&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccsj2K/btsMQG0FXft/pfXKKLusaWYBRgaAkBwBcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccsj2K/btsMQG0FXft/pfXKKLusaWYBRgaAkBwBcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccsj2K/btsMQG0FXft/pfXKKLusaWYBRgaAkBwBcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fccsj2K%2FbtsMQG0FXft%2FpfXKKLusaWYBRgaAkBwBcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;129&quot; data-filename=&quot;스크린샷 2025-03-19 오후 9.53.54.png&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;&amp;Sigma;는 중요한 정보를 담고있는 주제&lt;/b&gt;&lt;/u&gt;라고 생각하시면 됩니다. 즉, 데이터 내에 가장 중요한 패턴과 그 강도를 나타내는 숫자들인데요. 값이 클수록 강력하다고 생각하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;3. 차원 축소(k값 선택)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LSA의 핵심 목표는 &lt;b&gt;&lt;u&gt;문서와 단어 간의 잠재적인 의미를 추출&lt;/u&gt;&lt;/b&gt;하는 것인데, 원본 문서-단어 행렬은 고차원이고, 단어들은 문맥에 따라 다른 의미를 가질 수 있죠. SVD를 통해서 차원을 축소하면 중요한 의미 구조만 남기고, 불필요한 정보는 제거할 수 있었어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 과정 이후 k를 설정하여 그 만큼 차원을 더 줄이는데요. 이 과정은 아래와 같은 이유 때문에 진행됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동의어나 유사한 의미를 가진 단어 통합(동일한 의미를 가진 문서를 유사 벡터로 표현)&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;차원 축소를 하면 '충성스럽다', '믿을만하다'같은 단어가 비슷한 의미를 공유하도록 변환됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;노이즈 제거
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 문서에만 등장하는 단어나, 데이터에 포함된 불필요한 단어들은 의미있는 정보가 아닙니다.&lt;/li&gt;
&lt;li&gt;따라서 차원을 축소하면 노이즈가 제거되어 더 깔끔한 의미 공간을 만들 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;차원의 저주 해결
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;차원의 저주는 행렬에 값이 별로 안들어있고, 다른 값들은 모두 0인데, 크기가 엄청 큰 비효율적인 행렬을 뜻합니다.&lt;/li&gt;
&lt;li&gt;이 행렬은 연산이 비효율적이며, 학습도 매우 어렵습니다.&lt;/li&gt;
&lt;li&gt;차원 축소를 한다면, 연산 효율이 증가하고, 의미 구조를 더 효과적으로 학습할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차원 축소하는 것은 어렵지 않습니다. 예를 들어 k = 2라고 한다면, 각 U, V^T, &amp;Sigma;값은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;k=2로 차원이 축소된 U&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-19 오후 10.37.53.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1ScBB/btsMOXC661h/IJgDIA1tA5FYAVpASCzv6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1ScBB/btsMOXC661h/IJgDIA1tA5FYAVpASCzv6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1ScBB/btsMOXC661h/IJgDIA1tA5FYAVpASCzv6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1ScBB%2FbtsMOXC661h%2FIJgDIA1tA5FYAVpASCzv6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;116&quot; data-filename=&quot;스크린샷 2025-03-19 오후 10.37.53.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;k=2로 차원이 축소된 V^T&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-19 오후 10.38.49.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MMO3Z/btsMQp5XcGn/4fwhl1jJdHDZzQWNmzrfC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MMO3Z/btsMQp5XcGn/4fwhl1jJdHDZzQWNmzrfC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MMO3Z/btsMQp5XcGn/4fwhl1jJdHDZzQWNmzrfC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMMO3Z%2FbtsMQp5XcGn%2F4fwhl1jJdHDZzQWNmzrfC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;476&quot; height=&quot;83&quot; data-filename=&quot;스크린샷 2025-03-19 오후 10.38.49.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;k=2로 차원이 축소된 &amp;Sigma;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-19 오후 10.39.08.png&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SOKZI/btsMQBL0Wgm/ez3A9eKn8kay1aJ3EZjBIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SOKZI/btsMQBL0Wgm/ez3A9eKn8kay1aJ3EZjBIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SOKZI/btsMQBL0Wgm/ez3A9eKn8kay1aJ3EZjBIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSOKZI%2FbtsMQBL0Wgm%2Fez3A9eKn8kay1aJ3EZjBIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;466&quot; height=&quot;84&quot; data-filename=&quot;스크린샷 2025-03-19 오후 10.39.08.png&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느정도로 차원을 축소할 지 k만 잘 설정된다면, 차원의 축소는 어렵지 않게 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 k값을 잘 설정해 줘야 할텐데요. k값은 어떻게 설정해줘야할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;k값 선택을 잘 하기 위해서는 아래와 같은 방법들이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;(1) Cumulative&amp;nbsp;Explained&amp;nbsp;Variance&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특이값의 크기가 데이터의 중요도를 나타내기 떄문에, Cumulative Explained Variance가 90%이상을 유지하는 최소 차원을 선택하면 좋습니다. 즉, 특이값이 크고 중요한 차원만 남기고 나머지는 제거하는 방법이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;(2) Elbow Method&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;k를 여러 개 설정하고, Cumulative Explained Variance을 그래프로 그려서 급격한 변화가 멈추는 지점을 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차원이 높을수록 정보량은 증가하지만, 특정 짖머에서는 증가량이 급격히 감소합니다. 이 꺾이는 점이 최적의 차원이라고 할 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(3) 경험적 최적 차원 선택&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터마다 최적 차원수가 다르긴 하지만, 일반적으로 아래와 같이 나옵니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작은 데이터셋 : 50 ~ 100차원&lt;/li&gt;
&lt;li&gt;중간 크기 데이터셋 : 100 ~ 300차원&lt;/li&gt;
&lt;li&gt;대형 데이터셋 : 300 ~ 500차원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경험적으로 위 범위 내에서 테스트한 뒤, 성능 최적화가 될 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;구현&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;/span&gt;코드로 구현하면 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이브러리 사용한 버전과 안한버전 둘 다 있으니 살펴 보시면 좋을 것 같아요.&lt;/p&gt;
&lt;pre id=&quot;code_1742392080234&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
from sklearn.decomposition import TruncatedSVD

# 문서-단어 행렬 (예제 데이터)
A = np.array([[1, 0, 1, 1, 0, 0],
              [0, 1, 1, 0, 1, 0],
              [1, 0, 0, 1, 0, 1]])

# 1. 라이브러리 사용 (sklearn TruncatedSVD)
k = 2  # 축소할 차원 수
svd = TruncatedSVD(n_components=k)
A_reduced_sklearn = svd.fit_transform(A)
print(&quot;LSA (라이브러리 사용) - 차원 축소된 문서 행렬:&quot;)
print(A_reduced_sklearn)

# 2. 직접 구현 (numpy SVD)
U, Sigma, VT = np.linalg.svd(A, full_matrices=False)
Sigma_k = np.diag(Sigma[:k])  # 상위 k개 특이값만 선택
U_k = U[:, :k]  # U에서 k개 차원 선택
A_reduced_manual = np.dot(U_k, Sigma_k)  # 차원 축소 적용

print(&quot;\nLSA (직접 구현) - 차원 축소된 문서 행렬:&quot;)
print(A_reduced_manual)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;장단점&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt; 단어간 의미적 관계 파악 가능&lt;br /&gt;- TF-IDF는 단순 빈도수로 계산했지만, SVD를 통해 단어 간 숨겨진 의미 관계를 찾을 수 있습니다.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt; 차원 축소를 통한 연산 속도 향상&lt;br /&gt;&lt;/span&gt;- 차원을 줄이면, 메모리 사용량이 줄기 때문에 연산 속도가 빨라집니다.&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt; 노이즈 제거 효과&lt;br /&gt;&lt;/span&gt;- 문서 간의 의미적 유사도를 측정할 때 , 덜 중요한 정보를 자동으로 제거하는 효과가 있습니다.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt; 검색 시스템에 활용 가능&lt;br /&gt;&lt;/span&gt;- 검색어가 정확히 일치하지 않더라도, 의미적으로 유사한 문서를 검색할 수 있습니다.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt; 새로운 단어 추가시 다시 계산 필요&lt;br /&gt;- SVD는 한 번 계산된 후 새로운 문서가 추가되면 다시 전체 데이터를 계산해야합니다.&lt;br /&gt;- 즉, 동적으로 변하는 환경에서 적용하기가 어렵습니다.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt; 결과 해석의 어려움&lt;br /&gt;&lt;/span&gt;- LSA는 통계적 기법을 기반으로 하기 때문에, 각 차원이 어떤 의미인지 명확하게 해석하기가 어렵습니다.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt; 단어 순서를 고려하지 않음&lt;br /&gt;&lt;/span&gt;- 단어의 순서는 전혀 고려하지 않고, 등장 빈도위주로 사용을 합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;사용하는 곳&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.4186%; text-align: center;&quot;&gt;&lt;b&gt;사용처&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.5814%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.4186%; text-align: center;&quot;&gt;검색 엔진&lt;/td&gt;
&lt;td style=&quot;width: 75.5814%;&quot;&gt;검색어와 정확히 일치하지 않아도, 의미적으로 유사한 문서를 찾을 수 있기 때문에, 검색엔진에도 쓰일 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.4186%; text-align: center;&quot;&gt;문서 분류&amp;amp;토픽 모델링&lt;/td&gt;
&lt;td style=&quot;width: 75.5814%;&quot;&gt;문서에 등장하는 단어의 패턴을 분석하여 자동으로 분류하는 데 사용됩니다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.4186%; text-align: center;&quot;&gt;추천 시스템&lt;/td&gt;
&lt;td style=&quot;width: 75.5814%;&quot;&gt;사용자가 읽은 문서나 본 영화의 내용을 분석하여, 의미적으로 유사한 콘텐츠를 추천할 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.4186%; text-align: center;&quot;&gt;의미 분석&lt;/td&gt;
&lt;td style=&quot;width: 75.5814%;&quot;&gt;문장에서 단어 간의 의미적 유사성을 분석할 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.4186%; text-align: center;&quot;&gt;문서 요약&lt;/td&gt;
&lt;td style=&quot;width: 75.5814%;&quot;&gt;긴 문서에서 핵심 내용을 뽑아내는 작업에 사용될 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅은 통계적 임베딩 방법 중 하나인 LSA에 대해 알아봤습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;LSA는 문서-단어 간의 관계를 고려해서 임베딩해주는 방법&lt;/u&gt;&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 포스팅에서는 문서 내에 주제를 확률적으로 추출하는 기법인 LDA에 대해 알아볼게요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;질문있으시면 댓글 언제든지 남겨주세요!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;001&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능공부/자연어처리</category>
      <category>LSA</category>
      <category>임베딩</category>
      <category>자연어임베딩</category>
      <category>자연어처리</category>
      <category>자연어처리기초</category>
      <author>컴공누나</author>
      <guid isPermaLink="true">https://jaeyoon-95.tistory.com/270</guid>
      <comments>https://jaeyoon-95.tistory.com/270#entry270comment</comments>
      <pubDate>Wed, 19 Mar 2025 23:08:40 +0900</pubDate>
    </item>
    <item>
      <title>특이값 분해(SVD) 쉽게 이해하기</title>
      <link>https://jaeyoon-95.tistory.com/269</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;특이값 분해 SVD는 머신러닝 공부하시는 분들은 정말 많이 들어보셨을 겁니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;생각보다 개념이 어렵기도 하고, 보고 봐도 이해가 잘 안되는 경우가 많을겁니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 최대한 쉽게 특이값 분해에 대해 알려드리려고 하는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;혹시나 이해가 되지 않는다면 언제든지 댓글 남겨주세요!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;001&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;특이값 분해(SVD,Singular&amp;nbsp;Value&amp;nbsp;Decomposition)란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특이값 분해는 &lt;u&gt;&lt;b&gt;행렬을 여러 개의 작은 행렬로 쪼개서 더 쉽게 다룰 수 있도록 만드는 방법&lt;/b&gt;&lt;/u&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서 밴드 음악이 있다고 가정해볼게요. 이 밴드 음악에는 기타, 드럼, 베이스, 보컬이 하나로 섞여 만들어지죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 우리가 베이스를 연습하는 사람들이라고 한다면, 이 음악에서 베이스 소리만 똑 떼어내서 들으면 참 좋겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 기타, 드럼, 보컬 소리를 제거하고, 베이스 소리만 남기게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 바로 특이값 분해인데요. &lt;b&gt;&lt;u&gt;행렬을 여러개의 중요한 부분으로 쪼개서, 원하는(중요한) 정보만 남길 수 있게 해주는 방법&lt;/u&gt;&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;특이값 분해 계산 방법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특이값 분해는 아래의 식을 만족합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 8.31.21.png&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vYpV3/btsMOrpW0y8/HA370OBLUKkaXyYy1q6sP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vYpV3/btsMOrpW0y8/HA370OBLUKkaXyYy1q6sP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vYpV3/btsMOrpW0y8/HA370OBLUKkaXyYy1q6sP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvYpV3%2FbtsMOrpW0y8%2FHA370OBLUKkaXyYy1q6sP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;224&quot; height=&quot;76&quot; data-filename=&quot;스크린샷 2025-03-18 오후 8.31.21.png&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A : mxn 크기의 원본 행렬&lt;/li&gt;
&lt;li&gt;U : mxm 크기의 직교 행렬&lt;/li&gt;
&lt;li&gt;&amp;Sigma; : mxn 크기의 대각 행렬&lt;/li&gt;
&lt;li&gt; ^  : nxn 크기의 직교 행렬&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직교, 대각 행렬이 뭔지 헷갈리시면 아래를 클릭하셔서 확인해주세요.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;직교 행렬&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직교 행렬은 자기 자신의 전치 행렬과 역행렬이 동일한 행렬입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 행렬 Q가 직교행렬이 되려면 아래의 조건을 만족해야합니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 8.43.27.png&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wmX5T/btsMNza5Lqb/RisMtSk95kU4Nn5TM8HNi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wmX5T/btsMNza5Lqb/RisMtSk95kU4Nn5TM8HNi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wmX5T/btsMNza5Lqb/RisMtSk95kU4Nn5TM8HNi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwmX5T%2FbtsMNza5Lqb%2FRisMtSk95kU4Nn5TM8HNi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;314&quot; height=&quot;92&quot; data-filename=&quot;스크린샷 2025-03-18 오후 8.43.27.png&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;특징은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역행렬이 전치행렬과 같다.&lt;/li&gt;
&lt;li&gt;벡터의 길이를 유지한다.&lt;/li&gt;
&lt;li&gt;직교 행렬의 열과 행은 서로 직교하며, 크기가 1인 단위벡터이다.(서로 수직이며 길이가 1이다)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구체적인 예를 들자면 아래와 같은 행렬이 직교 행렬이라 할 수 있겠습니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 8.44.42.png&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1kSWt/btsMN6GnK0g/jr3chqleXGYksV3qteAOS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1kSWt/btsMN6GnK0g/jr3chqleXGYksV3qteAOS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1kSWt/btsMN6GnK0g/jr3chqleXGYksV3qteAOS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1kSWt%2FbtsMN6GnK0g%2Fjr3chqleXGYksV3qteAOS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;302&quot; height=&quot;154&quot; data-filename=&quot;스크린샷 2025-03-18 오후 8.44.42.png&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;대각 행렬&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대각 행렬은 대각선 이외의 원소가 모두 0인 행렬입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 아래와 같은 형태를 만족합니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 8.45.42.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVidCU/btsMNpsT6hW/1nTQFKjwTV2TFBmVkKIPK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVidCU/btsMNpsT6hW/1nTQFKjwTV2TFBmVkKIPK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVidCU/btsMNpsT6hW/1nTQFKjwTV2TFBmVkKIPK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVidCU%2FbtsMNpsT6hW%2F1nTQFKjwTV2TFBmVkKIPK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;241&quot; height=&quot;121&quot; data-filename=&quot;스크린샷 2025-03-18 오후 8.45.42.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;대각 원소는 모두 0이 아니어야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특이값 분해는 원본 행렬인 A를 좌측 특이벡터 U, 특이값 행렬 &amp;Sigma;, 특이 벡터 행렬  ^ 으로 나눕니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 예를 들어서 계산을 하나씩 해볼텐데요. 차근차근 따라와주세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시나 왜 이수식이 나왔는지 이해가 안된다면, &lt;b&gt;&lt;u&gt;아래에서 유도해드릴테니, 일단은 한번 읽어주세요!&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A행렬은 다음과 같이 정의하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 8.53.30.png&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9evsz/btsMOjyN7mb/hfEVHWao26geLv8zsu4c7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9evsz/btsMOjyN7mb/hfEVHWao26geLv8zsu4c7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9evsz/btsMOjyN7mb/hfEVHWao26geLv8zsu4c7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9evsz%2FbtsMOjyN7mb%2FhfEVHWao26geLv8zsu4c7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;286&quot; height=&quot;144&quot; data-filename=&quot;스크린샷 2025-03-18 오후 8.53.30.png&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;(1) A^TA와 AA^T계산&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch8AKH/btsMOD4JPOn/32JpzUo64f88p7ibwFSk80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch8AKH/btsMOD4JPOn/32JpzUo64f88p7ibwFSk80/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;446&quot; data-filename=&quot;스크린샷 2025-03-18 오후 8.54.52.png&quot; style=&quot;width: 46.3961%; margin-right: 10px;&quot; data-widthpercent=&quot;46.94&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch8AKH/btsMOD4JPOn/32JpzUo64f88p7ibwFSk80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch8AKH%2FbtsMOD4JPOn%2F32JpzUo64f88p7ibwFSk80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;624&quot; height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8goyA/btsMOsI4UvN/UFjvkGzvL33JXk3uheg20K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8goyA/btsMOsI4UvN/UFjvkGzvL33JXk3uheg20K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;344&quot; data-filename=&quot;스크린샷 2025-03-18 오후 8.55.01.png&quot; style=&quot;width: 52.4411%;&quot; data-widthpercent=&quot;53.06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8goyA/btsMOsI4UvN/UFjvkGzvL33JXk3uheg20K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8goyA%2FbtsMOsI4UvN%2FUFjvkGzvL33JXk3uheg20K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;544&quot; height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 과정은 고유값과, 고유벡터를 구하는 과정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;(2) 특이값 &amp;Sigma; 구하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.01.26.png&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSrJG2/btsMPJXemAe/N4RFfqic2shgFO1uBolOak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSrJG2/btsMPJXemAe/N4RFfqic2shgFO1uBolOak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSrJG2/btsMPJXemAe/N4RFfqic2shgFO1uBolOak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSrJG2%2FbtsMPJXemAe%2FN4RFfqic2shgFO1uBolOak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;206&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.01.26.png&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 고유값을 구하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.01.59.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LOt7k/btsMPlP6ZzQ/EaD0o0bKDlTHm9fzwmb5MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LOt7k/btsMPlP6ZzQ/EaD0o0bKDlTHm9fzwmb5MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LOt7k/btsMPlP6ZzQ/EaD0o0bKDlTHm9fzwmb5MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLOt7k%2FbtsMPlP6ZzQ%2FEaD0o0bKDlTHm9fzwmb5MK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;392&quot; height=&quot;100&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.01.59.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 나오는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;특이값은 고유값의 제곱근&lt;/u&gt;&lt;/b&gt;으로 구할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이것도 왜 그런지 아래에서 설명해드릴게요)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.02.30.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI9LEL/btsMPrJhusd/vxSOeTMAc0lnWfkwAzlBT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI9LEL/btsMPrJhusd/vxSOeTMAc0lnWfkwAzlBT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI9LEL/btsMPrJhusd/vxSOeTMAc0lnWfkwAzlBT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI9LEL%2FbtsMPrJhusd%2FvxSOeTMAc0lnWfkwAzlBT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;514&quot; height=&quot;86&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.02.30.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값으로 대각행렬인 &amp;Sigma;를 구할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.02.54.png&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dansft/btsMOFasIpq/mVoj5hIzKkCiCcJSat0Xbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dansft/btsMOFasIpq/mVoj5hIzKkCiCcJSat0Xbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dansft/btsMOFasIpq/mVoj5hIzKkCiCcJSat0Xbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdansft%2FbtsMOFasIpq%2FmVoj5hIzKkCiCcJSat0Xbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;218&quot; height=&quot;136&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.02.54.png&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;(3) U와 V행렬 구하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A^TA의 고유벡터를 구하면 행렬  를 구할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.04.58.png&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1UQlJ/btsMPNk1SuT/FKOqumkmkCAyaVvr1EDlzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1UQlJ/btsMPNk1SuT/FKOqumkmkCAyaVvr1EDlzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1UQlJ/btsMPNk1SuT/FKOqumkmkCAyaVvr1EDlzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1UQlJ%2FbtsMPNk1SuT%2FFKOqumkmkCAyaVvr1EDlzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;294&quot; height=&quot;316&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.04.58.png&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서  ^ 는 다음과 같이 나올 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AA^T를 이용하면 U벡터를 구할 수 있는데요. AA^T의 고유벡터를 계산하면 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.06.01.png&quot; data-origin-width=&quot;304&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ghymm/btsMPRnkSMb/tOTjKeSzmJ3ekzH4ikFZuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ghymm/btsMPRnkSMb/tOTjKeSzmJ3ekzH4ikFZuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ghymm/btsMPRnkSMb/tOTjKeSzmJ3ekzH4ikFZuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGhymm%2FbtsMPRnkSMb%2FtOTjKeSzmJ3ekzH4ikFZuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;304&quot; height=&quot;124&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.06.01.png&quot; data-origin-width=&quot;304&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 최종적으로는 다음과 같이 구해집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.07.02.png&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zTKNI/btsMOdennms/cFZ9cN2zi2gm8UoJtaYlWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zTKNI/btsMOdennms/cFZ9cN2zi2gm8UoJtaYlWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zTKNI/btsMOdennms/cFZ9cN2zi2gm8UoJtaYlWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzTKNI%2FbtsMOdennms%2FcFZ9cN2zi2gm8UoJtaYlWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;510&quot; height=&quot;183&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.07.02.png&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;특이값 분해 수식 유도&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특이값 분해가 왜 저런 수식을 가지게 되었는지 직접 유도해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;들어가기 전 &lt;b&gt;&lt;u&gt;특이값 분해는 고유값 분해를 일반화한 수식&lt;/u&gt;&lt;/b&gt;이라는 것을 알아주세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;(1) 고유값 분해&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고유값과 고유 벡터는 다음과 같은 수식을 만족하는데요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.18.15.png&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbwx86/btsMOtnHMDu/ZrTKnrb9k5dYPVDJ7WCLeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbwx86/btsMOtnHMDu/ZrTKnrb9k5dYPVDJ7WCLeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbwx86/btsMOtnHMDu/ZrTKnrb9k5dYPVDJ7WCLeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbwx86%2FbtsMOtnHMDu%2FZrTKnrb9k5dYPVDJ7WCLeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;96&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.18.15.png&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A : nxn 크기의 정방 행렬&lt;/li&gt;
&lt;li&gt;v : 행렬 A의 고유벡터 (0이 아닌 벡터)&lt;/li&gt;
&lt;li&gt;&amp;lambda; : 행렬 A의 고유값 (스칼라값)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 조건을 만족하고, 그 의미는 행렬 A가 벡터 v에 작용했을 때, 방향은 그대로고 크기만 &amp;lambda;배 변한다는 것을 의미해요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 고유값, 고유벡터를 모르신다면 아래 포스팅을 먼저 봐주세요!&lt;/p&gt;
&lt;figure id=&quot;og_1742300346314&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;가장 쉽게 설명하는 고유값과 고유벡터&quot; data-og-description=&quot;최근 자연어 처리의 기본에 대해 포스팅을 시작했는데요.통계적 임베딩을 설명하는데 반드시 필요한 개념인데,해당 포스팅에 담기에는 또 너무 길더라고요.그래서 고유값, 고유벡터 먼저 설명&quot; data-og-host=&quot;jaeyoon-95.tistory.com&quot; data-og-source-url=&quot;https://jaeyoon-95.tistory.com/268&quot; data-og-url=&quot;https://jaeyoon-95.tistory.com/268&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bCieU0/hyYupe28wg/QxfFoBrqXctGG6zVkQfdpk/img.png?width=212&amp;amp;height=98&amp;amp;face=0_0_212_98,https://scrap.kakaocdn.net/dn/tP0yN/hyYukkuJuV/cwGYFShxNFTrsr2DkymyZ0/img.png?width=212&amp;amp;height=98&amp;amp;face=0_0_212_98,https://scrap.kakaocdn.net/dn/1wACt/hyYunIijuL/ky8gtIZij5Qcc0OUZgKcJK/img.png?width=1068&amp;amp;height=396&amp;amp;face=0_0_1068_396&quot;&gt;&lt;a href=&quot;https://jaeyoon-95.tistory.com/268&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jaeyoon-95.tistory.com/268&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bCieU0/hyYupe28wg/QxfFoBrqXctGG6zVkQfdpk/img.png?width=212&amp;amp;height=98&amp;amp;face=0_0_212_98,https://scrap.kakaocdn.net/dn/tP0yN/hyYukkuJuV/cwGYFShxNFTrsr2DkymyZ0/img.png?width=212&amp;amp;height=98&amp;amp;face=0_0_212_98,https://scrap.kakaocdn.net/dn/1wACt/hyYunIijuL/ky8gtIZij5Qcc0OUZgKcJK/img.png?width=1068&amp;amp;height=396&amp;amp;face=0_0_1068_396');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;가장 쉽게 설명하는 고유값과 고유벡터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;최근 자연어 처리의 기본에 대해 포스팅을 시작했는데요.통계적 임베딩을 설명하는데 반드시 필요한 개념인데,해당 포스팅에 담기에는 또 너무 길더라고요.그래서 고유값, 고유벡터 먼저 설명&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jaeyoon-95.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약에 행렬 A의 고유벡터가 n개 있다고 가정해 볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 행렬을 V라고 정의하고 하나로 묶으면 아래와 같이 표현할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.24.41.png&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cALgjr/btsMNf43PsV/mPuatXixPQ697UixCYTr9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cALgjr/btsMNf43PsV/mPuatXixPQ697UixCYTr9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cALgjr/btsMNf43PsV/mPuatXixPQ697UixCYTr9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcALgjr%2FbtsMNf43PsV%2FmPuatXixPQ697UixCYTr9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;302&quot; height=&quot;67&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.24.41.png&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 전체 수식으로 다시 돌아와 볼게요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.25.44.png&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgdTWs/btsMPQaTJ4i/Z8jKpeUkWWr8n0hFOseFok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgdTWs/btsMPQaTJ4i/Z8jKpeUkWWr8n0hFOseFok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgdTWs/btsMPQaTJ4i/Z8jKpeUkWWr8n0hFOseFok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgdTWs%2FbtsMPQaTJ4i%2FZ8jKpeUkWWr8n0hFOseFok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;50&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.25.44.png&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 행렬 형태로 한번에 정리하면 아래와 같이 수식을 정리할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.28.01.png&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mJEgV/btsMOtgXMQx/xHkVAo4ya9fsdPeyys9jg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mJEgV/btsMOtgXMQx/xHkVAo4ya9fsdPeyys9jg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mJEgV/btsMOtgXMQx/xHkVAo4ya9fsdPeyys9jg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmJEgV%2FbtsMOtgXMQx%2FxHkVAo4ya9fsdPeyys9jg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;53&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.28.01.png&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 위에서 정의한 V에 의해 수식을 변환할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽은 각 고유벡터에 대응하는 고유값을 곱한것이기 때문에 다음과 같이 변환 가능합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.29.46.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BMwPj/btsMNKDyYhx/hxnMC8Q2m93DFvbZkoVrz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BMwPj/btsMNKDyYhx/hxnMC8Q2m93DFvbZkoVrz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BMwPj/btsMNKDyYhx/hxnMC8Q2m93DFvbZkoVrz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBMwPj%2FbtsMNKDyYhx%2FhxnMC8Q2m93DFvbZkoVrz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;169&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.29.46.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값을 우리는 &amp;Lambda;로 정의해줄 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.32.13.png&quot; data-origin-width=&quot;228&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lUMSY/btsMOEbxBr5/CrsqbgoEu3H17H7VGDC3ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lUMSY/btsMOEbxBr5/CrsqbgoEu3H17H7VGDC3ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lUMSY/btsMOEbxBr5/CrsqbgoEu3H17H7VGDC3ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlUMSY%2FbtsMOEbxBr5%2FCrsqbgoEu3H17H7VGDC3ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;228&quot; height=&quot;90&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.32.13.png&quot; data-origin-width=&quot;228&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;V의 역행렬을 곱해주면 아래의 수식을 구할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.32.58.png&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ywFtw/btsMOrXNpjc/KOFixK4MAZKOioWM9fQY6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ywFtw/btsMOrXNpjc/KOFixK4MAZKOioWM9fQY6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ywFtw/btsMOrXNpjc/KOFixK4MAZKOioWM9fQY6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FywFtw%2FbtsMOrXNpjc%2FKOFixK4MAZKOioWM9fQY6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;284&quot; height=&quot;66&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.32.58.png&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 행렬의 의미는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;V^-1 : 원래 좌표계를 &quot;고유 벡터 좌표계&quot;로 변환&lt;/li&gt;
&lt;li&gt;&amp;Lambda; : 고유값만큼 크기를 변환&lt;/li&gt;
&lt;li&gt;V : 다시 원래 좌표계로 돌림&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미를 한번 정리해보면 &lt;b&gt;&lt;u&gt;고유값 분해라는 것은 행렬을 고유벡터와 고유값을 이용해 분해하는 방법&lt;/u&gt;&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고유벡터 행렬 V를 이용해 원래 행렬을 변환한다면, 단순한 대각행렬인 &amp;Lambda;으로 표현할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 위의 수식을 통해 &lt;b&gt;&lt;u&gt;&quot;축을 따라 크기만 변하는 연산&quot;&lt;/u&gt;&lt;/b&gt;으로 해석될 수 있다는 이야기죠!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이게 왜 특이값 분해랑 연관이 있는 걸까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 고유값 분해는 &lt;b&gt;&lt;u&gt;행과 열의 크기가 같은 정방행렬에서만 적용이 가능&lt;/u&gt;&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;&lt;u&gt;직사각형(비정방) 행렬에서는 적용할 수 없다는 단점&lt;/u&gt;&lt;/b&gt;이 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 더 일반적인 방법인 SVD가 필요하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;(2) 일반적인 고유값 분해 SVD&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 SVD는 직사각 행렬도 가능하게 만든다고 말씀드렸습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 수식 자체가 정사각 행렬 계산으로 되기 때문에, 한 번에 직사각 행렬로 계산하게 된다면, 수정되는 부분이 굉장히 많을텐데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 우리는 직사각 행렬 A를 아래와 같이 만들어줄 수 있어요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.44.37.png&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXuhcu/btsMOZfsTaB/VzC9fd8FJekQMJNIn5aMaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXuhcu/btsMOZfsTaB/VzC9fd8FJekQMJNIn5aMaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXuhcu/btsMOZfsTaB/VzC9fd8FJekQMJNIn5aMaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXuhcu%2FbtsMOZfsTaB%2FVzC9fd8FJekQMJNIn5aMaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;52&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.44.37.png&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A가 mxn크기를 가진다고 하면, nxm크기를 가지는 A^T를 곱해줄 때 mxm, 혹은 nxn크기를 가지게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 이 값은 정방행렬이 되겠죠!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.46.23.png&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oamkv/btsMN76mKRp/CNUk36yo1jiuS7LdjrEHB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oamkv/btsMN76mKRp/CNUk36yo1jiuS7LdjrEHB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oamkv/btsMN76mKRp/CNUk36yo1jiuS7LdjrEHB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foamkv%2FbtsMN76mKRp%2FCNUk36yo1jiuS7LdjrEHB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;316&quot; height=&quot;85&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.46.23.png&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 위에서 알게된 고유값 분해 수식에 대입할 수 있게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.47.10.png&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6ofvt/btsMOq5FYgn/KV5LNkv51tbUAZhUZeFZ91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6ofvt/btsMOq5FYgn/KV5LNkv51tbUAZhUZeFZ91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6ofvt/btsMOq5FYgn/KV5LNkv51tbUAZhUZeFZ91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6ofvt%2FbtsMOq5FYgn%2FKV5LNkv51tbUAZhUZeFZ91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;270&quot; height=&quot;80&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.47.10.png&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;V, &amp;Lambda; 값은 이렇게 정의할 수 있게 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;V : A^TA의 고유벡터 행렬&lt;/li&gt;
&lt;li&gt;&amp;Lambda; : A^TA의 고유값 행렬&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 AA^T도 대입해 줄 수 있는데요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.48.59.png&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2omtn/btsMOFhehw1/5xaPrXe2mbnNDTMvKKwzs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2omtn/btsMOFhehw1/5xaPrXe2mbnNDTMvKKwzs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2omtn/btsMOFhehw1/5xaPrXe2mbnNDTMvKKwzs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2omtn%2FbtsMOFhehw1%2F5xaPrXe2mbnNDTMvKKwzs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;294&quot; height=&quot;82&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.48.59.png&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U, &amp;Lambda;값은 이렇게 정의할 수 있게 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;U : AA^T의 고유벡터 행렬&lt;/li&gt;
&lt;li&gt;&amp;Lambda; : AA^T의 고유값 행렬&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 수식에서 보면 &lt;b&gt;&lt;u&gt;고유 벡터 행렬은 다르지만, 고유값 행렬은 동일한 것을 확인&lt;/u&gt;&lt;/b&gt;할 수 있는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 아래 펼치기에서 상세하게 확인하실 수 있어요.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 A^TA의 고유값과 고유벡터 수식 정의를 하면 다음과 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.58.34.png&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZvPL3/btsMPztGi3h/qDiSlpMnKy3QuTNhLwfDCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZvPL3/btsMPztGi3h/qDiSlpMnKy3QuTNhLwfDCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZvPL3/btsMPztGi3h/qDiSlpMnKy3QuTNhLwfDCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZvPL3%2FbtsMPztGi3h%2FqDiSlpMnKy3QuTNhLwfDCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;240&quot; height=&quot;92&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.58.34.png&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;이제 왼쪽에 A행렬을 곱해주겠습니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.59.32.png&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sq3Sv/btsMNrROmDx/1WIvDsqxKEzSmX2KgBH79K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sq3Sv/btsMNrROmDx/1WIvDsqxKEzSmX2KgBH79K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sq3Sv/btsMNrROmDx/1WIvDsqxKEzSmX2KgBH79K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSq3Sv%2FbtsMNrROmDx%2F1WIvDsqxKEzSmX2KgBH79K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;76&quot; data-filename=&quot;스크린샷 2025-03-18 오후 9.59.32.png&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;이를 새로 정리하면 아래와 같이 할 수 있습니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 10.00.03.png&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBfenY/btsMPPC5tEW/EKdcO1aKEAjakpLe2BIS3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBfenY/btsMPPC5tEW/EKdcO1aKEAjakpLe2BIS3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBfenY/btsMPPC5tEW/EKdcO1aKEAjakpLe2BIS3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBfenY%2FbtsMPPC5tEW%2FEKdcO1aKEAjakpLe2BIS3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;263&quot; height=&quot;67&quot; data-filename=&quot;스크린샷 2025-03-18 오후 10.00.03.png&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Av를 새로운 벡터라고 정의한다면, AA^T에 대한 고유값, 고유벡터 정의가 가능해집니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 10.00.51.png&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJKHmx/btsMPtNRQLB/jaCNUUug1Eeb8MCjB7tNr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJKHmx/btsMPtNRQLB/jaCNUUug1Eeb8MCjB7tNr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJKHmx/btsMPtNRQLB/jaCNUUug1Eeb8MCjB7tNr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJKHmx%2FbtsMPtNRQLB%2FjaCNUUug1Eeb8MCjB7tNr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;233&quot; height=&quot;76&quot; data-filename=&quot;스크린샷 2025-03-18 오후 10.00.51.png&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lambda;는 모든 식에서 동일하게 등장하는 것을 알 수 있죠.&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;따라서 AA^T, A^TA의 고유값은 동일하다&lt;/u&gt;&lt;/b&gt;고 할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SVD설명할 때 &lt;b&gt;&lt;u&gt;&quot;특이값은 고유값의 제곱근으로 설정한다&quot;&lt;/u&gt;&lt;/b&gt;라고 말씀드렸는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특이값은 실제 변형된 크기를 나타내야하는데, 우리가 정방행렬로 만들려고 AA^T, A^TA처럼 A행렬을 두 번 곱해줬습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;u&gt;&lt;b&gt;원래 크기를 알고싶다면 제곱근&lt;/b&gt;&lt;/u&gt;을 취해줘야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 수식을 얻을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 10.07.09.png&quot; data-origin-width=&quot;194&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzqJ2y/btsMN7L1XdU/xFl3IruywHHKIIM7sNGNV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzqJ2y/btsMN7L1XdU/xFl3IruywHHKIIM7sNGNV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzqJ2y/btsMN7L1XdU/xFl3IruywHHKIIM7sNGNV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzqJ2y%2FbtsMN7L1XdU%2FxFl3IruywHHKIIM7sNGNV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;194&quot; height=&quot;70&quot; data-filename=&quot;스크린샷 2025-03-18 오후 10.07.09.png&quot; data-origin-width=&quot;194&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 원래 행렬인 A를 위에서 구했던, U, V, &amp;Sigma;로 표현해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A^TA의 고유값과 고유벡터 수식을 적용시켜볼게요.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.13.27.png&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V86fK/btsMPjY42T8/k1lxxM527FWQtlFNpje5ZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V86fK/btsMPjY42T8/k1lxxM527FWQtlFNpje5ZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V86fK/btsMPjY42T8/k1lxxM527FWQtlFNpje5ZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV86fK%2FbtsMPjY42T8%2Fk1lxxM527FWQtlFNpje5ZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;268&quot; height=&quot;74&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.13.27.png&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 양 변에 A를 곱해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.14.55.png&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vH1FM/btsMOb8LcWK/LucmnKMwnIw3AxdSIv8HuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vH1FM/btsMOb8LcWK/LucmnKMwnIw3AxdSIv8HuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vH1FM/btsMOb8LcWK/LucmnKMwnIw3AxdSIv8HuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvH1FM%2FbtsMOb8LcWK%2FLucmnKMwnIw3AxdSIv8HuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;348&quot; height=&quot;90&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.14.55.png&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lambda;는 스칼라이기 때문에 다음과 같이 앞으로 뺄 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.15.17.png&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJB1eO/btsMOrQ2v5E/klJABdKpk5bh5sKyMIKYqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJB1eO/btsMOrQ2v5E/klJABdKpk5bh5sKyMIKYqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJB1eO/btsMOrQ2v5E/klJABdKpk5bh5sKyMIKYqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJB1eO%2FbtsMOrQ2v5E%2FklJABdKpk5bh5sKyMIKYqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;88&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.15.17.png&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 다음과 같은 수식이 만들어집니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 두 행렬의 고유값이 같은지 증명할 때와 비슷한 유도식이 나오게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.15.56.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjql3q/btsMOrjdhgH/ckMPh8OjZQZUITFcN3VtS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjql3q/btsMOrjdhgH/ckMPh8OjZQZUITFcN3VtS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjql3q/btsMOrjdhgH/ckMPh8OjZQZUITFcN3VtS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjql3q%2FbtsMOrjdhgH%2FckMPh8OjZQZUITFcN3VtS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;344&quot; height=&quot;84&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.15.56.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 식을 보면 Avi자체를 하나의 벡터로 보면, AA^T의 고유벡터라고 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 AA^T의 고유벡터는 ui이기 때문에, Avi는 ui의 배수 형태가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 수식을 적어줄 수가 있겠네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.19.10.png&quot; data-origin-width=&quot;208&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dj95U/btsMOQ3Zv2Q/Hpmqfsm2saMkmNowefoJ8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dj95U/btsMOQ3Zv2Q/Hpmqfsm2saMkmNowefoJ8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dj95U/btsMOQ3Zv2Q/Hpmqfsm2saMkmNowefoJ8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDj95U%2FbtsMOQ3Zv2Q%2FHpmqfsm2saMkmNowefoJ8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;208&quot; height=&quot;90&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.19.10.png&quot; data-origin-width=&quot;208&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 c값은 특이값인 &amp;Sigma;으로 바꿔주시면 됩니다. 왜 바꿔주는지는 위에서도 말씀 드렸습니다.(=원래 크기를 알고싶기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.22.45.png&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EpvYt/btsMOoUlUwS/KNdPAMzAqYrzBCtky94t31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EpvYt/btsMOoUlUwS/KNdPAMzAqYrzBCtky94t31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EpvYt/btsMOoUlUwS/KNdPAMzAqYrzBCtky94t31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEpvYt%2FbtsMOoUlUwS%2FKNdPAMzAqYrzBCtky94t31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;232&quot; height=&quot;86&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.22.45.png&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이렇게 표현이 가능하겠죠!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양 변에 V^-1를 곱해주면 우리가 알고있는 특이값 분해의 식이 완성됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.22.36.png&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byuAR1/btsMOPKPb7c/1HqRHwnenwS9aZ7ZwjFUOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byuAR1/btsMOPKPb7c/1HqRHwnenwS9aZ7ZwjFUOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byuAR1/btsMOPKPb7c/1HqRHwnenwS9aZ7ZwjFUOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyuAR1%2FbtsMOPKPb7c%2F1HqRHwnenwS9aZ7ZwjFUOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;244&quot; height=&quot;98&quot; data-filename=&quot;스크린샷 2025-03-18 오후 11.22.36.png&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;각 행렬의 의미&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특이값 분해가 나누는 것은 알겠는데, 각 행렬이 어떤 의미를 가지는지 궁금하시죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래서 하나씩 알려드릴게요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&lt;b&gt;U 행렬이 가지는 의미&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A행렬이 가진 &lt;b&gt;&lt;u&gt;기본적인 패턴&lt;/u&gt;&lt;/b&gt;을 나타내는 행렬입니다. U의 각 열은 A의 특징 패턴을 나타내는 벡터입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&lt;b&gt;&amp;Sigma;행렬이 가지는 의미&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A행렬이 가진 &lt;b&gt;&lt;u&gt;중요한 정보의 강도를 나타내는 행렬&lt;/u&gt;&lt;/b&gt;입니다. 숫자가 클수록 중요한 정보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;Sigma;는 대각행렬인데, 대각선에 특이값이 들어갑니다. 특히 데이터를 압축할 때 많이 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&lt;b&gt; ^ 행렬이 가지는 의미&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A행렬이 &lt;u&gt;&lt;b&gt;어떤 방향을 가지고 있는지 나타내는 행렬&lt;/b&gt;&lt;/u&gt;입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; ^ 의 행은 A의 원본 데이터가 어떤 방향으로 변하는지를 나타냅니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 특이값 분해 SVD에 대해 알아봤습니다!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;살짝 어려우실 수 있는데요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이해 안되시면 댓글로 질문남겨주세요~!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;003&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>인공지능공부/인공지능기본지식</category>
      <category>singularvaluedecomposition</category>
      <category>SVD</category>
      <category>머신러닝기초</category>
      <category>특이값분해</category>
      <category>특잇값분해</category>
      <author>컴공누나</author>
      <guid isPermaLink="true">https://jaeyoon-95.tistory.com/269</guid>
      <comments>https://jaeyoon-95.tistory.com/269#entry269comment</comments>
      <pubDate>Tue, 18 Mar 2025 23:25:31 +0900</pubDate>
    </item>
    <item>
      <title>가장 쉽게 설명하는 고유값과 고유벡터</title>
      <link>https://jaeyoon-95.tistory.com/268</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최근 자연어 처리의 기본에 대해 포스팅을 시작했는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;통계적 임베딩을 설명하는데 반드시 필요한 개념인데,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;해당 포스팅에 담기에는 또 너무 길더라고요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서&lt;b&gt; &lt;/b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;고유값, 고유벡터 먼저 설명한 뒤, 임베딩을 설명&lt;/b&gt;&lt;/span&gt;하려고합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서 고유값, 고유벡터를 정말 쉽게 설명하려고해요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;끝까지 잘 따라와주시면 감사할 것 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;질문과 의견은 언제든지 환영합니다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;고유값(Eigenvalue)과 고유 벡터(Eigenvector)란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선형대수 공부하면 나오는 용어이죠. 처음 배우시는 분들도 계시고 잠시 까먹으신 분들도 계실 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고유 벡터라고 하는 것은 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;방향이 변하지 않는 벡터&lt;/b&gt;&lt;/span&gt;입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 사람이 에스컬레이터를 탄다면, 방향이 변하지 않고 쭉 가죠. 이 때 사람이 고유벡터, 이동한 거리가 고유값이라고 할 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;고유값은 고유 벡터가 얼마나 늘어나거나, 줄어드는지 나타내는 값&lt;/b&gt;&lt;/span&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 회전문에 사람이 지나치면 사람의 방향이 완전 바뀌어버리게 됩니다. 이 것은 고유벡터가 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학적으로 행렬 A가 벡터 v에 대해 다음을 만족할 때&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.05.22.png&quot; data-origin-width=&quot;212&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFHYuV/btsMNISjWjj/Ma9rhl2pcdl7KLmFS1Q57k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFHYuV/btsMNISjWjj/Ma9rhl2pcdl7KLmFS1Q57k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFHYuV/btsMNISjWjj/Ma9rhl2pcdl7KLmFS1Q57k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFHYuV%2FbtsMNISjWjj%2FMa9rhl2pcdl7KLmFS1Q57k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;212&quot; height=&quot;98&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.05.22.png&quot; data-origin-width=&quot;212&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;v는 고유벡터&lt;/li&gt;
&lt;li&gt;&amp;lambda;는 고유값&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 정의합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미를 살펴보면 &lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;어떠한 행렬 A가 어떤 벡터 v에 작용했을 때, 방향은 그대로이고 크기만 &amp;lambda;배로 변한다는 것&lt;/span&gt;&lt;/b&gt;을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때&amp;nbsp; &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;v, &amp;lambda;값은 A의 고유벡터, 고유값&lt;/b&gt;&lt;/span&gt;이라고 불립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;고유값과 고유 벡터 구하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 고유값과 고유벡터에 대해서 알아봤으니, 이제는 어떻게 구하는지 한번 펴볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시로 보여드리는 것이 더 쉬울 것 같아서 A행렬을 아래와 같이 정의하도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.13.51.png&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvDFsl/btsMNb1Mz91/joTnlXhAXKac1k185uA5tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvDFsl/btsMNb1Mz91/joTnlXhAXKac1k185uA5tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvDFsl/btsMNb1Mz91/joTnlXhAXKac1k185uA5tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvDFsl%2FbtsMNb1Mz91%2FjoTnlXhAXKac1k185uA5tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;286&quot; height=&quot;150&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.13.51.png&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고유값, 고유 벡터를 구하기 위해서는 특성 방정식을 구해야하는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 이 개념을 모르겠다면, 아래 펼치기를 하셔서 확인해주세요!&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;step1. 초기 고유벡터, 고유값을 만족하는 식&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.16.03.png&quot; data-origin-width=&quot;168&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brWnUD/btsMOOYt0zB/gDcdSkZpzAEhJLl1icixT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brWnUD/btsMOOYt0zB/gDcdSkZpzAEhJLl1icixT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brWnUD/btsMOOYt0zB/gDcdSkZpzAEhJLl1icixT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrWnUD%2FbtsMOOYt0zB%2FgDcdSkZpzAEhJLl1icixT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;168&quot; height=&quot;80&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.16.03.png&quot; data-origin-width=&quot;168&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A는 nxn행렬&lt;/li&gt;
&lt;li&gt;v는 nx1 벡터(고유벡터, 0이 아닌 벡터)&lt;/li&gt;
&lt;li&gt;&amp;lambda;는 고유값(스칼라)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;step2. 식 변환&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 모든 수를 좌변으로 넘겨볼게요.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.21.29.png&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yCKGb/btsMOuFXh1l/wvnAQvFo0RpeT3kEv3XrhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yCKGb/btsMOuFXh1l/wvnAQvFo0RpeT3kEv3XrhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yCKGb/btsMOuFXh1l/wvnAQvFo0RpeT3kEv3XrhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyCKGb%2FbtsMOuFXh1l%2FwvnAQvFo0RpeT3kEv3XrhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;280&quot; height=&quot;116&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.21.29.png&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 공통된 벡터 v로 묶을 수 있게 되었습니다. 한번 묶어볼게요.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.21.32.png&quot; data-origin-width=&quot;282&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JvWRl/btsMOt76fEW/4pDgNCLQDYL2LblxxNPvg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JvWRl/btsMOt76fEW/4pDgNCLQDYL2LblxxNPvg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JvWRl/btsMOt76fEW/4pDgNCLQDYL2LblxxNPvg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJvWRl%2FbtsMOt76fEW%2F4pDgNCLQDYL2LblxxNPvg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;282&quot; height=&quot;114&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.21.32.png&quot; data-origin-width=&quot;282&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;여기서 새로운 행렬인 (A-&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: left;&quot;&gt;&amp;lambda;I)라는 행렬이 나오게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: left;&quot;&gt;이 행렬이 어떤 벡터 v에 대해 0벡터를 만들려면, 행렬이 역행렬이 없어야합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: left;&quot;&gt;v벡터는 0이 아닌 벡터이기 때문에, &lt;b&gt;&lt;u&gt;행렬식은 다음과 같이 0이 되어야합니다.&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: left;&quot;&gt;&quot;v벡터와 곱해져서&amp;nbsp; 수식을 0으로 만들 수 있지 않나요?&quot; 궁금 하실 수 있는데요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: left;&quot;&gt;앞에 설명에서도 말씀 드렸듯이, &lt;u&gt;&lt;b&gt;고유벡터는 방향을 바꾸지 못합니다.&lt;/b&gt;&lt;/u&gt; 따라서 어떻게 해서든 기존 수식을 0으로 만들 수 없습니다. &lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.25.17.png&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO3ROm/btsMMyXn2FA/WbgAsjeMP8ch8qfr6ruBLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO3ROm/btsMMyXn2FA/WbgAsjeMP8ch8qfr6ruBLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO3ROm/btsMMyXn2FA/WbgAsjeMP8ch8qfr6ruBLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO3ROm%2FbtsMMyXn2FA%2FWbgAsjeMP8ch8qfr6ruBLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;308&quot; height=&quot;108&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.25.17.png&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역행렬이 존재하려면 행렬식(det)이 0이 아니어야한다.&lt;/li&gt;
&lt;li&gt;만약 det가 0이면 행렬은 특이행렬이 되어 역행렬이 존재하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 선형대수의 기본 개념들 때문에, 위의 식을 만족해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 식이 바로 &lt;u&gt;&lt;b&gt;특성방정식(Characteristic&amp;nbsp;Equation)&lt;/b&gt;&lt;/u&gt;입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 특성방정식을&amp;nbsp; 적용해볼게요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.30.02.png&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JooYf/btsMN93a47G/dGSG3Ggvia8sxWWYIQTrG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JooYf/btsMN93a47G/dGSG3Ggvia8sxWWYIQTrG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JooYf/btsMN93a47G/dGSG3Ggvia8sxWWYIQTrG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJooYf%2FbtsMN93a47G%2FdGSG3Ggvia8sxWWYIQTrG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;230&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.30.02.png&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;u&gt;&lt;b&gt;&amp;lambda;값은 2와 3입&lt;/b&gt;&lt;/u&gt;니다. &lt;b&gt;&lt;u&gt;이 값이 바로 고유값&lt;/u&gt;&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고유값을 구했으니, 고유벡터를 한번 구해볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고유벡터는 앞서 구한 고유값을 하나씩 넣어서 구할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;lambda; = 3인 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 얻은 식에 3을 대입해 볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 아래와 같은 식을 얻을 수 있는데요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.39.52.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCMqYn/btsMMFhPYKP/oTaSKPRhsA2Kitl9pBKrkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCMqYn/btsMMFhPYKP/oTaSKPRhsA2Kitl9pBKrkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCMqYn/btsMMFhPYKP/oTaSKPRhsA2Kitl9pBKrkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCMqYn%2FbtsMMFhPYKP%2FoTaSKPRhsA2Kitl9pBKrkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;94&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.39.52.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 구한 행렬 값을 식에 대입을 해봅시다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.39.58.png&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCANnj/btsMMyC8FU1/YVgWldqeJjzKjboTz6Lrbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCANnj/btsMMyC8FU1/YVgWldqeJjzKjboTz6Lrbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCANnj/btsMMyC8FU1/YVgWldqeJjzKjboTz6Lrbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCANnj%2FbtsMMyC8FU1%2FYVgWldqeJjzKjboTz6Lrbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;232&quot; height=&quot;50&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.39.58.png&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v = (x, y)라고 했을 때, x = 2y가 나오는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 대략적으로 다음과 같이 표현할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.43.37.png&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bru2oG/btsMOtUyjdY/6eWCo4JfaR5xbi2GHiMOFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bru2oG/btsMOtUyjdY/6eWCo4JfaR5xbi2GHiMOFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bru2oG/btsMOtUyjdY/6eWCo4JfaR5xbi2GHiMOFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbru2oG%2FbtsMOtUyjdY%2F6eWCo4JfaR5xbi2GHiMOFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;180&quot; height=&quot;134&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.43.37.png&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v = (-2, -1), (4, 2) 등 수많은 벡터가 될 수 있습니다. 단, 0은 안됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;lambda; = 2인 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2의 값을 가질 경우에도 수식에 대입하면 행렬을 얻을 수 있어요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.34.47.png&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dglRzy/btsMNKo4h07/8KKVMQEPYotKKXrfClvpBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dglRzy/btsMNKo4h07/8KKVMQEPYotKKXrfClvpBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dglRzy/btsMNKo4h07/8KKVMQEPYotKKXrfClvpBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdglRzy%2FbtsMNKo4h07%2F8KKVMQEPYotKKXrfClvpBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;431&quot; height=&quot;92&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.34.47.png&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서도 v = (x, y)로 정의하고 식을 구할 수 있는데요. x = y값을 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 정말 간단하게 나타내면 아래와 같은 값을 얻을 수 있어요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.45.20.png&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dO509i/btsMOh08Sj4/rpb8IGJQpmhGiEodn6PKvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dO509i/btsMOh08Sj4/rpb8IGJQpmhGiEodn6PKvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dO509i/btsMOh08Sj4/rpb8IGJQpmhGiEodn6PKvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdO509i%2FbtsMOh08Sj4%2Frpb8IGJQpmhGiEodn6PKvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;136&quot; data-filename=&quot;스크린샷 2025-03-17 오후 9.45.20.png&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 v = (4, 4), (10, 10) 등 0을 제외한 수많은 벡터가 될 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;왜 머신러닝에서 중요한가?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 고유값, 고유벡터가 머신러닝에서 왜 중요한걸까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값을 알게 됨으로써 &lt;u&gt;&lt;b&gt;데이터의 핵심을 잘 파악하고, 복잡한 문제를 쉽게 풀 수 있기 때문&lt;/b&gt;&lt;/u&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 &lt;u&gt;&lt;b&gt;데이터의 핵심인 나무젓가락&lt;/b&gt;&lt;/u&gt;이 있다고 해볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 데이터가 표현되면서 또 다른 데이터인 고무 찰흙이 나무젓가락에 덕지덕지 붙습니다. 그럼 데이터가 점점 무거워지겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서&lt;b&gt;&lt;u&gt; 데이터의 핵심만 잘 발라내는 것이 중요&lt;/u&gt;&lt;/b&gt;합니다. 이게 바로 고유 벡터를 찾는 것이라고 할 수 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 말하면, &lt;b&gt;&lt;u&gt;데이터의 본질적인 특징을 잘 나타내는 방향을 찾는다&lt;/u&gt;&lt;/b&gt;고 보시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후 배울 PCA(주성분 분석) 등에서 이용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 고유값과 고유벡터에 대해 알아보았는데요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;궁금한 점 있으면 언제든지 댓글 남겨주세요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;읽어주셔서 감사합니다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;003&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>인공지능공부/인공지능기초수학</category>
      <category>eigenvector</category>
      <category>PCA</category>
      <category>고유값</category>
      <category>고유벡터</category>
      <category>고윳값</category>
      <category>머신러닝기초</category>
      <category>선형대수</category>
      <category>인공지능기초</category>
      <author>컴공누나</author>
      <guid isPermaLink="true">https://jaeyoon-95.tistory.com/268</guid>
      <comments>https://jaeyoon-95.tistory.com/268#entry268comment</comments>
      <pubDate>Mon, 17 Mar 2025 22:00:13 +0900</pubDate>
    </item>
    <item>
      <title>통계적 임베딩으로 문서의 핵심 단어를 찾는 TF-IDF</title>
      <link>https://jaeyoon-95.tistory.com/267</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지난번 포스팅에서는 임베딩 모델 설명에 들어가기 앞서 토크나이저에 대해 알아봤는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아직 못보신 분들은 미리 보시는 것을 추천드립니다.&lt;/p&gt;
&lt;figure id=&quot;og_1741610398150&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;자연어처리 기초 토크나이저의 모든것! 종류부터 최신 트렌드까지!&quot; data-og-description=&quot;지난 포스팅에서는 자연어 처리가 무엇이고, 어떤 방법들이 있는지 정말 간단하게 알아봤습니다.혹시 아직 자연어처리에 대한 개념이 잘 안잡혔다고 느껴지신다면,아래의 포스팅을 먼저 보고 &quot; data-og-host=&quot;jaeyoon-95.tistory.com&quot; data-og-source-url=&quot;https://jaeyoon-95.tistory.com/266&quot; data-og-url=&quot;https://jaeyoon-95.tistory.com/266&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/r8i5p/hyYmNWgz38/XXSZedY6twLnc37guYWgL1/img.png?width=800&amp;amp;height=352&amp;amp;face=0_0_800_352,https://scrap.kakaocdn.net/dn/53ltC/hyYqaWNYku/SuEXjLedNh9pNkez1Tm4F0/img.png?width=800&amp;amp;height=352&amp;amp;face=0_0_800_352,https://scrap.kakaocdn.net/dn/n7tmn/hyYrYIfWgj/h0ktxCkZWdL6crFKCt1Hl1/img.png?width=750&amp;amp;height=330&amp;amp;face=0_0_750_330&quot;&gt;&lt;a href=&quot;https://jaeyoon-95.tistory.com/266&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jaeyoon-95.tistory.com/266&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/r8i5p/hyYmNWgz38/XXSZedY6twLnc37guYWgL1/img.png?width=800&amp;amp;height=352&amp;amp;face=0_0_800_352,https://scrap.kakaocdn.net/dn/53ltC/hyYqaWNYku/SuEXjLedNh9pNkez1Tm4F0/img.png?width=800&amp;amp;height=352&amp;amp;face=0_0_800_352,https://scrap.kakaocdn.net/dn/n7tmn/hyYrYIfWgj/h0ktxCkZWdL6crFKCt1Hl1/img.png?width=750&amp;amp;height=330&amp;amp;face=0_0_750_330');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;자연어처리 기초 토크나이저의 모든것! 종류부터 최신 트렌드까지!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;지난 포스팅에서는 자연어 처리가 무엇이고, 어떤 방법들이 있는지 정말 간단하게 알아봤습니다.혹시 아직 자연어처리에 대한 개념이 잘 안잡혔다고 느껴지신다면,아래의 포스팅을 먼저 보고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jaeyoon-95.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅부터는 임베딩 방법론에 대해 하나씩 살펴볼텐데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 그 첫 번째로 &lt;b&gt;&lt;u&gt;TF-IDF에 대해 살펴볼까 합니다.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;임베딩은 어떤 방법이 있는지 궁금하시다면 아래 포스팅도 참고해주세요.&lt;/p&gt;
&lt;figure id=&quot;og_1741610444604&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;자연어 처리 임베딩의 등장 배경과 종류&quot; data-og-description=&quot;어느 순간부터 딥러닝이 점점 핫해지기 시작했는데요.OpenAI의 ChatGPT가 공개되면서 LLM에 대한 관심이 폭주하기 시작했어요.이번 포스팅 시리즈는 초기 LM부터 LLM까지 자연어 처리 모델이 어떻게 &quot; data-og-host=&quot;jaeyoon-95.tistory.com&quot; data-og-source-url=&quot;https://jaeyoon-95.tistory.com/265&quot; data-og-url=&quot;https://jaeyoon-95.tistory.com/265&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pepM9/hyYmRj6T4x/9apEx2w7kVwJW9c4I1fTr1/img.png?width=800&amp;amp;height=369&amp;amp;face=0_0_800_369,https://scrap.kakaocdn.net/dn/biVWDI/hyYqb2sAPc/DXFeZfHCXQfLkS5EE4SG10/img.png?width=800&amp;amp;height=369&amp;amp;face=0_0_800_369,https://scrap.kakaocdn.net/dn/bam345/hyYqYBQoxn/hAiuDwqJp7seapBBWO4oZ1/img.png?width=2138&amp;amp;height=988&amp;amp;face=0_0_2138_988&quot;&gt;&lt;a href=&quot;https://jaeyoon-95.tistory.com/265&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jaeyoon-95.tistory.com/265&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pepM9/hyYmRj6T4x/9apEx2w7kVwJW9c4I1fTr1/img.png?width=800&amp;amp;height=369&amp;amp;face=0_0_800_369,https://scrap.kakaocdn.net/dn/biVWDI/hyYqb2sAPc/DXFeZfHCXQfLkS5EE4SG10/img.png?width=800&amp;amp;height=369&amp;amp;face=0_0_800_369,https://scrap.kakaocdn.net/dn/bam345/hyYqYBQoxn/hAiuDwqJp7seapBBWO4oZ1/img.png?width=2138&amp;amp;height=988&amp;amp;face=0_0_2138_988');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;자연어 처리 임베딩의 등장 배경과 종류&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;어느 순간부터 딥러닝이 점점 핫해지기 시작했는데요.OpenAI의 ChatGPT가 공개되면서 LLM에 대한 관심이 폭주하기 시작했어요.이번 포스팅 시리즈는 초기 LM부터 LLM까지 자연어 처리 모델이 어떻게&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jaeyoon-95.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 본격적으로 TF-IDF에 대해서 알아보도록 하겠습니다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;TF-IDF란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;TF-IDF(Term Frequency-Inverse Document Frequency)는 문서에서 단어의 중요도를 계산하는 방법&lt;/u&gt;&lt;/b&gt;인데요. 간단하게 말씀드리자면, 각 단어가 문서 내에서 얼마나 중요한지를 측정하는 데 사용됩니다. TF는 단어 빈도인 Term Frequency와 IDF Inverse Document Frequency의 약자입니다. 살짝 어렵게 느껴지실 수도 있다고 생각되는데요. 조금만 더 쉽게 풀어서 말씀드려볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 '아기 돼지 삼형제'라는 동화책을 읽는다고 상상해 볼게요. 이 동화책에는 어떤 단어가 가장 많이 나올까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'돼지', '집', '늑대' 등이 가장 많이 나올것이라는 생각이 듭니다. 그럼 자연스럽게 '돼지'라는 단어가 많이 나오기 때문에, 중요하다고 생각할 수 있을텐데요. 생각해보면 '돼지'는 다른 동화책에서도 정말 많이 사용이 되죠. 그렇다면, 이 '돼지'는 특별한 단어라고 할 수 있을까요? '특별하다' 보다는 '흔하다'에 더 가깝게 되죠. 그럼 '아기 돼지 삼형제'라는 동화책 내에서 등장하는 다른 단어인 '벽돌집'은 비교적 다른 동화책에 덜 나오기 때문에 이 책 내에서는 더 특별한 단어라고 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 TF-IDF의 기본 개념인데요. &lt;u&gt;&lt;b&gt;문서에서 중요한(특별한) 단어를 찾기 위해 만들어진 방법&lt;/b&gt;&lt;/u&gt;입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;TF&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째로 TF에 대해 먼저 설명드릴게요. &lt;b&gt;&lt;u&gt;TF는 간단하게 '단어가 얼마나 자주 나오니?'를 측정&lt;/u&gt;&lt;/b&gt;한다고 생각해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'돼지'가 책에서 10번 나왔고, '벽돌집'이 5번 나왔다고 할게요. '돼지'는 얼핏보면 문서 내에서 더 중요하게 보일 수 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 앞서 말씀드린 것 처럼 '돼지'는 다른 동화책에서도 흔히 등장하는 단어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 더 중요하고, 특별한 것이 아니다고 여겨집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 TF는 어떻게 계산하는지 한번 알아볼게요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-10 오후 10.06.25.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHV9kg/btsMHwKtfwo/pjjuudJiURChqLm6BFEgLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHV9kg/btsMHwKtfwo/pjjuudJiURChqLm6BFEgLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHV9kg/btsMHwKtfwo/pjjuudJiURChqLm6BFEgLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHV9kg%2FbtsMHwKtfwo%2FpjjuudJiURChqLm6BFEgLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;74&quot; data-filename=&quot;스크린샷 2025-03-10 오후 10.06.25.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;단어가 그 문서에 얼마나 많이 나왔는지를 나타내는 값이라고 볼수 있습니다. 전체 문서 단어중 해당 단어가 차지하는 비율과 같으니까요!&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 숫자가 클수록 더 많이 나온 단어라는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 '돼지'는 10번, '늑대'는 6번, '벽돌집'은 5번, 전체 단어개수가 100개라고 해볼게요.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;'벽돌집'의 TF를 구해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-10 오후 10.08.38.png&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjS5S0/btsMHmH50iy/1jmE6TcQQP2wRBPSlkFxfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjS5S0/btsMHmH50iy/1jmE6TcQQP2wRBPSlkFxfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjS5S0/btsMHmH50iy/1jmE6TcQQP2wRBPSlkFxfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjS5S0%2FbtsMHmH50iy%2F1jmE6TcQQP2wRBPSlkFxfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;412&quot; height=&quot;125&quot; data-filename=&quot;스크린샷 2025-03-10 오후 10.08.38.png&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;'벽돌집'은 전체 문서의 5%만큼 등장한 단어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;IDF&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IDF는 &lt;b&gt;&lt;u&gt;'얼마나 희귀한 단어인가?'에 대해 계산하는 방법&lt;/u&gt;&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법은 빠르게 수식 먼저 보고 설명드릴게요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-10 오후 10.10.42.png&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MHuQR/btsMGeKFQz5/28MUUHIgdDHu28jKlcrGWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MHuQR/btsMGeKFQz5/28MUUHIgdDHu28jKlcrGWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MHuQR/btsMGeKFQz5/28MUUHIgdDHu28jKlcrGWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMHuQR%2FbtsMGeKFQz5%2F28MUUHIgdDHu28jKlcrGWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;98&quot; data-filename=&quot;스크린샷 2025-03-10 오후 10.10.42.png&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 단어가 많은 문서에 등장하면 흔한 단어라 중요도가 낮아지는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 어떤 단어가 특정 문서에서만 나오면 희귀하고 중요할 가능성이 높습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 우리는 &lt;b&gt;&lt;u&gt;자주 등장하는 단어의 중요도를 먼저 낮춰줘야합니다&lt;/u&gt;&lt;/b&gt;. 동시에 희귀한 단어의 중요도는 높여야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 수식을 살펴보면 단어가 등장한 문서의 개수가 많을수록 분모가 커질텐데요. 따라서 자연스레 그 중요도는 낮아지게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 분모의 &lt;b&gt;&lt;u&gt;'단어 t를 포함한 문서의 개수'는 '문서 빈도수'이며 DF(Document Frequency)라고도 합니다.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 아래와 같이 수식을 수정할수도 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-10 오후 10.23.25.png&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bya009/btsMFGHwHXF/6RXqVoEr0athKm9XYHeLW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bya009/btsMFGHwHXF/6RXqVoEr0athKm9XYHeLW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bya009/btsMFGHwHXF/6RXqVoEr0athKm9XYHeLW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbya009%2FbtsMFGHwHXF%2F6RXqVoEr0athKm9XYHeLW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;297&quot; height=&quot;90&quot; data-filename=&quot;스크린샷 2025-03-10 오후 10.23.25.png&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서 아래 단어들의 IDF값을 계산해볼게요. 전체 문서의 개수는 100개라고 가정할게요!&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;단어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;등장한 문서 수DF(t)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;전체 문서의 개수/DF(t)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;돼지&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;90&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;90/100 = 1.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;늑대&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;50&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;100/50 = 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;벽돌집&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;100/10 = 10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많이 등장할수록 더 수치가 적은 것을 확인할 수 있습니다. 따라서 IDF를 정리하자면 희귀한 단어를 찾아내는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 수식에서 우리는 log를 빼고 계산했었죠. 이건 왜 씌우는 걸까요? 생각보다 아주 간단한 이유인데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 극단적으로 100개 문서중 1개의 문서에만 등장하는 단어, 그리고 100개 문서에 모두 등장하는 단어를 생각해볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전자는 100이 될테고, 후자는 1이 되겠죠. 값 차이가 너무 커지게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이러한 &lt;b&gt;&lt;u&gt;값이 너무 커지거나 작아지지 않게 log함수를 씌우게&lt;/u&gt;&lt;/b&gt; 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;TF-IDF&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TF, IDF를 각각 알아봤으니 TF-IDF가 최종적으로 가지는 의미를 알아볼까요?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-10 오후 10.30.06.png&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JsaLi/btsME5nEgyT/n0tZtSF2udhBwuk1UUzBh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JsaLi/btsME5nEgyT/n0tZtSF2udhBwuk1UUzBh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JsaLi/btsME5nEgyT/n0tZtSF2udhBwuk1UUzBh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJsaLi%2FbtsME5nEgyT%2Fn0tZtSF2udhBwuk1UUzBh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;81&quot; data-filename=&quot;스크린샷 2025-03-10 오후 10.30.06.png&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 계산했던, TF와 IDF를 곱하면 TF-IDF값을 얻을 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TF는 단어가 얼마나 나오는지 알 수 있고, IDF는 단어가 얼마나 희귀한지 알 수 있습니다. 그럼 이 두 값을 곱한 TF-IDF는요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 해석해 보자면 &lt;b&gt;&lt;u&gt;'t 문서에서 많이 나오면서, 전체 문서에서 희소하게 나오는 단어'&lt;/u&gt;&lt;/b&gt;를 알 수 있습니다. &lt;b&gt;&lt;u&gt;즉, t문서 내에서만 중요한 단어&lt;/u&gt;&lt;/b&gt;를 알 수 있는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시를 한번 살펴볼게요. 전체 문서 개수는 100개, 해당 문서 내 단어 개수도 100개라고 가정해볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각 문장, 문서에 등장하는 빈도수는 돼지-10/90, 늑대-6/50, 벽돌집 5/10입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;단어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;TF&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;IDF&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;TF-IDF&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;돼지&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;10/100=0.10&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;log(100/90)=0.05&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;0.10x0.05=0.005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;늑대&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;6/100=0.06&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;log(100/50)=0.3&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;0.06x0.3=0.018&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;벽돌집&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;5/100=0.05&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;log(100/10)=1.0&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;0.05x1.0=0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 결과로 봐서 이 문서는 '벽돌집'이 가장 중요한 단어라고 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;구현&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 코드로 간단하게 구현해볼게요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;라이브러리 미사용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1741614474010&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import math

# 예시 문서
documents = [
    &quot;고양이는 귀엽다&quot;,
    &quot;강아지는 충성스럽다&quot;,
    &quot;고양이와 강아지는 친하다&quot;
]

# 단어 목록 생성
def build_vocab(documents):
    vocab = set()
    for doc in documents:
        vocab.update(doc.split())
    return vocab

# TF 계산
def compute_tf(doc):
    tf_dict = {}
    words = doc.split()
    total_words = len(words)
    for word in words:
        tf_dict[word] = tf_dict.get(word, 0) + 1 / total_words
    return tf_dict

# IDF 계산
def compute_idf(documents, vocab):
    idf_dict = {}
    N = len(documents)
    for word in vocab:
        count = sum(1 for doc in documents if word in doc.split())
        idf_dict[word] = math.log(N / (1 + count))  # +1 to avoid division by zero
    return idf_dict

# TF-IDF 계산
def compute_tfidf(documents):
    vocab = build_vocab(documents)
    idf_dict = compute_idf(documents, vocab)
    
    tfidf_docs = []
    for doc in documents:
        tf_dict = compute_tf(doc)
        tfidf_doc = {word: tf_dict[word] * idf_dict.get(word, 0) for word in tf_dict}
        tfidf_docs.append(tfidf_doc)
    
    return tfidf_docs, vocab

# TF-IDF 계산 결과 출력
tfidf_docs, vocab = compute_tfidf(documents)
print(&quot;단어 목록:&quot;, vocab)
print(&quot;TF-IDF 결과:&quot;)
for idx, doc_tfidf in enumerate(tfidf_docs):
    print(f&quot;문서 {idx + 1}: {doc_tfidf}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;라이브러리 사용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이브러리를 사용하면 엄청 간단하게 이용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1741614463927&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.feature_extraction.text import TfidfVectorizer

# 예시 문서
documents = [
    &quot;고양이는 귀엽다&quot;,
    &quot;강아지는 충성스럽다&quot;,
    &quot;고양이와 강아지는 친하다&quot;
]

# TfidfVectorizer 객체 생성
vectorizer = TfidfVectorizer()

# 문서에 대한 TF-IDF 계산
tfidf_matrix = vectorizer.fit_transform(documents)

# 결과 출력
print(&quot;단어 목록:&quot;, vectorizer.get_feature_names_out())
print(&quot;TF-IDF 행렬:\n&quot;, tfidf_matrix.toarray())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;장단점&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 134px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 115px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 115px;&quot;&gt;  간단하고 직관적&lt;br /&gt;- 계산이 쉽고 직관적이어서 구현하기 쉬움&lt;br /&gt;- 문서의 특성을 반영한 단어 중요도 측정 가능&lt;br /&gt;  중요 단어를 효과적으로 추출&lt;br /&gt; &amp;nbsp;불필요 단어 필터링 가능&lt;br /&gt;- 문서에서 흔한 단어를 제외할 수 있음(그리고, 하지만 등)&lt;br /&gt; &amp;nbsp;검색 엔진과 추천 시스템에서 유용&lt;br /&gt;- 가장 관련있는 문서를 찾는 데 사용할 수 있음&lt;br /&gt;- ex) 강아지 사료 추천 검색시 TF-IDF를 활용하여 관련 키워드가 가장 많이 포함된 문서를 상위에 노출시킬 수 있음&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 115px;&quot;&gt; 문맥을 반영하지 못함&lt;br /&gt;- 개별 단어 빈도만 고려하고, 문맥이나 단어 순서 반영이 어려움&lt;br /&gt; 희소 행렬 문제&lt;br /&gt;- 문서가 많아질수록 각 문서마다 등장하는 단어수가 적어지고, 대부분 0이 되는 희소 행렬이 생김&lt;br /&gt;- ex) 1만 개의 문서에서 한 단어가 3개의 문서에만 등장하면, 대부분 값이 0인 행렬이 만들어져 메모리가 낭비할 수 있음&lt;br /&gt; 단어 길이나 변형을 고려하지 않음&lt;br /&gt;- 먹다, 먹었다 등의 같은 의미의 단어가 다르게 취급됨&lt;br /&gt; 단어의 상대적인 중요도를 반영하지 못할 수 있음&lt;br /&gt;- 매우 중요한 단어더라도 자주 등장하면 중요도가 낮아짐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 &lt;b&gt;&lt;u&gt;TF-IDF는 문서에서 중요한 단어를 뽑고싶거나, 검색, 문서의 요약, 키워드 추출이 필요한 경우에 사용하시는 것을 추천&lt;/u&gt;&lt;/b&gt;드립니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;사용하는 곳&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 133px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;사용처&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 86.7442%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; text-align: center; height: 38px;&quot;&gt;검색 엔진&lt;/td&gt;
&lt;td style=&quot;width: 86.7442%; height: 38px;&quot;&gt;&lt;span&gt;TF-IDF를 이용하면 해당 키워드가 가장 중요하게 여겨지는 문서 검색을 할 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;위의 장점에도 적어두었지만 '강아지 사료 추천'검색시 관련 키워드가 가장 중요하게 여겨진 문서가 상위 노출되게 됩니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; text-align: center; height: 19px;&quot;&gt;문서 분류&lt;/td&gt;
&lt;td style=&quot;width: 86.7442%; height: 19px;&quot;&gt;스팸 메일 분류와 같은 문서 분류에서도 높은 성능을 보이는데요. 스팸 문서에 자주 등장하는 단어가 특정 문서에서 중요도 높게 여겨진다면, 해당 메일은 스팸으로 분류할 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; text-align: center; height: 19px;&quot;&gt;텍스트 요약&lt;/td&gt;
&lt;td style=&quot;width: 86.7442%; height: 19px;&quot;&gt;뉴스에서 나온 핵심 단어를 추출하는 데 도움이 됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; text-align: center; height: 19px;&quot;&gt;감성 분석&lt;/td&gt;
&lt;td style=&quot;width: 86.7442%; height: 19px;&quot;&gt;긍정적인 단어와 부정적인 단어가 중요하게 여겨진 문서를 찾아서, 긍정인지 부정인지 분류할 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; text-align: center; height: 19px;&quot;&gt;키워드 추출&lt;/td&gt;
&lt;td style=&quot;width: 86.7442%; height: 19px;&quot;&gt;텍스트 요약과 비슷하게 핵심 키워드를 찾아낼 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 통계적 임베딩 방법인 TF-IDF에 대해 아주 자세하게 알아봤습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 포스팅에서는 또 다른 통계적 임베딩 방법인 LSA에 대해 알아볼게요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;질문이나 의견 있으시면 언제든지 댓글 남겨주세요!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;003&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>인공지능공부/자연어처리</category>
      <category>tfidf</category>
      <category>단어빈도</category>
      <category>역문서빈도</category>
      <category>임베딩</category>
      <category>자연어처리</category>
      <category>자연어처리기초</category>
      <author>컴공누나</author>
      <guid isPermaLink="true">https://jaeyoon-95.tistory.com/267</guid>
      <comments>https://jaeyoon-95.tistory.com/267#entry267comment</comments>
      <pubDate>Mon, 10 Mar 2025 22:58:22 +0900</pubDate>
    </item>
    <item>
      <title>자연어처리 기초 토크나이저의 모든것! 종류부터 최신 트렌드까지!</title>
      <link>https://jaeyoon-95.tistory.com/266</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지난 포스팅에서는 자연어 처리가 무엇이고, 어떤 방법들이 있는지 정말 간단하게 알아봤습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;혹시 아직 자연어처리에 대한 개념이 잘 안잡혔다고 느껴지신다면,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래의 포스팅을 먼저 보고 오시는 것을 추천드립니다.&lt;/p&gt;
&lt;figure id=&quot;og_1741418990053&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;자연어 처리 임베딩의 등장 배경과 종류&quot; data-og-description=&quot;어느 순간부터 딥러닝이 점점 핫해지기 시작했는데요.OpenAI의 ChatGPT가 공개되면서 LLM에 대한 관심이 폭주하기 시작했어요.이번 포스팅 시리즈는 초기 LM부터 LLM까지 자연어 처리 모델이 어떻게 &quot; data-og-host=&quot;jaeyoon-95.tistory.com&quot; data-og-source-url=&quot;https://jaeyoon-95.tistory.com/265&quot; data-og-url=&quot;https://jaeyoon-95.tistory.com/265&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/505Rp/hyYqVdINgd/PlQ5xqZ17ZMU2CVanoybG1/img.png?width=800&amp;amp;height=369&amp;amp;face=0_0_800_369,https://scrap.kakaocdn.net/dn/suxWs/hyYmYDbGug/XlioUmwEVDnR7dO2Hi9JF1/img.png?width=800&amp;amp;height=369&amp;amp;face=0_0_800_369,https://scrap.kakaocdn.net/dn/cwEJuz/hyYmTIEyfO/lV1XWob1USkT3bxRkz4u41/img.png?width=2138&amp;amp;height=988&amp;amp;face=0_0_2138_988&quot;&gt;&lt;a href=&quot;https://jaeyoon-95.tistory.com/265&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jaeyoon-95.tistory.com/265&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/505Rp/hyYqVdINgd/PlQ5xqZ17ZMU2CVanoybG1/img.png?width=800&amp;amp;height=369&amp;amp;face=0_0_800_369,https://scrap.kakaocdn.net/dn/suxWs/hyYmYDbGug/XlioUmwEVDnR7dO2Hi9JF1/img.png?width=800&amp;amp;height=369&amp;amp;face=0_0_800_369,https://scrap.kakaocdn.net/dn/cwEJuz/hyYmTIEyfO/lV1XWob1USkT3bxRkz4u41/img.png?width=2138&amp;amp;height=988&amp;amp;face=0_0_2138_988');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;자연어 처리 임베딩의 등장 배경과 종류&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;어느 순간부터 딥러닝이 점점 핫해지기 시작했는데요.OpenAI의 ChatGPT가 공개되면서 LLM에 대한 관심이 폭주하기 시작했어요.이번 포스팅 시리즈는 초기 LM부터 LLM까지 자연어 처리 모델이 어떻게&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jaeyoon-95.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 자연어 처리의 각 모델들에 대한 설명에 들어가기 전!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;자연어 문장을 작은 단위인 토큰으로 나누는 과정들&lt;/u&gt;&lt;/b&gt;에 대해서 살펴볼까 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;토크나이징 과정은 모든 모델들에 들어가기 전에 거쳐야하는 과정입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 오늘도 즐겁게 배워볼까요?!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;003&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;토크나이저(Tokenizer)란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 포스팅에서 자연어란 실생활에서 쓰는 사람의 언어라고 말씀드렸는데요. 컴퓨터가 이 자연어를 작업하기 위해서는 텍스트 데이터를 숫자로 표현해야하는데, 하나의 문장단위로 처리하기에는 어려움이 있습니다. 따라서 &lt;b&gt;&lt;u&gt;문장을 하나의 단어인 토큰 단위로 나누는 작업&lt;/u&gt;&lt;/b&gt;이 필요합니다. 즉, &lt;u&gt;&lt;b&gt;토크나이저는 텍스트 데이터를 단어, 문장, 서브워드, 문자 등으로 나누는 도구&lt;/b&gt;&lt;/u&gt;라고 할 수 있습니다. &lt;u&gt;&lt;b&gt;이 과정은 토크나이징 과정이라고하며, 토크나이저를 통해 얻어지는 것을 토큰&lt;/b&gt;&lt;/u&gt;이라고 부릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토크나이저는 굉장히 다양한 종류가있는데요. 가장 간단한 토크나이징 과정을 살펴볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 &quot;나는 자연어 처리를 공부하고 있어요&quot;라는 문장을 입력받으면, 공백 기준으로 나누는 토크나이저는 &quot;나는&quot;, &quot;자연어&quot;, &quot;처리를&quot;,&quot;공부하고&quot;,&quot;있어요&quot;와 같은 토큰으로 나눌 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 토크나이징 과정을 잘한다면 불 필요한 기호, 조사, 불용어 등을 효과적으로 제거할 수 있고, 의미 있는 단어 단위로 모델이 학습할 수 있으며, 텍스트 데이터를 벡터화 하는 과정이 보다 쉬워집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 정리하자면 &quot;토크나이저는 컴퓨터가 이해하기 쉽게 자연어를 토큰 단위로 잘게 쪼개는 과정이다&quot;로 생각해주시면 좋을 것 같습니다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt; 토큰이 잘 이해가 안돼요.&lt;/b&gt;&lt;br /&gt;토큰을 너무 당연하게 얘기하고 넘어갔는데요. 조금 더 자세히 설명드려볼게요.&lt;br /&gt;토큰이라는 것은 문장을 작은 단위로 나눈 것이라고 보시면 됩니다. 어떤 토크나이저로 나누냐에 따라 같은 문장이더라도 다른 토큰을 얻을 수 있는데요. &quot;나는 자연어 처리를 공부하고 있어요&quot;라는 문장으로 크게 두 가지 예를 들어볼게요.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. 공백 단위로 나누는 방법&lt;/b&gt;&lt;br /&gt;&quot;나는&quot;, &quot;자연어&quot;, &quot;처리를&quot;, &quot;공부하고&quot;, &quot;있어요&quot;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. 글자 단위로 나누는 방법&lt;/b&gt;&lt;br /&gt;&quot;나&quot;,&quot;는&quot;,&quot;자&quot;,&quot;연&quot;,&quot;어&quot;,&quot;처&quot;,&quot;리&quot;,&quot;를&quot;,&quot;공&quot;,&quot;부&quot;,&quot;하&quot;,&quot;고&quot;,&quot;있&quot;,&quot;어&quot;,&quot;요&quot;&lt;br /&gt;&lt;br /&gt;각각의 토큰은 위와 같은 방법에 따라 달라질 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;토크나이저의 종류&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-08 오후 10.08.21.png&quot; data-origin-width=&quot;2690&quot; data-origin-height=&quot;1186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZa7c9/btsMF6dSxOl/X3GaD1CFewehgEOJjJ49ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZa7c9/btsMF6dSxOl/X3GaD1CFewehgEOJjJ49ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZa7c9/btsMF6dSxOl/X3GaD1CFewehgEOJjJ49ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZa7c9%2FbtsMF6dSxOl%2FX3GaD1CFewehgEOJjJ49ek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;313&quot; data-filename=&quot;스크린샷 2025-03-08 오후 10.08.21.png&quot; data-origin-width=&quot;2690&quot; data-origin-height=&quot;1186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토크나이저의 종류는 크게 &lt;b&gt;&lt;u&gt;전통 토크나이저와 서브워드 기반 토크나이저&lt;/u&gt;&lt;/b&gt;로 나눌 수 있습니다. 하나씩 자세하게 알아보도록 하겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1. 전통적인 토크나이저&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) 공백 기반 토크나이저(Whitespace Tokenizer)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름에서도 알 수 있듯이 단순히 공백을 기준으로 문장을 나눕니다. 이 방법은 구현이 가장 간단하고 빠르지만, 한국어처럼 띄어쓰기가 중요한 언어에서는 성능이 굉장히 낮습니다. 또한 부호를 구분할 수 없기 때문에, ., !와 같은 특수문자도 문장에 포함됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예)&amp;nbsp;&quot;I&amp;nbsp;am&amp;nbsp;learning&amp;nbsp;NLP.&quot;&amp;nbsp;&amp;rarr;&amp;nbsp;[&quot;I&quot;,&amp;nbsp;&quot;am&quot;,&amp;nbsp;&quot;learning&quot;,&amp;nbsp;&quot;NLP.&quot;]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) 문장부호 기반 토크나이저 (WordPunctTokenzer - NLTK)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단어와 문장부호를 따로 구분하여 토큰화를 하는 방법입니다. 이제는 문장 부호까지 정확하게 처리가 가능합니다. 특히 영어같은 언어에서는 꽤 효과적이라고하는데요. 한국어서는 여전히 적합하지 않습니다. 또 한가지 문제점은 don't와 같은 영어는 don, t 처럼 쪼개질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예)&amp;nbsp;&quot;I'm&amp;nbsp;learning&amp;nbsp;NLP!&quot;&amp;nbsp;&amp;rarr;&amp;nbsp;[&quot;I&quot;,&amp;nbsp;&quot;'m&quot;,&amp;nbsp;&quot;learning&quot;,&amp;nbsp;&quot;NLP&quot;,&amp;nbsp;&quot;!&quot;]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(3) 형태소 분석 기반 토크나이저(한국어 전용)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국어는 조사, 어미 변형이 많기 때문에 단순히 공백만으로는 의미있는 토큰을 추출하기 어렵습니다. 따라서 한국어 특징에 맞게 형태소를 분속하여 분리하는 방식입니다. 특히 한국어, 일본어 등 형태소 중심인 언어에 최적화되어있고, 문맥을 고려하여 단어를 분리할 수 있습니다. 단, 언어별로 따로 모델을 학습해야하고, 속도가 느릴 수 있습니다. 토크나이저 종류로는 Mecab, Kkma, Hannanum, Okt등이 있고, 가장 빠르고, 많이 사용되는 형태소 분석기는 Mecab입니다. 실제로 KoBERT, 한국어 GPT에서도 사용됐다고 해요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;2. 서브워드 기반 토크나이저(Subword Tokenizer)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브워드 기반 토크나이저는 위의 규칙 기반과는 다르게 &lt;b&gt;&lt;u&gt;사전에 다양한 문장으로 학습을 먼저 진행하고, 토크나이징 과정에서 학습된 토크나이저를 사용&lt;/u&gt;&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) BPE(Byte Pair Encoding)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;가장 빈번하게 등장하는 문자 쌍을 반복적으로 합치는 방식의 토크나이저&lt;/b&gt;&lt;/u&gt;입니다. 희귀한 단어를 작은 조각으로 나누고, 많이 쓰는 단어는 그대로 유지합니다. 다양한 단어를 토큰으로 만들 수 있지만, 어떤 데이터로 학습하냐에 따라서 굉장히 달라질 수 있고, 의미 없는 토큰이 생성될 수 있습니다. 이 방식은 GPT계열에 사용된 방법이며, 우리가 사용하는 ChatGPT도 BPE를 사용했다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예)&amp;nbsp;&quot;low&quot;,&amp;nbsp;&quot;lowest&quot;,&amp;nbsp;&quot;lower&quot;&amp;nbsp;&amp;rarr;&amp;nbsp;[&quot;low&quot;,&amp;nbsp;&quot;er&quot;,&amp;nbsp;&quot;est&quot;]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작동 과정은 아래 자세히 정리해 두었습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 작동 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 모든&amp;nbsp;단어를&amp;nbsp;문자&amp;nbsp;단위(Char&amp;nbsp;Tokenization)로&amp;nbsp;분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;훈련 데이터에 &quot;low&quot;, &quot;lowest&quot;, &quot;lower&quot;가 있다고 가정할때, 다음과 같이 문자를 분해할 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1741437458200&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[&quot;l&quot;, &quot;o&quot;, &quot;w&quot;], [&quot;l&quot;, &quot;o&quot;, &quot;w&quot;, &quot;e&quot;, &quot;s&quot;, &quot;t&quot;], [&quot;l&quot;, &quot;o&quot;, &quot;w&quot;, &quot;e&quot;, &quot;r&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 훈련&amp;nbsp;데이터에서&amp;nbsp;가장&amp;nbsp;많이&amp;nbsp;등장하는&amp;nbsp;문자&amp;nbsp;쌍&amp;nbsp;찾기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;731&quot; data-start=&quot;707&quot;&gt;(&quot;l&quot;, &quot;o&quot;) &amp;rarr; 3번 등장&lt;/li&gt;
&lt;li data-end=&quot;756&quot; data-start=&quot;732&quot;&gt;(&quot;o&quot;, &quot;w&quot;) &amp;rarr; 3번 등장&lt;/li&gt;
&lt;li data-end=&quot;781&quot; data-start=&quot;757&quot;&gt;(&quot;w&quot;, &quot;e&quot;) &amp;rarr; 2번 등장&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741437485431&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[&quot;lo&quot;, &quot;w&quot;], [&quot;lo&quot;, &quot;w&quot;, &quot;e&quot;, &quot;s&quot;, &quot;t&quot;], [&quot;lo&quot;, &quot;w&quot;, &quot;e&quot;, &quot;r&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장&amp;nbsp;많이&amp;nbsp;등장하는&amp;nbsp;문자&amp;nbsp;쌍&amp;nbsp;(&quot;l&quot;,&amp;nbsp;&quot;o&quot;)를&amp;nbsp;먼저&amp;nbsp;병합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 같은&amp;nbsp;방식으로&amp;nbsp;반복&amp;nbsp;병합&lt;/p&gt;
&lt;pre id=&quot;code_1741437523347&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[&quot;low&quot;], [&quot;low&quot;, &quot;e&quot;, &quot;s&quot;, &quot;t&quot;], [&quot;low&quot;, &quot;e&quot;, &quot;r&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BPE는 가장 자주 등장하는 문자 쌍을 반복적으로 병합하여 토큰을 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741424230903&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import defaultdict
import re

# 초기 단어 사전 (빈도 포함)
tokens = {&quot;l o w&quot;: 5, &quot;l o w e r&quot;: 2, &quot;n e w e s t&quot;: 6, &quot;w i d e s t&quot;: 3}

def get_stats(tokens):
    &quot;&quot;&quot;토큰의 빈도를 계산하는 함수&quot;&quot;&quot;
    stats = defaultdict(int)
    for word, freq in tokens.items():
        symbols = word.split()
        for i in range(len(symbols) - 1):
            stats[(symbols[i], symbols[i+1])] += freq
    return stats

def merge_pair(pair, tokens):
    &quot;&quot;&quot;가장 자주 등장하는 문자 쌍을 병합&quot;&quot;&quot;
    new_tokens = {}
    bigram = re.escape(' '.join(pair))
    pattern = re.compile(r'(?&amp;lt;!\S)' + bigram + r'(?!\S)')
    
    for word in tokens:
        new_word = pattern.sub(''.join(pair), word)
        new_tokens[new_word] = tokens[word]
    
    return new_tokens

# BPE 알고리즘 실행
num_merges = 5  # 병합 횟수 설정
for _ in range(num_merges):
    stats = get_stats(tokens)
    if not stats:
        break
    best_pair = max(stats, key=stats.get)
    tokens = merge_pair(best_pair, tokens)
    print(f&quot;병합: {best_pair}, 현재 토큰: {tokens}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) WordPiece&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;BPE와 비슷하지만 확률적으로 단어를 병합하는 방식입니다. 즉, 더 자주 등장하는 서브 워드를 우선적으로 합치는 방법&lt;/u&gt;&lt;/b&gt;입니다. 이 방식은 BPE보다 더 효율적인 방법이고, 희귀한 단어를 잘게 나누면서도, 의미있는 부분은 유지합니다. 하지만 모델을 학습하는 데 시간이 오래 걸리고, 새로운 도메인에서는 학습을 다시할 필요가 있습니다. 대부분 많은 BERT계열 모델에서 채택한 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예)&amp;nbsp;&quot;playing&quot;&amp;nbsp;&amp;rarr;&amp;nbsp;[&quot;play&quot;,&amp;nbsp;&quot;##ing&quot;]&amp;nbsp;(##는&amp;nbsp;이어진다는&amp;nbsp;뜻)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작동 과정은 아래에 자세히 정리해 두었습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 작동 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 훈련 데이터에서 서브워드 확률 계산&lt;/p&gt;
&lt;pre id=&quot;code_1741437207860&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;playing
player
played
playful&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 서브워드의 빈도를 세어 확률을 계산 (MLE(Maximum&amp;nbsp;Likelihood&amp;nbsp;Estimation) 방식)&lt;/p&gt;
&lt;pre id=&quot;code_1741437255822&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;p(&quot;play&quot;) = 0.4   (4번 등장)
p(&quot;ing&quot;) = 0.2   (2번 등장)
p(&quot;er&quot;) = 0.1    (1번 등장)
p(&quot;ed&quot;) = 0.1    (1번 등장)
p(&quot;ful&quot;) = 0.1   (1번 등장)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각&amp;nbsp;서브워드의&amp;nbsp;확률&amp;nbsp;=&amp;nbsp;해당&amp;nbsp;서브워드가&amp;nbsp;등장한&amp;nbsp;횟수&amp;nbsp;/&amp;nbsp;전체&amp;nbsp;단어&amp;nbsp;개수&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &quot;play&quot;가 가장 높은 확률을 가지므로 가장 먼저 선택될 가능성이 높음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 확률이 높은 문자 쌍을 결합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;훈련&amp;nbsp;데이터에서&amp;nbsp;서브워드&amp;nbsp;확률을&amp;nbsp;계산한&amp;nbsp;후,&amp;nbsp;확률이&amp;nbsp;높은&amp;nbsp;조합을&amp;nbsp;우선적으로&amp;nbsp;병합&lt;/p&gt;
&lt;pre id=&quot;code_1741437305918&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[&quot;p&quot;, &quot;l&quot;, &quot;a&quot;, &quot;y&quot;, &quot;i&quot;, &quot;n&quot;, &quot;g&quot;]  &amp;rarr; 초기 상태
[&quot;play&quot;, &quot;ing&quot;]  &amp;rarr; p(&quot;play&quot;) * p(&quot;ing&quot;) = 0.4 * 0.2 = **0.08**
[&quot;pla&quot;, &quot;ying&quot;]  &amp;rarr; p(&quot;pla&quot;) * p(&quot;ying&quot;) = 0.1 * 0.05 = **0.005**
[&quot;playi&quot;, &quot;ng&quot;]  &amp;rarr; p(&quot;playi&quot;) * p(&quot;ng&quot;) = 0.05 * 0.1 = **0.005**&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장&amp;nbsp;확률이&amp;nbsp;높은&amp;nbsp;조합이&amp;nbsp;[&quot;play&quot;,&amp;nbsp;&quot;ing&quot;]이므로&amp;nbsp;최종적으로&amp;nbsp;이&amp;nbsp;조합이&amp;nbsp;선택됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 새로운&amp;nbsp;단어를&amp;nbsp;볼&amp;nbsp;때도&amp;nbsp;확률이&amp;nbsp;높은&amp;nbsp;서브워드&amp;nbsp;조합&amp;nbsp;선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 학습된 후에는, 새로운 단어가 들어왔을 때 최대 가능도(ML) 조합을 찾아 토큰화&lt;/p&gt;
&lt;p data-end=&quot;1498&quot; data-start=&quot;1461&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, &quot;playings&quot;라는 새로운 단어가 들어오면,&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1591&quot; data-start=&quot;1499&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1541&quot; data-start=&quot;1499&quot;&gt;&quot;play&quot;와 &quot;ing&quot;이 가장 가능성이 높음 &amp;rarr; 먼저 분해&lt;/li&gt;
&lt;li data-end=&quot;1591&quot; data-start=&quot;1542&quot;&gt;&quot;ing&quot;과 &quot;s&quot;를 비교하여 &quot;ing&quot;을 유지하고 &quot;s&quot;를 추가&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1741437387109&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[&quot;play&quot;, &quot;##ing&quot;, &quot;##s&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741424497604&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import math

# 훈련 데이터에서 서브워드 확률 학습 (예제)
subword_probs = {
    &quot;play&quot;: 0.4,
    &quot;ing&quot;: 0.2,
    &quot;er&quot;: 0.1,
    &quot;ed&quot;: 0.1,
    &quot;ful&quot;: 0.1
}

def wordpiece_tokenize(word, subword_probs):
    tokens = []
    start = 0
    while start &amp;lt; len(word):
        end = len(word)
        while start &amp;lt; end:
            subword = word[start:end]
            if subword in subword_probs:
                tokens.append(subword)
                start = end
                break
            end -= 1
        if subword not in subword_probs:
            tokens.append(&quot;[UNK]&quot;)  # 사전에 없는 단어 처리
            break
    return tokens

# 예제 실행
word = &quot;playing&quot;
tokens = wordpiece_tokenize(word, subword_probs)
print(f&quot;WordPiece 결과: {tokens}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(3) SentencePiece&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BPE, WordPiece의 단점을 개선한 방식입니다. 앞의 BPE, Sentence Piece는 띄어쓰기가 있는 단어를 기준으로 하지만, &lt;b&gt;&lt;u&gt;Sentence Piece는 문장 전체를 분석하여 최적의 서브워드 조합을 학습&lt;/u&gt;&lt;/b&gt;합니다. 따라서 BPE, WordPiece보다 더 유연한 토큰화를 제공합니다. 단, 기존 방식보다 속도가 조금 느릴 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) &quot;자연어처리는 정말 재미있어요!&quot; &amp;rarr; [&quot;▁자연어&quot;,&amp;nbsp;&quot;처리&quot;,&amp;nbsp;&quot;는&quot;,&amp;nbsp;&quot;▁정말&quot;,&amp;nbsp;&quot;▁재미있어요&quot;,&amp;nbsp;&quot;!&quot;]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작동&amp;nbsp;과정은&amp;nbsp;아래에&amp;nbsp;자세히&amp;nbsp;정리해&amp;nbsp;두었습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 작동 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 띄어쓰기&amp;nbsp;포함된&amp;nbsp;문장을&amp;nbsp;하나의&amp;nbsp;문자열로&amp;nbsp;변환&lt;/p&gt;
&lt;pre id=&quot;code_1741437919625&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;자연어처리는 정말 재미있어요!&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 모든 문자 단위로 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 문장을 글자 단위로 나누고, 이를 기본 단위로 사용&lt;/p&gt;
&lt;pre id=&quot;code_1741437943119&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;['자', '연', '어', '처', '리', '는', '정', '말', '재', '미', '있', '어', '요', '!']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3. 가장&amp;nbsp;자주&amp;nbsp;등장하는&amp;nbsp;문자&amp;nbsp;쌍&amp;nbsp;찾기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 많이 등장하는 문자 조합을 학습해서 서브워드를 생성함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정은 BPE와 비슷하지만, 확률적으로 최적의 서브워드를 선택하는 것이 차이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 훈련 데이터에서 &quot;자연어&quot;라는 단어가 많이 등장한다고 한다면,&lt;/p&gt;
&lt;pre id=&quot;code_1741438315603&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'자연'  &amp;rarr; 3번 등장  
'연어'  &amp;rarr; 3번 등장  
'처리'  &amp;rarr; 2번 등장&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 많이 등장한 ('자', '연')과 ('연', '어')를 먼저 병합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 서브워드&amp;nbsp;병합&amp;nbsp;진행&lt;/p&gt;
&lt;pre id=&quot;code_1741438360474&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;['자연어', '처', '리', '는', '정', '말', '재', '미', '있', '어', '요', '!']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;자연어&quot;가 하나의 서브워드로 병합됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 확률적으로&amp;nbsp;최적의&amp;nbsp;서브워드&amp;nbsp;조합&amp;nbsp;선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SentencePiece는 단순 빈도 기반 병합이 아니라, 각 서브워드의 확률을 계산해서 가장 가능성이 높은 조합을 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, &quot;재미있어요&quot;가 훈련 데이터에서 많이 등장했다면&lt;/p&gt;
&lt;pre id=&quot;code_1741438402422&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;['자연어', '처', '리', '는', '정', '말', '재미있어요', '!']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;재미있어요&quot;가 하나의 서브워드로 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741438536234&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import re
from collections import defaultdict

# 1️. 훈련용 데이터
corpus = [
    &quot;나는 자연어처리를 좋아해.&quot;,
    &quot;자연어처리는 어려워 보이지만 재미있어.&quot;,
    &quot;딥러닝과 머신러닝을 활용해서 자연어를 이해할 수 있어.&quot;,
    &quot;자연어 모델은 사람처럼 문장을 분석해.&quot;
]

# 2️. 문자 단위로 데이터 분할
tokens = []
for sentence in corpus:
    sentence = re.sub(r&quot;[\.\!\?]&quot;, &quot;&quot;, sentence)  # 문장부호 제거
    tokens.extend(list(sentence))  # 글자 단위로 나누기

# 3️. 초기 서브워드 사전 생성
subwords = defaultdict(int)
for token in tokens:
    subwords[token] += 1

# 4️. 가장 자주 등장하는 문자 쌍을 병합
def get_most_frequent_pair(subwords):
    &quot;&quot;&quot; 가장 빈도 높은 문자 쌍 찾기 &quot;&quot;&quot;
    pairs = defaultdict(int)
    subword_list = list(subwords.keys())
    
    for i in range(len(subword_list) - 1):
        pair = (subword_list[i], subword_list[i + 1])
        pairs[pair] += subwords[subword_list[i]] + subwords[subword_list[i + 1]]
    
    return max(pairs, key=pairs.get, default=None)

# 5. 병합 수행
num_merges = 5  # 병합 횟수
for _ in range(num_merges):
    pair = get_most_frequent_pair(subwords)
    if pair is None:
        break
    
    merged_token = &quot;&quot;.join(pair)
    subwords[merged_token] = subwords.pop(pair[0]) + subwords.pop(pair[1])
    print(f&quot;병합: {pair} &amp;rarr; {merged_token}&quot;)

# 6️. 문장 토크나이징
def tokenize(sentence, subwords):
    &quot;&quot;&quot; 학습된 서브워드를 이용하여 문장 토크나이징 &quot;&quot;&quot;
    for subword in sorted(subwords.keys(), key=len, reverse=True):
        sentence = sentence.replace(subword, f&quot; {subword} &quot;)
    return sentence.split()

# 7️. 테스트 실행
test_sentence = &quot;나는 자연어처리를 공부하고 있어.&quot;
tokenized_sentence = tokenize(test_sentence, subwords)
print(&quot;  SentencePiece 토큰화 결과:&quot;, tokenized_sentence)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국어처럼 형태소 분석이 중요한 언어는 Mecab과 같은 전통적인 방법도 여전히 많이 사용하는 추세입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 트렌드 같은 경우는 서브워드 기반(특히 BPE)으로 많이 넘어갔고, 딥러닝을 활용한 토크나이저가 주목을 받고 있다고 합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 95px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 15.1163%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;토크나이저&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.8837%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.2791%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.7209%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;사용 모델&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 15.1163%; height: 38px; text-align: center;&quot;&gt;BPE&lt;/td&gt;
&lt;td style=&quot;width: 24.8837%; height: 38px; text-align: center;&quot;&gt;가장&amp;nbsp;자주&amp;nbsp;등장하는&amp;nbsp;문자&amp;nbsp;쌍&amp;nbsp;병합&lt;/td&gt;
&lt;td style=&quot;width: 41.2791%; height: 38px; text-align: center;&quot;&gt;희귀&amp;nbsp;단어도&amp;nbsp;처리&amp;nbsp;가능하지만&amp;nbsp;불규칙한&amp;nbsp;경우&amp;nbsp;발생&lt;/td&gt;
&lt;td style=&quot;width: 18.7209%; height: 38px; text-align: center;&quot;&gt;GPT-3,&amp;nbsp;GPT-4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 15.1163%; height: 19px; text-align: center;&quot;&gt;WordPiece&lt;/td&gt;
&lt;td style=&quot;width: 24.8837%; height: 19px; text-align: center;&quot;&gt;확률적으로&amp;nbsp;병합할&amp;nbsp;단어&amp;nbsp;선택&lt;/td&gt;
&lt;td style=&quot;width: 41.2791%; height: 19px; text-align: center;&quot;&gt;빈도가 아니라 가능성이 높은 서브워드 병합&lt;/td&gt;
&lt;td style=&quot;width: 18.7209%; height: 19px; text-align: center;&quot;&gt;BERT,&amp;nbsp;RoBERTa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 15.1163%; height: 19px; text-align: center;&quot;&gt;SentencePiece&lt;/td&gt;
&lt;td style=&quot;width: 24.8837%; height: 19px; text-align: center;&quot;&gt;띄어쓰기&amp;nbsp;없이&amp;nbsp;문장을&amp;nbsp;직접&amp;nbsp;학습&lt;/td&gt;
&lt;td style=&quot;width: 41.2791%; height: 19px; text-align: center;&quot;&gt;한국어, 일본어 등 다국어 지원&lt;/td&gt;
&lt;td style=&quot;width: 18.7209%; height: 19px; text-align: center;&quot;&gt;T5,&amp;nbsp;XLNet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅은 자연어 처리에 필요한 토크나이저에 대해 알려드렸는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 포스팅부터는 자연어를 임베딩 할 수 있는 모델에 대해 하나씩 자세하게 알려드릴게요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 포스팅에서 만나요~&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;017&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/017.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/017.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>인공지능공부/자연어처리</category>
      <category>nlp</category>
      <category>tokenizer</category>
      <category>자연어처리</category>
      <category>자연어처리기본</category>
      <category>토크나이저</category>
      <category>토크나이징</category>
      <author>컴공누나</author>
      <guid isPermaLink="true">https://jaeyoon-95.tistory.com/266</guid>
      <comments>https://jaeyoon-95.tistory.com/266#entry266comment</comments>
      <pubDate>Sat, 8 Mar 2025 22:18:40 +0900</pubDate>
    </item>
    <item>
      <title>자연어 처리 임베딩의 등장 배경과 종류</title>
      <link>https://jaeyoon-95.tistory.com/265</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어느 순간부터 딥러닝이 점점 핫해지기 시작했는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;OpenAI의 ChatGPT가 공개되면서 LLM에 대한 관심이 폭주하기 시작했어요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅 시리즈는 초기 LM부터 LLM까지 자연어 처리 모델이 어떻게 진화해 왔는지 그 과정을 살펴보려고해요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오늘은&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;1. 자연어 처리가 무엇인지&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;2. 임베딩이 왜 필요한지&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;3. 어떤 방법론들이 제시되어있고, 특징은 무엇인지&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;크게 세 포인트로 알아볼게요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 이후에는 각 임베딩 방법론들을 자세히 알아보며 LLM까지 한번 이해해보도록 하겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 시작해볼게요!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;003&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/003.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;자연어 처리(NLP)란 무엇인가?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;사람들은 일상에서 대화할 때 언어를 이용하죠. 이것을 바로 '자연어'라고 부르는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;반면 컴퓨터는 숫자만 이해할 수 있기 때문에 인간의 언어를 직접 처리하기는 어렵습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이때, 컴퓨터가 자연어를 이해하고 해석하며, 문장을 생성할 수 있도록 돕는 기술을 자연어 처리(Natural Language Processing)라고 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;u&gt;&lt;b&gt;자연어 처리는 컴퓨터가 인간의 언어를 효과적으로 다룰 수 있도록 만드는 기술 분야&lt;/b&gt;&lt;/u&gt;입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;임베딩이란 무엇인가?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;임베딩은 위에서 말씀드린 '자연어'를 컴퓨터가 잘 이해할 수 있는 의미있는 '숫자'로 바꿔주는 방법&lt;/u&gt;&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 &quot;안녕하세요&quot; 를 [66.3, 0.33, 5.33] 등의 숫자로 바꿔줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기에는 정말 단순한 원-핫 벡터(one-hot vector)라는 방법으로 표현했지만, 단어 간의 의미를 반영하지 못하고, 벡터의 차원만 커지는 문제가 있었습니다. 이를 해결하기 위해 벡터 공간에 임베딩하여 반영하려는 연구가 등장했습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 17px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px;&quot;&gt;&lt;b&gt; 임베딩은 자연어 처리만 있나요?&lt;/b&gt;&lt;br /&gt;임베딩은 어떤 데이터를 더 의미있는 표현 공간으로 변환하는 과정을 의미합니다. 따라서 이미지, 영상, 보이스 등의 다른 데이터들을 임베딩하여 벡터 공간에 의미있는 벡터로 표현을 할 수 있습니다. 위에서 말씀 드렸듯이 이렇게 표현하는 이유는 컴퓨터가 잘 알아듣게 하기 위함입니다.&lt;br /&gt;여기서는 자연어 처리에서의 임베딩만 다룰 예정입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;임베딩의 종류&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-06 오후 10.03.08.png&quot; data-origin-width=&quot;2138&quot; data-origin-height=&quot;988&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b049Ah/btsMCbuJM5H/piJz1vLK9KKYmdx60md9rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b049Ah/btsMCbuJM5H/piJz1vLK9KKYmdx60md9rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b049Ah/btsMCbuJM5H/piJz1vLK9KKYmdx60md9rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb049Ah%2FbtsMCbuJM5H%2FpiJz1vLK9KKYmdx60md9rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2138&quot; height=&quot;988&quot; data-filename=&quot;스크린샷 2025-03-06 오후 10.03.08.png&quot; data-origin-width=&quot;2138&quot; data-origin-height=&quot;988&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베딩은 정말 다양한 방법론들이 제안되었는데요. 이 제안된 방법론들은 크게 3가지의 카테고리로 나눌 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째는 단순 빈도 기반으로하는 통계적 임베딩, 두 번째는 단어 벡터를 학습해서 사용하는 정적 임베딩, 마지막으로는 문맥을 반영하여 의미 변화 처리가 가능한 동적 임베딩입니다. 간단하게 하나씩 살펴볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;1. 통계적 임베딩&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 자연어 임베딩 방법론들은 정말 간단하게 &lt;b&gt;&lt;u&gt;단어의 빈도수를 기반으로 임베딩&lt;/u&gt;&lt;/b&gt;했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게는 TF-IDF, LSA, LDA 등이 있는데요. 간단하게 그 모델들의 특징을 살펴보면 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나씩 차근차근 포스팅할 예정이니 여기서 다 이해하실 필요는 없습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.1938%; text-align: center;&quot;&gt;&lt;b&gt;방법론&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.6821%; text-align: center;&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.124%; text-align: center;&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.1938%; text-align: center;&quot;&gt;TF-IDF&lt;/td&gt;
&lt;td style=&quot;width: 43.6821%; text-align: center;&quot;&gt;단어 빈도 x 역문서 빈도 사용&lt;/td&gt;
&lt;td style=&quot;width: 41.124%; text-align: center;&quot;&gt;단어 순서를 고려하지 않고, 희소 벡터 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.1938%; text-align: center;&quot;&gt;LSA&lt;/td&gt;
&lt;td style=&quot;width: 43.6821%; text-align: center;&quot;&gt;단어-문서 행렬에 특이값 분해를 적용하여 차원 축소&lt;/td&gt;
&lt;td style=&quot;width: 41.124%; text-align: center;&quot;&gt;단어 순서나 문맥을 반영하지 못함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.1938%; text-align: center;&quot;&gt;LDA&lt;/td&gt;
&lt;td style=&quot;width: 43.6821%; text-align: center;&quot;&gt;단어를 확률적 토픽 분포로 모델링&lt;/td&gt;
&lt;td style=&quot;width: 41.124%; text-align: center;&quot;&gt;문장 내 단어 순서를 반영하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통계적 임베딩 방법은 단순 빈도 기반의 방식이라 &lt;b&gt;&lt;u&gt;단어의 의미나 문맥을 반영하기 어렵다는 한계점&lt;/u&gt;&lt;/b&gt;이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;2. 정적 임베딩&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통계적 임베딩 보다 한 단계 더 발전한 임베딩 방법인데요. 단어 간의 유사도를 반영하면서 '고정된 벡터'를 제공하는 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 특정 단어에 대한 임베딩이 정해져있는 것이죠. 때문에, 문맥에 따라 달라지는 단어의 의미를 잘 반영하지는 못합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.1938%; text-align: center;&quot;&gt;&lt;b&gt;방법론&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%; text-align: center;&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.31%; text-align: center;&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.1938%; text-align: center;&quot;&gt;Word2Vec&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%; text-align: center;&quot;&gt;- CBOW : 주변 단어 -&amp;gt; 중심 단어 예측&lt;br /&gt;- Skip-gram : 중심 단어 -&amp;gt; 주변 단어 예측&lt;/td&gt;
&lt;td style=&quot;width: 40.31%; text-align: center;&quot;&gt;동일한 단어는 항상 같은 벡터를 가짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.1938%; text-align: center;&quot;&gt;GloVe&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%; text-align: center;&quot;&gt;통계적인 방법과 Word2Vec의 결합&lt;/td&gt;
&lt;td style=&quot;width: 40.31%; text-align: center;&quot;&gt;여전히 문맥을 반영하지 못함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.1938%; text-align: center;&quot;&gt;FastText&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%; text-align: center;&quot;&gt;단어를 Subword단위로 분해하여 학습&lt;/td&gt;
&lt;td style=&quot;width: 40.31%; text-align: center;&quot;&gt;여전히 문맥을 고려하지 못함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;단어 의미를 잘 반영하지만, 문맥을 고려하지 못하는 한계점&lt;/u&gt;&lt;/b&gt;은 여전히 남아있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;3. 동적 임베딩&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 임베딩의 한계를 해결하기 위해 &lt;b&gt;&lt;u&gt;문맥을 반영하는 임베딩이 등장&lt;/u&gt;&lt;/b&gt;했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 핫한 LLM도 결국 동적 임베딩으로 임베딩을 한 뒤, 자연어를 처리합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 87px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 14.8449%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;방법론&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.7752%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.3798%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.8449%; height: 17px; text-align: center;&quot;&gt;ELMo&lt;/td&gt;
&lt;td style=&quot;width: 45.7752%; height: 17px; text-align: center;&quot;&gt;BiLSTM 기반의 모델&lt;/td&gt;
&lt;td style=&quot;width: 39.3798%; height: 17px; text-align: center;&quot;&gt;LSTM기반이라 긴 문장에서 성능 저하&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.8449%; height: 17px; text-align: center;&quot;&gt;BERT&lt;/td&gt;
&lt;td style=&quot;width: 45.7752%; height: 17px; text-align: center;&quot;&gt;Transformer기반 양방향 학습&lt;br /&gt;문맥에 따라 단어 벡터가 다르게 변함&lt;/td&gt;
&lt;td style=&quot;width: 39.3798%; height: 17px; text-align: center;&quot;&gt;계산량이 많고 느림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.8449%; height: 17px; text-align: center;&quot;&gt;GPT&lt;/td&gt;
&lt;td style=&quot;width: 45.7752%; height: 17px; text-align: center;&quot;&gt;Transformer 기반 단방향 학습&lt;br /&gt;주어진 문맥에서 다음 단어를 예측하는 방식&lt;/td&gt;
&lt;td style=&quot;width: 39.3798%; height: 17px; text-align: center;&quot;&gt;문맥을 한 방향에서만 보기 때문에 한계 존재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.8449%; height: 17px; text-align: center;&quot;&gt;T5/BART&lt;/td&gt;
&lt;td style=&quot;width: 45.7752%; height: 17px; text-align: center;&quot;&gt;문장 전체를 재구성하는 방식&lt;br /&gt;번역, 요약, 문서 생성 등 다양한 태스크 수행 가능&lt;/td&gt;
&lt;td style=&quot;width: 39.3798%; height: 17px; text-align: center;&quot;&gt;계산량이 많고 느림&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 자연어 처리의 임베딩은 동적 임베딩까지 발전하면서 단어의 의미 뿐만 아니라 문맥까지도 잘 고려해냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 그 만큼 계산량이 굉장히 많은데요. 따라서 계산량, 비용을 줄이는 연구도 활발히 진행되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에는 ChatGPT 대비 비용이 굉장히 저렴한 딥시크가 등장해서 핫 이슈였죠.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 37px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 37px;&quot;&gt;&lt;b&gt; 임베딩시 고려해야 할 것&lt;/b&gt;&lt;br /&gt;임베딩이 언어를 숫자로 표현해주는 것이라고 단순하게 말할 수 있는데요. &quot;그럼 그냥 숫자로 변환해주면 되는거 아닌가? 왜이렇게 방법이 많지?&quot; 생각이 드실 수 있어요. 예를들어 좋아해는 10, 싫어해는 11, 사랑해는 12라고 해봅시다. 현실에서 좋아해는 싫어해보다 사랑해와 거리가 가까워야하는데요. 이렇게 되면 싫어해와 더 가까워지죠. 물론 싫어해를 12, 사랑해를 11로 정의하면 가까워지긴 하겠지만, 이걸 모든 언어에 수동으로 적용시키기에는 한계가 있습니다. 뿐만 아니라 '영희가 사과를 먹는다.'와 '영희가 사과를 했다'의 사과는 다른 의미를 지니는데요. 하나의 수치로 정해버리면 두 사과가 같은 의미로 인식됩니다. 따라서 문맥에 따라 다르게 인식할 수 있게 임베딩 해야겠죠.&lt;br /&gt;&lt;br /&gt;전자의 좋아해, 싫어해 예시는 어떤 단어끼리 더 연관있고, 가까운지 '단어의 의미'를 고려해야하고, 후지의 사과 예시는 '문맥'을 잘 반영해야합니다. 이것이 임베딩시 고려해야할 것들입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;카테고리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;기법&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;문맥 반영&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;통계적 임베딩&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;TF-IDF, LSA, LDA&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;단어 순서, 의미 반영 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;정적 임베딩&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;Word2Vec, GloVe, FastText&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;문맥 반영 불가, 다의어 처리 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;동적 임베딩&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;ELMo, BERT, GPT, T5&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;계산랑 크고, 비용 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 자연어 처리의 기본 개념과 임베딩의 필요성에 대해서 알아봤는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 언급되었던 임베딩 모델들은 추후 포스팅에서 하나씩 자세하게 다룰 예정입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;앞으로 포스팅도 많이 기대해주세요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;질문과 의견은 언제든 환영입니다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;001&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>인공지능공부/자연어처리</category>
      <category>Embedding</category>
      <category>LLM</category>
      <category>임베딩</category>
      <category>임베딩방법</category>
      <category>임베딩이란</category>
      <category>임베딩종류</category>
      <category>자연어처리기초</category>
      <author>컴공누나</author>
      <guid isPermaLink="true">https://jaeyoon-95.tistory.com/265</guid>
      <comments>https://jaeyoon-95.tistory.com/265#entry265comment</comments>
      <pubDate>Thu, 6 Mar 2025 22:38:38 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 기초 강의 3강 파이썬의 자료구조</title>
      <link>https://jaeyoon-95.tistory.com/264</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3강썸네일.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blPqBZ/btsMAJkgSl5/0UXJfWiYKxlXgc5ipgirmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blPqBZ/btsMAJkgSl5/0UXJfWiYKxlXgc5ipgirmk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blPqBZ/btsMAJkgSl5/0UXJfWiYKxlXgc5ipgirmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblPqBZ%2FbtsMAJkgSl5%2F0UXJfWiYKxlXgc5ipgirmk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;608&quot; data-filename=&quot;3강썸네일.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지난 포스팅에서는 파이썬의 변수와 기초 자료형에 대해서 알아봤는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;만약 &lt;b&gt;&lt;u&gt;자료형이 뭔지 모르신다면 앞의 포스팅 먼저 보시는 것을 추천&lt;/u&gt;&lt;/b&gt;드려요.&lt;/p&gt;
&lt;figure id=&quot;og_1741089504202&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;파이썬 기초 강의 2강 변수와 데이터 타입&quot; data-og-description=&quot;지난 포스팅에서는 파이썬이 무엇이고 왜 배워야하는지 알려드렸습니다.만약 앞의 포스팅을 못보셨다면 먼저 보고 오시는 것을 추천드립니다.&amp;nbsp;파이썬 기초 강의 1강 파이썬이란?요즘 정말 핫&quot; data-og-host=&quot;jaeyoon-95.tistory.com&quot; data-og-source-url=&quot;https://jaeyoon-95.tistory.com/257&quot; data-og-url=&quot;https://jaeyoon-95.tistory.com/257&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bLZoyR/hyYmSvopL7/Nx02kw8oViZcx4uuDZHQTK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/cZ6nqW/hyYmVsaIly/KT8xT4OogmXsSb7FJkTHfK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/bY2dzn/hyYmSoyHtd/g3HHSSk19rBvS5pX9c1DX1/img.jpg?width=1080&amp;amp;height=608&amp;amp;face=0_0_1080_608&quot;&gt;&lt;a href=&quot;https://jaeyoon-95.tistory.com/257&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jaeyoon-95.tistory.com/257&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bLZoyR/hyYmSvopL7/Nx02kw8oViZcx4uuDZHQTK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/cZ6nqW/hyYmVsaIly/KT8xT4OogmXsSb7FJkTHfK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/bY2dzn/hyYmSoyHtd/g3HHSSk19rBvS5pX9c1DX1/img.jpg?width=1080&amp;amp;height=608&amp;amp;face=0_0_1080_608');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;파이썬 기초 강의 2강 변수와 데이터 타입&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;지난 포스팅에서는 파이썬이 무엇이고 왜 배워야하는지 알려드렸습니다.만약 앞의 포스팅을 못보셨다면 먼저 보고 오시는 것을 추천드립니다.&amp;nbsp;파이썬 기초 강의 1강 파이썬이란?요즘 정말 핫&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jaeyoon-95.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: center;&quot;&gt;이번 포스팅에서는 조금 더 심화된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;u&gt;파이썬의 자료구조&lt;/u&gt;&lt;/b&gt;에 대한 이야기를 해볼까 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;끝까지 잘 따라와주시면 너무 좋을 것 같아요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;질문은 언제나 환영입니다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;017&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/017.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/017.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;자료구조란 무엇인가?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자료구조란 &lt;u&gt;&lt;b&gt;데이터를 효율적으로 저장하고 관리하는 하나의 방법&lt;/b&gt;&lt;/u&gt;을 의미하는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;파이썬에서는 이러한 자료 구조를 기본으로 제공합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;크게 &lt;b&gt;&lt;u&gt;리스트, 튜플, 딕셔너리, 셋&lt;/u&gt;&lt;/b&gt; 이렇게 네 가지로 분류할 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 133px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style9&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 19.6124%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;자료구조&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.7752%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.6123%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 19.6124%; text-align: center; height: 38px;&quot;&gt;List&lt;/td&gt;
&lt;td style=&quot;width: 60.7752%; text-align: center; height: 38px;&quot;&gt;여러&amp;nbsp;개의&amp;nbsp;값을&amp;nbsp;저장할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;순서가&amp;nbsp;있는&amp;nbsp;자료형(수정&amp;nbsp;가능)&lt;/td&gt;
&lt;td style=&quot;width: 19.6123%; text-align: center; height: 38px;&quot;&gt;[&amp;ldquo;컴공누나&amp;rdquo;]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 19.6124%; text-align: center; height: 38px;&quot;&gt;Tuple&lt;/td&gt;
&lt;td style=&quot;width: 60.7752%; text-align: center; height: 38px;&quot;&gt;여러&amp;nbsp;개의&amp;nbsp;값을&amp;nbsp;저장할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;순서가&amp;nbsp;있는&amp;nbsp;자료형(수정&amp;nbsp;불가)&lt;/td&gt;
&lt;td style=&quot;width: 19.6123%; text-align: center; height: 38px;&quot;&gt;(&amp;ldquo;컴공누나&amp;rdquo;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 19.6124%; text-align: center; height: 19px;&quot;&gt;Dictionary&lt;/td&gt;
&lt;td style=&quot;width: 60.7752%; text-align: center; height: 19px;&quot;&gt;키(key)와&amp;nbsp;값(value)&amp;nbsp;쌍으로&amp;nbsp;이루어진&amp;nbsp;자료형&lt;/td&gt;
&lt;td style=&quot;width: 19.6123%; text-align: center; height: 19px;&quot;&gt;{&amp;ldquo;name&amp;rdquo;:&amp;rdquo;컴공누나&amp;rdquo;}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 19.6124%; text-align: center; height: 19px;&quot;&gt;Set&lt;/td&gt;
&lt;td style=&quot;width: 60.7752%; text-align: center; height: 19px;&quot;&gt;중복을&amp;nbsp;허용하지&amp;nbsp;않는&amp;nbsp;자료형&lt;/td&gt;
&lt;td style=&quot;width: 19.6123%; text-align: center; height: 19px;&quot;&gt;{&amp;ldquo;컴공누나&amp;rdquo;}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 위의 자료구조를 하나씩 살펴볼게요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;리스트(List)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;리스트는 다양한 형태의 자료형을 저장할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;저장된 데이터들은 순서가 존재하는데요. 때문에 index로 접근을 할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;값의 추가, 수정, 삭제가 가능해서 비교적 자유로운 자료 구조&lt;/u&gt;&lt;/b&gt;라고 할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;대괄호 []를 이용하여 데이터를 감싸는 형태로 정의하게 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1741090051291&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 리스트 생성
fruits = [&quot;사과&quot;, &quot;바나나&quot;, &quot;딸기&quot;]
print(fruits)  # ['사과', '바나나', '딸기']

# 요소 접근 (인덱싱)
print(fruits[0])  # '사과'
print(fruits[-1])  # '딸기' (음수 인덱스 사용 가능)

# 리스트 값 변경
fruits[1] = &quot;오렌지&quot;
print(fruits)  # ['사과', '오렌지', '딸기']

# 요소 추가
fruits.append(&quot;포도&quot;)  # 끝에 추가
fruits.insert(1, &quot;망고&quot;)  # 특정 위치에 추가
print(fruits)  # ['사과', '망고', '오렌지', '딸기', '포도']

# 요소 삭제
fruits.remove(&quot;딸기&quot;)  # 특정 값 제거
del fruits[0]  # 특정 인덱스 삭제
print(fruits)  # ['망고', '오렌지', '포도']

# 리스트 길이 확인
print(len(fruits))  # 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;앞의 포스팅에서 설명했던 자료형처럼 자료구조도 사용 가능한 연산자들이 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-05 오후 9.06.13.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SppxK/btsMAZOMJjj/28dyXTIDXMUv0Lgv5DKPZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SppxK/btsMAZOMJjj/28dyXTIDXMUv0Lgv5DKPZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SppxK/btsMAZOMJjj/28dyXTIDXMUv0Lgv5DKPZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSppxK%2FbtsMAZOMJjj%2F28dyXTIDXMUv0Lgv5DKPZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;361&quot; height=&quot;361&quot; data-filename=&quot;스크린샷 2025-03-05 오후 9.06.13.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;단순히 +, *도 있지만, append()등의 함수도 있죠.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사용되는 코드는 아래의 예제에서 확인해볼게요!&lt;/p&gt;
&lt;pre id=&quot;code_1741090228129&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 리스트 생성
my_list = [3, 1, 4, 1, 5]

my_list = my_list + [9, 2, 6]  # [3, 1, 4, 1, 5, 9, 2, 6]
my_list = my_list * 2  # [3, 1, 4, 1, 5, 9, 2, 6, 3, 1, 4, 1, 5, 9, 2, 6]
len(my_list)  # 16
my_list.append(5)  # [3, 1, 4, 1, 5, 9, 2, 6, 3, 1, 4, 1, 5, 9, 2, 6, 5]
my_list.insert(2, 8)  # [3, 1, 8, 4, 1, 5, 9, 2, 6, 3, 1, 4, 1, 5, 9, 2, 6, 5]
my_list.remove(1)  # [3, 8, 4, 1, 5, 9, 2, 6, 3, 1, 4, 1, 5, 9, 2, 6, 5]
popped_value = my_list.pop()  # popped_value = 5
index_of_4 = my_list.index(4)  # index_of_4 = 2
count_of_1 = my_list.count(1)  # count_of_1 = 2
my_list.sort()  # [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 8, 9, 9]
my_list.reverse()  # [9, 9, 8, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;덧셈&lt;/b&gt;의&lt;/u&gt;&amp;nbsp;경우 단순히 두 리스트를 이어 붙이는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;곱셈&lt;/u&gt;&lt;/b&gt;의 경우 곱해진 수만큼 해당 리스트가 반복됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;len&lt;/b&gt;&lt;/u&gt;의 경우 리스트 길이를 측정하는 함수로, len(A)처럼 사용합니다. A는 길이를 측정할 대상인 리스트입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;append(A)&lt;/u&gt;&lt;/b&gt;는 내에 있는 숫자 A는 리스트의 가장 마지막 부분에 추가됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;insert(A, B)&lt;/u&gt;&lt;/b&gt;의 경우 A의 자리에 B의 값이 추가됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위의 예제는 인덱스 2번째 자리에 10이 추가된 것을 확인할 수 있죠.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;remove(A)&lt;/u&gt;&lt;/b&gt;는 리스트 내에서 A의 값을 삭제해 줍니다. 단, 가장 앞에 있는 1개만 삭제됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;pop()&lt;/b&gt;&lt;/u&gt;은 리스트의 가장 마지막에 있는 원소를 꺼내줍니다. 꺼내고 나면 리스트에 해당 값은 삭제됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;index(A)&lt;/b&gt;&lt;/u&gt;는 리스트 내에 있는 A값의 인덱스를 찾는 함수입니다. 여러개일 경우 가장 첫 번째 값의 인덱스를 반환합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;count(A)&lt;/b&gt;&lt;/u&gt;는 리스트 내에 있는 숫자 A의 개수를 세줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;sort()&lt;/u&gt;&lt;/b&gt;는 말 그대로 리스트를 정렬시켜주는데요.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오름차순의 경우 그대로 두시면 되고, 내림차순은 sort(reverse=True)로 사용 가능합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;reverse()&lt;/u&gt;&lt;/b&gt;는 현재 리스트를 반대로 뒤집는 함수입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;튜플(Tuple)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;튜플은 리스트와 비슷하게 사용되지만, 굉장히 다른 자료구조입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;튜플은 값의 변경 자체가 불가능&lt;/u&gt;&lt;/b&gt;합니다. 따라서 데이터를 보호가 필요할 경우 사용됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;한 가지 동일한 점은 값의 순서가 있기 때문에 index접근이 가능하다는 것입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;두 자료구조의 속도를 비교하자면 튜플이 조금 더 빠릅니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;튜플은 소괄호 ()를 이용하여 데이터를 감싸는 형태로 정의합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1741090635607&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 튜플 생성
colors = (&quot;빨강&quot;, &quot;초록&quot;, &quot;파랑&quot;)
print(colors)  # ('빨강', '초록', '파랑')

# 요소 접근 (인덱싱)
print(colors[1])  # '초록'

# 값 변경 시도 (오류 발생)
# colors[1] = &quot;노랑&quot;  # ❌ TypeError: 'tuple' object does not support item assignment

# 요소 개수 확인
print(len(colors))  # 3

# 튜플에서 특정 값의 개수 찾기
print(colors.count(&quot;빨강&quot;))  # 1&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위의 코드 예시에서 보시는 것 처럼 특정 값을 인덱스로 접근한 뒤 수정하려고하면 타입 에러가 납니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 튜플에서 사용 가능한 연산자를 살펴볼게요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-05 오후 9.06.19.png&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hf3Fg/btsMB6sABy4/zm6kkFgnZ8nRIo9vRzIJQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hf3Fg/btsMB6sABy4/zm6kkFgnZ8nRIo9vRzIJQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hf3Fg/btsMB6sABy4/zm6kkFgnZ8nRIo9vRzIJQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHf3Fg%2FbtsMB6sABy4%2Fzm6kkFgnZ8nRIo9vRzIJQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;417&quot; height=&quot;227&quot; data-filename=&quot;스크린샷 2025-03-05 오후 9.06.19.png&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;튜플은 비교적 간단한 연산자들이 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1741175925450&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 튜플 생성
my_tuple = (3, 1, 4, 1, 5)

my_tuple = my_tuple + (9, 2, 6)  # (3, 1, 4, 1, 5, 9, 2, 6)
my_tuple = my_tuple * 2  # (3, 1, 4, 1, 5, 9, 2, 6, 3, 1, 4, 1, 5, 9, 2, 6)
len(my_tuple)  # 16
index_of_4 = my_tuple.index(4)  # index_of_4 = 2
count_of_1 = my_tuple.count(1)  # count_of_1 = 3&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;덧셈&lt;/b&gt;&lt;/u&gt;의 경우 위의 리스트랑 역할이 같습니다. 다른 튜플과 합해줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;곱셉&lt;/b&gt;&lt;/u&gt; 연산자 같은 경우 리스트와 동일하게 반복해줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;len(A)&lt;/u&gt;&lt;/b&gt;도 동일하게 길이를 측정해주는 함수인데, A가 Tuple입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;index(A)&lt;/b&gt;&lt;/u&gt;는 튜플 내 특정 값 A의 인덱스를 찾아줍니다. 여러 개 있을 경우 첫 번째 값의 위치를 반환합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;count(A)&lt;/u&gt;&lt;/b&gt;의 경우 튜플 내에 있는 A의 개수를 세줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;딕셔너리(Dictionary)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;키(Key)와 값(Value) 쌍으로 저장하는 자료구조&lt;/u&gt;&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기존 리스트와 튜플과는 굉장히 다른 형태인데요. 가장 큰 차이점은 딕셔너리는 순서가 없다는 것입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;딕셔너리의 Key값은 중복될 수 없지만, Value는 중복될 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;딕셔너리 내에 있는 값들은 언제든지 수정 및 삭제할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;표현 방법은 {Key:Value}입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1741176263256&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 딕셔너리 생성
student = {&quot;이름&quot;: &quot;철수&quot;, &quot;나이&quot;: 20, &quot;학교&quot;: &quot;파이썬고&quot;}
print(student)  # {'이름': '철수', '나이': 20, '학교': '파이썬고'}

# 특정 값 조회
print(student[&quot;이름&quot;])  # '철수'

# 값 변경
student[&quot;나이&quot;] = 21  
print(student)  # {'이름': '철수', '나이': 21, '학교': '파이썬고'}

# 새로운 키-값 추가
student[&quot;전공&quot;] = &quot;컴퓨터&quot;
print(student)  # {'이름': '철수', '나이': 21, '학교': '파이썬고', '전공': '컴퓨터'}

# 키 삭제
del student[&quot;학교&quot;]
print(student)  # {'이름': '철수', '나이': 21, '전공': '컴퓨터'}

# 딕셔너리의 모든 키와 값 조회
print(student.keys())  # dict_keys(['이름', '나이', '전공'])
print(student.values())  # dict_values(['철수', 21, '컴퓨터'])&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같이 초기 student 딕셔너리를 선언하고, 언제든지 특정 키에 대한 값을 변경할 수 있으며 추가, 삭제가 자유롭습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 딕셔너리에서 사용 가능한 연산자를 살펴보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-05 오후 9.08.24.png&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAIVUm/btsMA7lKpUQ/4iVjtRpJ2Frdb3ijMqvLp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAIVUm/btsMA7lKpUQ/4iVjtRpJ2Frdb3ijMqvLp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAIVUm/btsMA7lKpUQ/4iVjtRpJ2Frdb3ijMqvLp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAIVUm%2FbtsMA7lKpUQ%2F4iVjtRpJ2Frdb3ijMqvLp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;379&quot; height=&quot;337&quot; data-filename=&quot;스크린샷 2025-03-05 오후 9.08.24.png&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;앞에서 못봤던 함수들이 굉장히 많죠.&lt;/p&gt;
&lt;pre id=&quot;code_1741176673898&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 딕셔너리 생성
my_dict = {&quot;a&quot;: 1, &quot;b&quot;: 2, &quot;c&quot;: 3}

# len() : 딕셔너리 길이 반환 (키 개수)
len(my_dict)  # 3
&quot;a&quot; in my_dict  # True
&quot;x&quot; in my_dict  # False
my_dict.keys()  # dict_keys(['a', 'b', 'c'])
my_dict.values()  # dict_values([1, 2, 3])
my_dict.items()  # dict_items([('a', 1), ('b', 2), ('c', 3)])
my_dict.get(&quot;b&quot;)  # 2
my_dict.get(&quot;x&quot;)  # None / 없는 키일 경우 None 반환
my_dict.get(&quot;x&quot;, &quot;기본값&quot;)  # &quot;기본값&quot; / key가 없으면 &quot;기본값&quot;반환
popped_value = my_dict.pop(&quot;b&quot;)  # popped_value = 2
my_dict.update({&quot;d&quot;: 4, &quot;e&quot;: 5})  # my_dict = {'a': 1, 'c': 3, 'd': 4, 'e': 5}
my_dict.clear()  # my_dict = {}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;len(A)&lt;/b&gt; &lt;/u&gt;같은 경우 앞의 리스트, 튜플과 같은데요. 딕셔너리 A의 key-value쌍이 몇개인지 숫자를 세줍니다. A는 딕셔너리 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;in&lt;/u&gt;&lt;/b&gt;은 함수가 아니고, 단순 key값이 포함되어 있는지 찾기 위해 사용합니다. 왼쪽은 찾고자 하는 key, 오른쪽엔 딕셔너리를 적으시면 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;keys()&lt;/u&gt;&lt;/b&gt;는 딕셔너리에 있는 모든 key값들을 반환합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;values()&lt;/u&gt;&lt;/b&gt;는 딕셔너리 내에 있는 모든 value값들을 반환합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;items()&lt;/u&gt;&lt;/b&gt;는 딕셔너리 내에 있는 key, value쌍을 반환합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;get(A)&lt;/u&gt;&lt;/b&gt;는 딕셔너리 내에 A라는 키값이 있는지 확인하고 그 값을 반환해줍니다. 없을 경우 None을 반환합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;pop(A)&lt;/u&gt;&lt;/b&gt;는 A라는 키를 가진 값을 반환하고, 기존 딕셔너리에서 삭제시켜줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;update(A)&lt;/u&gt;&lt;/b&gt;는 A라는 딕셔너리를 기존 딕셔너리에 추가해줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;clear()&lt;/u&gt;&lt;/b&gt;는 딕셔너리를 비워줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;세트(Set)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;세트도 기존과는 살짝 다른 성질을 띄는 자료구조입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;세트는 순서가 없으며 값들을 추가, 삭제할 수 있는데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;주의할 점은 순서가 없기 때문에 index로 접근이 불가능합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;특이한 점은 &lt;b&gt;&lt;u&gt;중복해서 저장이 되지 않는다는 것&lt;/u&gt;&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;마치 하나의 집합처럼 사용할 수 있고, 실제로 집합 연산자를 사용하실 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741177149270&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 세트 생성
numbers = {1, 2, 3, 3, 4, 5, 5}
print(numbers)  # {1, 2, 3, 4, 5} (중복 제거됨)

# 요소 추가
numbers.add(6)
print(numbers)  # {1, 2, 3, 4, 5, 6}

# 요소 삭제
numbers.remove(2)
print(numbers)  # {1, 3, 4, 5, 6}

# 집합 연산
A = {1, 2, 3}
B = {3, 4, 5}
print(A | B)  # 합집합: {1, 2, 3, 4, 5}
print(A &amp;amp; B)  # 교집합: {3}
print(A - B)  # 차집합: {1, 2}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;간단하게 추가, 삭제가 가능하고, 집합 연산자들을 모두 사용할 수 있죠.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;세트에서 사용할 수 있는 연산자들도 살펴볼게요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-03-05 오후 9.25.42.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nbN6A/btsMDg14xPv/hPp5jxxqJaZS4YHdO9GQd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nbN6A/btsMDg14xPv/hPp5jxxqJaZS4YHdO9GQd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nbN6A/btsMDg14xPv/hPp5jxxqJaZS4YHdO9GQd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnbN6A%2FbtsMDg14xPv%2FhPp5jxxqJaZS4YHdO9GQd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;390&quot; height=&quot;382&quot; data-filename=&quot;스크린샷 2025-03-05 오후 9.25.42.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;새로운 함수들이 많이 등장했네요.&lt;/p&gt;
&lt;pre id=&quot;code_1741177558953&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 세트 생성
my_set = {1, 2, 3, 4, 5}

len(my_set)  # 5
3 in my_set  # True
10 in my_set  # False
my_set.add(6)  # {1, 2, 3, 4, 5, 6}
my_set.remove(3)  # {1, 2, 4, 5, 6} KeyError 발생 (주의!)
my_set.discard(10)  # {1, 2, 4, 5, 6} (변화 없음)
popped_value = my_set.pop()  # popped_value = 1 (세트라서 임의의 값이 제거됨)
my_set.clear()  # my_set = set()

# 새로운 세트 생성
set1 = {1, 2, 3}
set2 = {3, 4, 5}

# union() : 합집합 (set1 &amp;cup; set2)
set1.union(set2)  # {1, 2, 3, 4, 5}
# intersection() : 교집합 (set1 &amp;cap; set2)
set1.intersection(set2)  # {3}
# difference() : 차집합 (set1 - set2)
set1.difference(set2)  # {1, 2}
set2.difference(set1)  # {4, 5}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;len(A)&lt;/b&gt;&lt;/u&gt;의 경우 세트 A의 길이를 측정해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;in&lt;/u&gt;&lt;/b&gt;의 경우 마찬가지로 왼쪽의 값이 오른쪽의 세트에 있는지 체크해줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;add(A)&lt;/u&gt;&lt;/b&gt;의 경우 세트에 값 A를 추가해줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;remove(A)&lt;/u&gt;&lt;/b&gt;는 세트에 A값이 있을 경우 삭제해주고, 없으면 KeyError를 발생시킵니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;discard(A)&lt;/b&gt;&lt;/u&gt;는 세트에 A값이 있을 경우 삭제해주고, 없을 경우 무시합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;pop()&lt;/b&gt;&lt;/u&gt;은 세트의 값을 무작위로 삭제시킵니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;clear&lt;/b&gt;&lt;/u&gt;는 세트를 초기화합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;B.union(A)&lt;/b&gt;&lt;/u&gt;은 합집합으로 두 세트 A,B의 합집합을 구해줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;B.intersection(A)&lt;/u&gt;&lt;/b&gt;는 두 세트 A,B의 교집합을 구해줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;A.difference(B)&lt;/b&gt;&lt;/u&gt;는 두 세트 A,B의 차집합을 구해줍니다.&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지금까지 파이썬의 자료구조형인 리스트, 튜플, 딕셔너리, 세트에 대해 알아봤습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 자료구조형들은 그럼 언제 쓰는게 적합할까요?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;간단하게 아래의 상황속에서 사용할 수 있을 것 같습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 104px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style9&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;상황&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;자료구조형&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;자료형에&amp;nbsp;순서가&amp;nbsp;필요한&amp;nbsp;경우&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;List, Tuple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;값의&amp;nbsp;변경이&amp;nbsp;필요한&amp;nbsp;경우&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;List&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;변경하면&amp;nbsp;안되는&amp;nbsp;고정값인&amp;nbsp;경우&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;Tuple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;Key로&amp;nbsp;데이터를&amp;nbsp;관리할&amp;nbsp;경우&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;Dictionary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;중복을&amp;nbsp;제거가&amp;nbsp;필요한&amp;nbsp;경우&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;Set&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;앞으로 더 많은 예제에서 다뤄볼 예정이니, 당장 헷갈린다고 해도 너무 걱정마세요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 다음 포스팅에서 만나요~&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;001&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>언어 마스터/파이썬</category>
      <category>python기초</category>
      <category>python자료구조</category>
      <category>파이썬기초</category>
      <category>파이썬자료구조</category>
      <author>컴공누나</author>
      <guid isPermaLink="true">https://jaeyoon-95.tistory.com/264</guid>
      <comments>https://jaeyoon-95.tistory.com/264#entry264comment</comments>
      <pubDate>Wed, 5 Mar 2025 21:30:15 +0900</pubDate>
    </item>
  </channel>
</rss>