我正在进行情感分析,我想使用经过预先训练的快速文本嵌入,但是该文件非常大(6.7 GB),并且该程序需要很长时间才能编译。
private void addNewDataToList(int i, ArrayList<HashMap<String, Object>> shoppingLists, SellerObject soa) {
String userid = FirebaseAuth.getInstance().getCurrentUser().getUid();
ArrayList<HashMap<String, Object>> products = (ArrayList<HashMap<String, Object>>) shoppingLists.get(i).get("products");
String title = (String) shoppingLists.get(i).get("listname");
HashMap<String, Object> newProduct = new HashMap<>();
newProduct.put("sellerId", soa.getId());
newProduct.put("productId", productId);
products.add(newProduct);
HashMap<String, Object> newListObject = new HashMap<>();
newListObject.put("listname", title);
newListObject.put("products", products);
shoppingLists.set(i, newListObject);
ArrayList<ShoppingListObject> finalList = new ArrayList<>();
Map<String, Object> listValue = new HashMap<>();
listValue.put("shoppingLists", Arrays.asList(shoppingLists));
db.collection("Users").document(userid)
.set(listValue, SetOptions.merge())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
}
有什么方法可以加快这一过程吗?
答案 0 :(得分:3)
您可以改为使用gensim加载预训练的嵌入。至少对我来说,这要快得多。首先,您需要pip install gensim,然后可以使用以下代码行加载模型:
from gensim.models import FastText
model = FastText.load_fasttext_format('cc.en.300.bin')
(我不确定您是否需要.bin文件,也许.vec文件也可以。)
要在该模型中嵌入单词,只需使用model[word]
。
答案 1 :(得分:0)
我建议您使用.bin模型,但是如果它不存在并且只有.vec或.txt,请尝试使用Joblib并行化该过程:
from joblib import Parallel, delayed
from tqdm import tqdm
if __name__ == '__main__':
embeddings_index = {}
f = open(os.path.join('D:/multi_lingual', 'wiki.en.align.vec'), 'r', encoding='utf-8')
def loading(line):
values = line.rstrip().rsplit(' ')
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
return word, coefs
embeddings_index = dict(Parallel(n_jobs=-1)(delayed(loading)(line) for line in tqdm(f)))
f.close()
print(len(embeddings_index))
通过监视tqdm进度条,我注意到了改进的地方:
不进行并行化:10208.44it / s
具有并行化:23155.08it / s
我正在使用4核CPUz。由于我在其他产品上使用了处理器,因此结果并不完全准确。也许您会注意到更好的改进。
另一点是,我建议您阅读必读的词以保存它们,以备下次使用,而不是每次都加载整个嵌入文件。
答案 2 :(得分:0)
您也可以将其加载一次,将其另存为泡菜,然后加载泡菜。 在python中加载pickle文件最快。