在python中读取经过预先训练的大型fastext词嵌入文件

时间:2019-01-19 16:02:04

标签: python keras sentiment-analysis fasttext

我正在进行情感分析,我想使用经过预先训练的快速文本嵌入,但是该文件非常大(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) {

                }
            });
}

有什么方法可以加快这一过程吗?

3 个答案:

答案 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文件最快。