몇 년 전에 텍스트 데이터로 작업을 처음 시작했을 때, 삽입의 전체 개념은 불필요하게 복잡해 보였습니다.나는 내 가방 단어 접근법과 간단한 TF-IDF 벡터로 편안했습니다.
나는 감정 분석 프로젝트에서 도전을 겪을 때까지 진지하게 삽입을 고려하지 않았습니다.나는 제품 리뷰와 함께 일하고 있었고, 내 전통적인 모델은 사르카즘이나 뉘앙스 된 언어로 리뷰를 잘못 분류했습니다.이 문제는 명확해졌습니다 : 내 모델은 "이 제품이 아프다"가 실제로 긍정적 일 수 있거나 "예상대로 작동했다"는 것이 맥락에 따라 중립적이거나 부정적 일 수 있음을 이해하지 못했습니다.
그들은 단순히 환상적인 새로운 기술이 아니라 기계가 언어를 이해하는 방법에 대한 근본적인 한계를 해결합니다.
The Old Days: Life Before Embeddings
이전글 : The Old Days: Life Before Embeddings이 방법과 접근법의 세부 사항에 들어가지 않고 삽입 전에 텍스트 표현을 사용하는 역사를 이해하자.They are very well covered in other places.
One-Hot Encoding
그것은 단어에서 그 단어와 일치하는 위치에있는 단일 "1"을 제외한 모든 제로가있는 희귀 벡터로 각 단어를 나타냈습니다. 그것은 단어를 대규모, 희귀 벡터로 나타냈습니다. 각 단어는 자신의 차원을 얻었습니다. 당신의 단어가 100,000 단어를 가지고 있다면 (그것은 겸손합니다), 각 단어 벡터는 99.999 제로와 단일 1을 가지고있었습니다.이 표현은 우리에게 절대적으로 아무런 의미를 말하지 않았습니다.
"고양이" → [1, 0, 0, 0, ..., 0] (사전 번호 5432) "개" → [0, 1, 0, 0, ..., 0] (사전 번호 8921)
제한
- 차원 폭발 : 벡터는 사전 크기만큼 많은 차원을 가졌습니다 (종종 100,000 이상)
- 의미적 관계가 없음 : "고양이"와 "고양이"는 "고양이"와 "비행기"만큼 다르다 (모두 동일한 거리)
- 컴퓨팅 효율성 부족: 이러한 희귀한 매트릭스의 번식은 매우 자원 집중적이었습니다.
- 일반화 없음: 시스템은 원래 사전 외의 단어를 이해할 수 없었습니다.
Bag-of-Words Approach
그것은 문서에서 단어를 무조건적인 단어 컬렉션으로 취급하여 단어 순서를 완전히 버렸다. "개가 사람을 물었다"와 "사람이 개를 물었다"는 것은 동일한 표현을 가졌을 것이다.
문서 : "고양이는 매트에 앉았다" BoW : {"the": 2, "cat": 1, "sat": 1, "on": 1, "mat": 1}
제한 :
- 단어 순서의 손실 : "개가 사람을 물린다"와 "사람이 개를 물린다"는 동일한 표현이 있었다.
- SPARSE HIGH-DIMENSIONAL VECTORS : 여전히 필요한 단어 크기의 벡터
- 의미적 이해가 없음: 동의어는 완전히 다른 특징으로 표현되었습니다.
- 컨텍스트적 의미가 없음: 각 단어는 컨텍스트에 관계없이 고정된 표현을 가졌습니다.
N-grams
일부 단어 순서를 캡처하기 위해, 우리는 n-grams (n 연속 단어의 순서)를 사용하기 시작했습니다.
unigrams (단일 단어)와 함께, 당신은 100,000의 사전을 가질 수 있습니다. bigrams (글자 쌍)와 함께, 갑자기 당신은 잠재적 인 수백만 가지의 기능을보고 있습니다. trigrams와 함께? 억, 이론적으로. 심지어 공격적 인 절단으로, 차원성은 관리 할 수 없게되었습니다.
Limitations:
제한 :- 결합 폭발: 가능한 n-그램의 수가 급격히 증가한다.
- 데이터 스파르시티: 대부분의 가능한 n-그램은 훈련 데이터에 결코 나타나지 않습니다.
- 제한된 컨텍스트 창: 작은 창 안에서만 캡처된 관계 (일반적으로 2-5 단어)
TF-IDF (Term Frequency-Inverse Document Frequency)
TF-IDF는 단어가 corpus와 관련된 특정 문서에 얼마나 중요한지에 따라 단어를 무게함으로써 문제를 개선했습니다.
Limitations:
제한 :의미적 의미가 없습니다 : 단어의 숫자와 빈도는 그 사용의 중요성을 결정합니다.
The Embedding Revolution: What Changed?
삽입 혁명 : 무엇이 바뀌었습니까?삽입으로의 전환은 단지 점진적인 개선이 아니라 우리가 언어를 대표하는 방식의 패러다임 변화였습니다.
Meaning Through Context
삽입 뒤의 근본적인 통찰력은 실수로 간단합니다 : 유사한 맥락에서 나타나는 단어는 아마도 비슷한 의미를 가지고 있습니다. "개"와 "고양이"가 같은 종류의 단어 ( "고양이", "음식", "머리") 주위에 나타나는 것을 보시면 아마도 의미적으로 관련이 있습니다.
Word2Vec와 같은 초기 삽입 모델은 신경 네트워크를 훈련하여 다음을 예측합니다.
- 주변의 맥락을 바탕으로 한 단어 (Continuous Bag of Words)
- 단어에 기초한 주변의 맥락 (Skip-gram)
이러한 모델의 숨겨진 계층 무게는 우리의 단어 벡터가 되었고, 벡터 공간의 기하학적 속성들 안에서 의미적 관계를 인코딩했습니다.
내가 처음으로 단어 벡터를 묘사하고 "왕" - "남성" + "여성" ≈ "여왕"을 보았을 때, 나는 우리가 혁명적인 무언가에 서 있다는 것을 알았다.
Word2Vec 및 GloVe와 같은 초기 모델은 각 단어에 맥락에 관계없이 단일 벡터를 제공했습니다.
"I need to bank the money" vs. "I'll meet you by the river bank"
BERT와 GPT와 같은 모델은 동일한 단어에 대한 다른 삽입을 생성함으로써이 문제를 해결했습니다.이것은 이름된 엔터티 인식 및 감정 분석과 같은 작업을위한 게임 변환기였으며, 컨텍스트가 의미를 결정합니다.
그래서, 먼저 삽입이 무엇인지 그리고 어떻게 NLP를 변형시키고 이전 접근법의 한계를 해결했는지 이해합시다.
What Are Embeddings?
Embeddings 란 무엇입니까?삽입은 끊임없는 벡터 공간에서 데이터 (텍스트, 이미지, 오디오 등)의 숫자적 표현입니다.For text, embeddings capture semantic relationships between words or documents, allowing machines to understand meaning in a way that is mathematically processable.
Key Concepts:
- 벡터: 다차원 공간의 포인트를 나타내는 숫자의 순서 목록
- 차원: 각 벡터의 값 수 (예: 768-dim, 1024-dim)
- 벡터 공간: 삽입이 존재하는 수학적 공간
- 시멘틱 유사성: 벡터 사이의 거리 또는 각도로 측정 (Closer = more similar)
What Do Dimensions Represent?
삽입 벡터의 각 차원은 데이터의 배운 특징 또는 측면을 나타냅니다.Classical feature engineering는 인간이 각 차원이 의미하는 것을 정의하는 것과는 달리, 현대적인 삽입 모델에서는:
- 차원들은 추상적인 “개념”을 표현하기 위해 훈련 중에 나타난다.
- 개별 차원들은 종종 인간이 해석할 수 있는 특정한 의미가 부족하다.
- 그러나 완전한 벡터는 전체적으로 의미적 정보를 캡처합니다.
- 일부 차원은 감정, 형식, 주제 또는 구문에 해당할 수 있지만 대부분은 특징의 복잡한 조합을 나타냅니다.
Why We Need Embeddings
컴퓨터는 기본적으로 단어가 아니라 숫자로 작동합니다.언어를 처리 할 때 우리는 다음과 같은 숫자 표현으로 텍스트를 변환해야합니다.
- Semantic Relationships - 비슷한 개념은 비슷한 표현을 가져야 한다.
- 컨텍스트적 의미를 보존하십시오 - 같은 단어는 다른 맥락에서 다른 것을 의미 할 수 있습니다.
- 수학적 작업을 활성화 – 유사성을 찾거나 비유를 수행하는 것과 같은
- 규모에서 효율적으로 작업 – 계산 폭발 없이 대량의 텍스트를 처리
삽입은 단어, 문구 또는 문서를 지속적인 공간에서 밀접한 벡터로 표현함으로써 이러한 문제를 해결합니다.Inbeddings solve these problems by representing words, phrases, or documents as dense vectors in a continuous space where semantic relationships are preserved as geometric relationships.
Embeddings의 기초
센스 벡터 Representation
수천 또는 수백만 개의 차원의 희귀한 벡터 대신에, 삽입은 몇 백 개의 밀접한 차원을 사용하여 각 차원이 의미에 기여합니다.
"cat" → [0.2, -0.4, 0.1, -0.8, ..., 0.3] (300 dimensions)
"kitten" → [0.19, -0.38, 0.15, -0.75, ..., 0.29] (similar to "cat")
이것은 규모의 계산 순서를 더 효율적으로 만듭니다.This makes computational orders of magnitude more efficient while enabling richer semantic representation.
Distribution Semantics에 관하여
삽입은 "당신은 그 회사에 의해 단어를 알게 될 것이다" (J.R. Firth)라는 원칙에 기초합니다.
예를 들어 "왕"과 "왕비"는 비슷한 맥락을 가지고 있으므로 거의 동일한 위치에 나타나지 않더라도 비슷한 삽입이 있습니다.
수학적 속성
삽입 공간은 놀라운 수학적 특성을 가지고 있습니다:
vector("king") - vector("man") + vector("woman") ≈ vector("queen")
이것은 벡터 공간에서 직접적으로 아날로그 추론과 정의 작용을 가능하게 합니다.This allows for analogical reasoning and semantic operations directly in the vector space.
전송 학습
사전 훈련된 삽입은 특정 작업에 적합한 일반 언어 지식을 캡처하여 새로운 응용 프로그램에 필요한 데이터를 극적으로 줄일 수 있습니다.
컨텍스트 이해
현대적인 컨텍스트 삽입 (BERT, GPT 등)은 컨텍스트에 따라 동일한 단어를 다른 방식으로 표현합니다.
"I'll deposit money in the bank" → "bank" relates to finance
"I'll sit by the river bank" → "bank" relates to geography
삽입의 역사와 이해에 대한 모든 지식이 있으면 그들을 사용하는 시간입니다.
LLM/SLM 모델을 사용하여 삽입을 생성합니다.
다양한 연구 팀은 여러 언어와 도메인에 걸쳐 다양한 데이터 세트에 훈련 된 삽입 모델을 개발했습니다.이 다양성은 매우 다른 사전과 정의적 이해 능력을 가진 모델로 이어집니다. 예를 들어, 주로 영어 과학 문학에 훈련 된 모델은 다국어 소셜 미디어 콘텐츠에 훈련 된 것보다 기술 개념을 다른 방식으로 코딩합니다.이 전문화는 실무자가 특정 사용 사례에 가장 적합한 삽입 모델을 선택할 수 있습니다.
삽입의 실용적인 구현은 Hugging Face의 SentenceTransformer 패키지와 같은 도서관에 의해 크게 단순화되었으며, 이는 다양한 삽입 모델과 함께 작업할 수 있는 포괄적 인 SDK를 제공합니다. 마찬가지로, OpenAI의 SDK는 많은 벤치마크에서 인상적인 성능을 보여준 삽입 모델에 대한 간단한 액세스를 제공합니다.이 도구들, 그리고 더 많은 도구들은 최첨단 삽입 기술에 대한 민주화된 액세스를 제공하여 개발자가 모델을 처음부터 훈련할 필요없이 애플리케이션에 세마닉적 이해를 통합할 수 있습니다.
이 문서의 이익을 위해 모델은 문장을 입력으로 취하고 해당 벡터 표현을 반환하는 검은 상자로 취급되어야합니다.The details about the process and operations of an embedding model are beyond the scope of this post.
SentenceTransformers Library for Embeddings 사용하기
SentenceTransformer를 사용하여 삽입을 생성하는 가장 간단한 방법:
from sentence_transformers import SentenceTransformer
# Load a pre-trained model
model = SentenceTransformer('all-MiniLM-L6-v2') # 384 dimensions
# Generate embeddings
texts = ["This is an example sentence", "Each sentence becomes a vector"]
embeddings = model.encode(texts)
print(f"Shape: {embeddings.shape}") # (2, 384)
max_seq_length = model.tokenizer.model_max_length
print(max_seq_length) # 256
HuggingFace에서 사용할 수 있는 “all-MiniLM-L6-v2” 모델은 384개의 차원을 가지고 있습니다. 이것은 주어진 단어 또는 문장에 대한 384개의 기능이나 뉘앙스를 캡처할 수 있다는 것을 의미합니다. 이 모델의 시퀀스 길이는 256개의 토큰입니다. 문장은 삽입 과정에서 토큰에 의해 단어와 단어로 분해됩니다. 문장에 대한 토큰 수는 일반적으로 문장에 있는 단어 수보다 25~40% 더 많습니다.
시퀀스 길이는 주어진 입력으로 모델에 의해 처리 될 수있는 토큰의 수를 나타냅니다. 덜한 것은 256 길이로 덮여 있으며, 더 많은 것은 버려집니다.
SentenceTransformer 클래스의 코드 방법은 모델을 사용하기 위해 PyTorch 추론 모드에 포함되어 있습니다.The above code is similar to the PyTorch code:
from sentence_transformers import SentenceTransformer
import torch
# Load the model directly with SentenceTransformer
model = SentenceTransformer("sentence-transformers/msmarco-distilbert-base-tas-b")
# Input text
texts = ["This is an example sentence", "Each sentence becomes a vector"]
# Get embedding directly
with torch.no_grad():
embedding = model.encode(texts, convert_to_tensor=True)
print(embedding)
여기서, torch.no_grad 함수는 뒤로 퍼지는 동안 gradients가 계산되지 않도록 보장합니다.
PyTorch를 사용하여 삽입을 생성하는 또 다른, 더 일반적인 방법:
# Load the model
model = AutoModel.from_pretrained("sentence-transformers/msmarco-distilbert-base-tas-b")
# Get the tokenizer
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/msmarco-distilbert-base-tas-b")
# Tokenize input
text = ["This is an example sentence"]
encoded_input = tokenizer(text, padding=True, truncation=True, return_tensors='pt')
# Get embedding of the [CLS] token
with torch.no_grad():
outputs = model(**encoded_input, return_dict=True)
cls_embedding = outputs.last_hidden_state[:, 0]
print(cls_embedding)
이 코드와 이전 코드 스냅펫의 차이점은 인코딩 기능이 토큰 제어기와 모델을 명시적으로 사용하여 대체되었다는 것입니다.
또 다른 차이점은 outputs.last_hidden_state[:, 0]를 사용하여 CLS 토큰과 관련된 벡터를 검색하는 것입니다.이 CLS 특수 토큰은 각 문장의 시작 부분에 각 문장에 추가되며 전체 문장에 대한 축적된 정보를 포함합니다.
CLS 토큰을 추가하는이 접근법은 특정 트랜스퍼터 기반 아키텍처에만 적용되며, 이는 BERT와 그 변형 및 인코더만 기반의 트랜스퍼터를 포함한다.
Best for:분류 및 시퀀스 수준 예측 작업
Why they work:BERT 스타일 모델의 [CLS] 토큰은 사전 훈련 중 전체 시퀀스에서 정보를 집계하도록 특별히 훈련되었습니다.It functions as a "summary" token that captures the overall meaning.
When to choose:
- BERT, RoBERTa 또는 유사한 모델을 사용하여 분류할 때
- 전체 순서를 나타내는 단일 벡터가 필요할 때
- 아래 작업이 전체 텍스트의 특성을 예측하는 것을 포함하는 경우
사용되는 CLS 방법은 문장에 대한 삽입을 캡처하는 방법 중 하나일 뿐입니다.There are other methods as well.
Mean Pooling
모든 토큰 삽입의 평균을 취하는 것은 많은 작업에 놀라울 정도로 효과적입니다.It is my go-to method when I'm using embeddings for similarity or retrieval tasks.
Best for:Semantic similarity, retrieval, and general-purpose representations에 대한 설명
Why it works:모든 토큰 표현을 평균화함으로써, mean pooling은 소음을 줄이는 동시에 집단적 의미적 콘텐츠를 캡처합니다.It gives equal weight to all meaningful tokens.
When to choose:
- 문서 유사성 또는 의미적 검색 응용 프로그램
- 단일 토큰에 의해 지배되지 않는 강력한 표현이 필요할 때
- When empirical testing shows it outperforms other methods (it often does for similarity tasks)
import torch
from transformers import AutoTokenizer, AutoModel
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# Mean pooling
with torch.no_grad():
outputs = model(**inputs)
# Get attention mask to ignore padding tokens
attention_mask = inputs['attention_mask']
# Sum token embeddings and divide by the number of tokens
sum_embeddings = torch.sum(outputs.last_hidden_state * attention_mask.unsqueeze(-1), dim=1)
count_tokens = torch.sum(attention_mask, dim=1, keepdim=True)
mean_embeddings = sum_embeddings / count_tokens
print(f"Shape: {mean_embeddings.shape}") # (2, 768)
Max Pooling
Max pooling은 모든 토큰을 통해 각 차원에 대한 최대 값을 가져옵니다.It is surprisingly good at capturing important features regardless of where they appear in the text.
Best for:기능 탐지 및 정보 추출 작업
Why it works:Max pooling은 모든 토큰을 통해 각 차원에서 가장 강한 활성화를 선택하여 텍스트에 나타나는 곳에 상관없이 가장 눈에 띄는 기능을 효과적으로 캡처합니다.
When to choose:
- 특정 특징이 그들의 주파수 또는 위치보다 더 중요할 때
- 특정 개념이나 단체의 존재를 찾을 때
- 중요한 신호가 평균에서 희석 될 수있는 긴 텍스트를 다루는 경우
import torch
from transformers import AutoTokenizer, AutoModel
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# Max pooling
with torch.no_grad():
outputs = model(**inputs)
# Create a mask to ignore padding tokens for max pooling
attention_mask = inputs['attention_mask'].unsqueeze(-1)
# Replace padding token representations with -inf so they're never selected as max
token_embeddings = outputs.last_hidden_state.masked_fill(attention_mask == 0, -1e9)
# Take max over token dimension
max_embeddings = torch.max(token_embeddings, dim=1)[0]
print(f"Shape: {max_embeddings.shape}") # (2, 768)
Weighted Mean Pooling
무게된 조합 방법은 위치에 따라 더 중요한 토큰에 더 많은 무게를 부여하려고합니다 (예를 들어, 나중의 토큰에 더 많은 무게를 부여하십시오).
Best for:입력의 다른 부분이 다른 중요성을 갖는 작업
Why it works:모든 단어가 동등하게 의미에 기여하는 것은 아닙니다.Weighted pooling을 사용하면 위치, 관심 점수 또는 기타 관련 지표를 기반으로 특정 토큰을 강조 할 수 있습니다.
When to choose:
- 시퀀스 순서가 중요할 때 (예를 들어, 나중에 토큰에 더 많은 무게를 부여)
- 특정 토큰이 본질적으로 더 유익한 경우 (예를 들어, 노인 및 구문 대 기사)
- 당신이 당신의 임무에 의미가있는 특정 중요성을 가진 경우 heuristic
import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModel
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# Weighted mean pooling - more weight to later tokens
with torch.no_grad():
outputs = model(**inputs)
# Get token embeddings and attention mask
token_embeddings = outputs.last_hidden_state
attention_mask = inputs['attention_mask']
# Create position-based weights (later positions get higher weights)
input_lengths = torch.sum(attention_mask, dim=1).unsqueeze(-1)
position_indices = torch.arange(token_embeddings.size(1)).unsqueeze(0).expand_as(attention_mask)
position_weights = position_indices.float() / input_lengths.float()
position_weights = position_weights * attention_mask
# Normalize weights to sum to 1
position_weights = position_weights / torch.sum(position_weights, dim=1, keepdim=True)
# Apply weights and sum
weighted_embeddings = torch.sum(token_embeddings * position_weights.unsqueeze(-1), dim=1)
print(f"Shape: {weighted_embeddings.shape}") # (2, 768)
마지막 토큰 폴링
Last token pooling은 최종 토큰의 표현만 선택함으로써 토큰 삽입의 시퀀스에서 단일 삽입 벡터를 생성하는 기술입니다.
Best for:Autoregressive Models and Sequential Processing에 대한 리뷰 보기
Why it works:GPT와 같은 왼쪽에서 오른쪽 모델에서 최종 토큰은 전체 시퀀스에서 축적 된 맥락을 포함하여 특정 작업에 대한 정보가 풍부하게 만듭니다.
When to choose:
- GPT 또는 다른 디코더만 사용하는 모델을 사용할 때
- 이전의 전체 상황에 크게 의존하는 작업을 수행할 때
- 텍스트 생성 또는 완료 작업을 위해
import torch
from transformers import AutoTokenizer, AutoModel
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# Last token pooling
with torch.no_grad():
outputs = model(**inputs)
# Get the last non-padding token for each sequence
attention_mask = inputs['attention_mask']
last_token_indices = torch.sum(attention_mask, dim=1) - 1
batch_indices = torch.arange(attention_mask.size(0))
# Extract the last token embedding for each sequence
last_token_embeddings = outputs.last_hidden_state[batch_indices, last_token_indices]
print(f"Shape: {last_token_embeddings.shape}") # (2, 768)
더 많은 방법이 있으며, 이러한 방법은 사용자 지정 방법을 만들기 위해 함께 결합 할 수 있습니다.이것은 단지 개념으로 삽입을 이해하고 다른 기술을 사용하여 삽입을 얻을 수있는 기본 구현의 시작에 불과했습니다.
Looking Forward: Where Embeddings Are Headed
앞을 바라보는 : 삽입이 향하는 곳삽입 공간 (pun intended)은 계속해서 진화하고 있습니다 :
- Multimodal embeddings는 텍스트, 이미지, 오디오 및 비디오 사이의 장벽을 깨고 있습니다.Models like CLIP and DALL-E use embeddings to create a shared semantic space between different modalities.
- MobileBERT 및 DistilBERT와 같은 더 효율적인 아키텍처는 제한된 리소스가있는 가장자리 장치에서 강력한 삽입을 사용할 수 있습니다.
- 전문 기업에 대한 사전 훈련을받은 도메인 특정 삽입은 의학, 법률 및 금융과 같은 분야에서 최첨단 기술을 추진하고 있습니다.
나는 더 나은 의미가 더 작은 단위에서 구축되는 방법을 더 잘 캡처하는 구성에 대해 특히 흥분하고 있으며, 마침내 부정과 구성 문구로 오랫동안의 도전을 해결할 수 있습니다.
Final Thoughts
최종 생각삽입은 단지 또 다른 NLP 기술이 아니라 기계가 언어를 이해하고 처리하는 방법에 근본적인 변화입니다.그들은 우리가 텍스트를 임의의 상징으로 취급하는 것에서 인간이 직관적으로 이해하는 의미와 관계의 풍부하고 복잡한 네트워크를 캡처하기 위해 우리를 옮겼습니다.
당신이 일하고있는 NLP 작업이 무엇이든 간에, 생각 깊게 적용 된 삽입이 더 나아질 수 있다는 확률이 높습니다.
그리고 당신이 여전히 텍스트 분석을위한 단어 가방 또는 단일 뜨거운 인코딩을 사용하는 경우 ...
글쎄, 가능성의 전체 세계가 당신을 기다리고 있습니다.