레코드 해결 TencentAILab_ChineseEmbedding.txt 파일의 구덩이
2212 단어 모기
문제 설명
이 파일은 매우 커서 압축을 풀면 거의 16G에 달하지만 컴퓨터의 설정이 제한되어 있고 이렇게 많은 단어가 필요하지 않다고 생각하기 때문에 스스로 프로그램을 써서 단어의 방향을 불러오는 것이 좋겠다. 그래서 아래의 이 단락이 생겼다.
import numpy as np
from tqdm import tqdm
w = []
v = []
id2word = {}
word2id = {}
with open('Tencent_AILab_ChineseEmbedding.txt', 'r', encoding='utf-8') as f: # 200
_ = f.readline()
for i in tqdm(range(1000000)): # 1000000
word = f.readline()
v.append([float(_) for _ in word.split()[1:]])
id2word[len(id2word)+1] = word.split()[0]
word2id = {i: j for j, i in id2word.items()}
그 다음에list를numpy 데이터로 바꿨습니다. 하지만, 만약 당신이 이렇게 한다면 축하합니다. 다음은 잘못된 것입니다.
word2vec = np.array(v, dtype=np.float32)
위의 형식 변환을 실행하기 전에 아래 줄을 먼저 실행해야 합니다. 이유는 벡터 파일에 빈칸이 있기 때문입니다. 문자열의 split 방법은 기본적으로 이 빈칸을 사용하지 않기 때문에 v의 414개 요소가 잘못되었습니다.if len(v[413]) != 200:
print('debugger v')
v[413].insert(0, -0.073052)
if id2word[414] == '-0.073052':
print('debugger id2word')
id2word[414] = ' '
if '-0.073052' in word2id.keys():
print('debugger word2id')
word2id.pop('-0.073052')
word2id[' '] = 414
전체 코드
import numpy as np
from tqdm import tqdm
w = []
v = []
id2word = {}
word2id = {}
with open('Tencent_AILab_ChineseEmbedding.txt', 'r', encoding='utf-8') as f: # 200
_ = f.readline()
for i in tqdm(range(1000000)): # 1000000
word = f.readline()
v.append([float(_) for _ in word.split()[1:]])
id2word[len(id2word)+1] = word.split()[0]
word2id = {i: j for j, i in id2word.items()}
if len(v[413]) != 200:
print('debugger v')
v[413].insert(0, -0.073052)
if id2word[414] == '-0.073052':
print('debugger id2word')
id2word[414] = ' '
if '-0.073052' in word2id.keys():
print('debugger word2id')
word2id.pop('-0.073052')
word2id[' '] = 414
word2vec = np.array(v, dtype=np.float32)
word_size = word2vec.shape[1]
word2vec = np.concatenate([np.zeros((1, word_size)), word2vec])