레코드 해결 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])

좋은 웹페이지 즐겨찾기