I got good results by treating this question as a classification problem using Embeddings (Glove 50 for words embeddings) and bidirectional LSTM. I know this problem looks more an Entity Recognition problem, but in my use case, I only need to classify a known subset of merchants, so it works well. As the training data was very unbalanced, I also used data-synthesis to boost the accuracy.
My Keras model :
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
words_input (InputLayer) (None, None) 0
__________________________________________________________________________________________________
casing_input (InputLayer) (None, None) 0
__________________________________________________________________________________________________
embedding_1 (Embedding) (None, None, 50) 20000000 words_input[0][0]
__________________________________________________________________________________________________
embedding_2 (Embedding) (None, None, 9) 81 casing_input[0][0]
__________________________________________________________________________________________________
concatenate_1 (Concatenate) (None, None, 59) 0 embedding_1[0][0]
embedding_2[0][0]
__________________________________________________________________________________________________
bidirectional_1 (Bidirectional) [(None, 400), (None, 416000 concatenate_1[0][0]
__________________________________________________________________________________________________
dense_1 (Dense) (None, 1591) 637991 bidirectional_1[0][0]
==================================================================================================
Total params: 21,054,072 Trainable params: 1,053,991 Non-trainable params: 20,000,081
__________________________________________________________________________________________________