2016-03-01 26 views
7

Tôi cần phải đào tạo biểu diễn word2vec trên tweets bằng gensim. Không giống như hầu hết các hướng dẫn và mã tôi đã thấy trên gensim dữ liệu của tôi không phải là thô, nhưng đã được xử lý trước. Tôi có một từ điển trong một tài liệu văn bản có chứa từ 65k (bao gồm một mã thông báo "không xác định" và mã thông báo EOL) và các mẩu tin được lưu dưới dạng ma trận cứng nhắc với các chỉ mục vào từ điển này. Một ví dụ đơn giản của định dạng dữ liệu có thể được nhìn thấy dưới đây:Gensim word2vec trên dữ liệu từ điển và từ chỉ định được xác định trước

dict.txt

you 
love 
this 
code 

tweets (5 là không rõ và 6 là EOL)

[[0, 1, 2, 3, 6], 
[3, 5, 5, 1, 6], 
[0, 1, 3, 6, 6]] 

Tôi không chắc chắn làm thế nào tôi nên xử lý các biểu diễn chỉ mục. Một cách dễ dàng là chỉ cần chuyển đổi danh sách các chỉ mục thành danh sách các chuỗi (ví dụ: [0, 1, 2, 3, 6] -> ['0', '1', '2', '3', '6 ']) khi tôi đọc nó vào mô hình word2vec. Tuy nhiên, điều này phải không hiệu quả như gensim sau đó sẽ cố gắng tìm kiếm chỉ mục nội bộ được sử dụng cho ví dụ: '2'.

Làm cách nào để tải dữ liệu này và tạo biểu diễn word2vec một cách hiệu quả bằng gensim?

Trả lời

7

Cách thông thường để khởi tạo một mô hình Word2Vec trong gensim là [1]

model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4) 

Câu hỏi đặt ra là, là những gì sentences? sentences được coi là một iterator của iterables của từ/thẻ. Nó cũng giống như ma trận cục u mà bạn có, nhưng mỗi hàng có thể có độ dài khác nhau.

Nếu bạn xem tài liệu cho gensim.models.word2vec.LineSentence, nó cung cấp cho bạn cách tải một tệp văn bản dưới dạng câu trực tiếp. Như một gợi ý, theo tài liệu, phải mất

một câu = một dòng; các từ đã được xử lý trước và phân tách bằng khoảng trắng.

Khi nó nói words already preprocessed, nó đề cập đến bộ lọc thấp hơn, bắt nguồn, từ dừng và tất cả các quy trình làm sạch văn bản khác. Trong trường hợp của bạn, bạn sẽ không muốn 56 nằm trong danh sách câu, vì vậy bạn cần phải lọc chúng ra.

Giả sử bạn đã có ma trận gọn gàng, giả sử mỗi hàng là một câu, tốt hơn là sau đó truyền nó thành một mảng 2d và lọc ra tất cả 56. Mảng 2d kết quả có thể được sử dụng trực tiếp làm đối số sentences để khởi tạo mô hình. Điểm duy nhất là khi bạn muốn truy vấn mô hình sau khi đào tạo, bạn cần phải nhập các chỉ mục thay vì các mã thông báo.

Bây giờ, một câu hỏi bạn có là nếu mô hình lấy số nguyên trực tiếp. Trong phiên bản Python, nó không kiểm tra loại và chỉ chuyển các mã thông báo duy nhất xung quanh. Các chỉ số duy nhất của bạn trong trường hợp đó sẽ hoạt động tốt. Nhưng hầu hết thời gian bạn sẽ muốn sử dụng thường xuyên C-Extended để đào tạo mô hình của bạn, đó là một vấn đề lớn bởi vì nó có thể cung cấp hiệu suất 70x. [2] Tôi tưởng tượng trong trường hợp đó mã C có thể kiểm tra kiểu chuỗi, có nghĩa là có một ánh xạ chuỗi-tới-chỉ mục được lưu trữ.

Điều này có hiệu quả không?Tôi nghĩ không, bởi vì các chuỗi bạn có là số, thường ngắn hơn nhiều so với mã thông báo thực mà chúng đại diện (giả sử chúng là các chỉ số nhỏ gọn từ 0). Do đó các mô hình sẽ có kích thước nhỏ hơn, sẽ tiết kiệm một số nỗ lực trong tuần tự hóa và deserialization của mô hình ở cuối. Về cơ bản, bạn đã mã hóa các mã thông báo đầu vào ở định dạng chuỗi ngắn hơn và tách nó ra khỏi đào tạo word2vec và mô hình word2vec không cần và không biết mã hóa này xảy ra trước khi đào tạo.

Triết lý của tôi là try the simplest way first. Tôi sẽ chỉ cần ném một mẫu thử nghiệm đầu vào của các số nguyên cho mô hình và xem những gì có thể đi sai. Hy vọng nó giúp.

[1] https://radimrehurek.com/gensim/models/word2vec.html

[2] http://rare-technologies.com/word2vec-in-python-part-two-optimizing/

+0

Tôi có thể xác nhận rằng tôi không thể đơn giản nhập số nguyên vào mô hình. Như đã nêu trong bài gốc (có lẽ không đủ rõ ràng), nó hoạt động đơn giản bằng cách ánh xạ các số nguyên thành chuỗi. – pir

+0

Vì tò mò, bạn sẽ lọc ra '5' và' 6' từ mảng 2D như thế nào? Mỗi hàng phải luôn có cùng kích thước. Nó có thể được thực hiện khi lặp qua ma trận để cung cấp nó cho word2vec, nhưng điều đó có vẻ rất không hiệu quả. – pir

1

tôi đã cùng một vấn đề. Thậm chí chuyển sang mảng các chuỗi qua

>>> arr_str = np.char.mod('%d', arr) 

gây ra một ngoại lệ khi chạy Word2Vec:

>>> model = Word2Vec(arr_str) 
ValueError: The truth value of an array with more than one element is ambiguous. 
Use a.any() or a.all() 

Giải pháp của tôi là để viết các mảng các số nguyên dưới dạng văn bản và sau đó sử dụng word2vec với LineSentence.

import numpy as np 
from gensim.models import Word2Vec 
from gensim.models.word2vec import LineSentence 

np.savetxt('train_data.txt', arr, delimiter=" ", fmt="%s") 
sentences = LineSentence('train_data.txt') 
model = Word2Vec(sentences) 
Các vấn đề liên quan