我使用gensim Word2Vec学习在银行交易备忘录中嵌入货币金额和其他数字数据。我们的目标是从未来的输入字符串中提取这些金额和货币。
我们的输入字符串类似于
"AMAZON.COM TXNw98e7r3347 USD 49.00 @ 1.283"
在预处理期间,我用一个特殊的VALUE_TOKEN标记并替换所有可能是货币数量(仅由数字、逗号和<= 1小数点/周期组成的字符串)的标记。我还用RATE_TOKEN手动替换汇率。结果将是
["AMAZON", ".COM", "TXNw", "98", "e", "7", "r", "3347", "USD", "VALUE_TOKEN", "@", "RATE_TOKEN"]
使用列表data
中所有预处理的字符串列表,我生成模型
model = Word2Vec(data, window=3, min_count=3)
我最感兴趣的模型嵌入是VALUE_TOKEN, RATE_TOKEN,以及任何货币(美元,欧元,加元等)。现在我已经生成了模型,我不确定该如何处理它。
假设我有一个模型从未见过的新字符串
new_string = "EUR 299.99 RATE 1.3289 WITH FEE 5.00"
我想使用model
来识别new_string
的哪些令牌在上下文上最类似于VALUE_TOKEN(它应该返回["299.99", "5.00"]),这最接近RATE_TOKEN ("1.3289")。它应该能够基于学习嵌入对这些进行分类。我可以用处理训练数据的方式预处理new_string
,但是因为我事先不知道汇率,所以["299.99", "5.00", " 1.389 "]的所有三个令牌都将被标记为相同的(使用VALUE_TOKEN或新的UNIDENTIFIED_TOKEN)。
我已经研究了most_similar
和similarity
这样的方法,但不认为它们适用于不一定在词汇表中的标记。我应该使用什么方法来做到这一点?这是正确的方法吗?
Word2vec模糊,密度嵌入标记表示别打击我当作正确的工具,你在做什么,尽管他们可能是一个混合的方式间接因素。
特别是:
- word2vec算法起源于,&当应用于自然语言文本时,具有最一致的公开结果,具有相对标记频率的特定模式,以及不同的共现。当然,许多人已经成功地将其应用于其他类型的文本/记录数据,但这种用途可能需要更多的预处理/参数调优,并且在某种程度上,底层数据具有一些固定的,高度重复的方案,可能更适合其他方法。
- 如果用
'VALUE_TOKEN'
, &代替所有已知的值'RATE_TOKEN'
的所有已知速率,那么模型只会学习'VALUE_TOKEN'
的标记向量;'RATE_TOKEN'
。这样的模型将无法为'$1.2345'
或'299.99'
等从未见过的非替换令牌提供任何向量。即使将所有这些折叠到'UNIDENTIFIED_TOKEN'
,也只会将模型限制为之前学习到的'UNIDENTIFIED_TOKEN'
向量(如果有的话,在训练数据中)。 - 我没有注意到现有word2vec实现提供一个接口,用于推断新unknown-vectors word-vector,从一个或几个新的外观语境的例子。它们可以,在'段落向量'/
Doc2Vec
使用的相同样式的new-document-vector推断中,但只是没有。)我见过的最接近的是Gensim的predict_output_word()
,它在负采样模型上对每个"输出节点"(每个已知单词一个)进行类似cbow的前向传播,给出给定一些上下文单词最有可能出现的已知单词的排名列表。
predict_output_word()
可能,如果提供周围的已知令牌,它是否表明您的'VALUE_TOKEN'
或'RATE_TOKEN'
是更可能的模型预测,从而有助于满足您的需求。如果您总是确定正确的答案是其中之一,那么您可以将其代码调整为仅评估这两个候选项,以提高速度。对上下文词向量的平均值和候选答案向量进行简单的比较,可能与完全的前向传播一样有效。
或者,您可能希望将word2vec模型单独用作某些其他分类器的特征源(通过上下文词),这些分类器被训练以回答VALUE
或TOKEN
。这个分类器的输入可能包括如下内容:
- 所有附近令牌向量的平均值
- 最近邻的完整向量
- 假设非数字标记的词汇表相当短,则所有附近(或"前面"或"后面")已知标记的单热编码('bag-of-words') &高度象征
- ?
如果数据流可能包含任意新的或损坏的令牌,其含义可以从子字符串中推断出来,那么您也可以考虑使用FastText
模型。