【问题标题】:What is the best approach to measure a similarity between texts in multiple languages in python?在python中测量多种语言文本之间相似性的最佳方法是什么?
【发布时间】:2021-06-10 23:07:32
【问题描述】:

所以,我有一个任务需要测量两个文本之间的相似度。这些文本是杂货店产品的简短描述。它们总是包含产品的名称(例如牛奶),并且可能包含生产商和/或尺寸,还可能包含产品的其他一些特征。

我有一整套这样的文本,然后,当新的文本到来时,我需要确定我的数据库中是否有类似的产品,并衡量它们的相似程度(从 0 到 100%)。

问题是:文本可能有两种不同的语言:乌克兰语和俄语。另外,如果有外国品牌(如Coca Cola),也会用英文写。

我解决此任务的最初想法是获取多语言词嵌入(不同语言的相似词位于附近)并找到这些文本之间的距离。但是,我不确定这会有多有效,如果可以,从什么开始。

因为我拥有的每个文本只是一组产品特征,一些基于上下文的词嵌入可能不起作用(我不确定这个陈述,这只是我的假设)。

到目前为止,我一直在尝试熟悉MUSE 框架,但我遇到了issuefaiss 安装。

因此,我的问题是:

  • 我的词嵌入想法值得一试吗?
  • 有没有更好的方法?
  • 如果词嵌入的想法没问题,我应该使用哪些?

注意:我有 Windows 10(以防某些库无法在 Windows 上运行),我需要该库支持乌克兰语和俄语。

提前感谢您的帮助!任何建议将不胜感激!

【问题讨论】:

    标签: python nlp multilingual similarity word-embedding


    【解决方案1】:

    您可以尝试采用FaissMilvus 来搜索相似向量。在windows操作系统下用docker安装很简单。

    【讨论】:

      【解决方案2】:

      词嵌入在语言内部是有意义的,但不能转移到其他语言。对这个陈述的一个观察是:如果两个词在句子中同时出现很多,它们的嵌入可以彼此靠近。因此,由于两种通用语言之间没有一对一的映射关系,因此无法比较词嵌入。

      但是,如果两种语言与一对一的映射词足够相似,那么您可以相信自己的想法。

      总而言之,没有翻译,你的想法不再适用于两种通用语言。

      【讨论】:

      • 但是不存在针对多种语言的预训练词嵌入吗?嵌入在公共空间中对齐。例如在 MUSE/FastText (fasttext.cc/docs/en/aligned-vectors.html) 中?
      • @OlegIvanytskyi 恐怕是这样!你的任务不使用翻译任务是不能单独通过词嵌入来完成的。
      • 好的,知道了!也许还有另一种方法?
      • 我不认为@OmG 理解了 OP 的观点。我同意并说它可能与多语言相关的词嵌入
      • 回复了您的问题,并提供了一些链接,这些链接指向有相同问题的人的潜在解决方案
      【解决方案3】:

      数据是否包含大量数字信息(例如营养成分)?如果是,这可以用来在一定程度上比较产品。我的建议是不要将其视为语言问题,而应将其视为模式匹配,因为这些文本可能是使用翻译记忆库的半自动方法生成的。因此,跨语言的相似文本可能具有相似的形式,如果是这样,则应将其用于比较。

      多语言文本比较不是一项简单的任务,我认为没有任何相当好的开箱即用解决方案。是的,存在多语言嵌入,但必须对其进行微调才能处理特定的下游任务。

      【讨论】:

      • 很遗憾没有,没有很多数字信息(只有大小甚至大小并不总是存在)。
      • 这部分我不太明白:these texts have been assumably produced using semi-automatic methods using translation memories.这些只是从杂货店网站上取的名字。因此,甚至可能有相同的产品以一种语言的不同文本呈现(例如,可能只有“牛奶”和“牛奶 18 盎司”——这两种文本都是用乌克兰语写的),我需要衡量这些文本的相似程度
      • 好的,我以为您对产品有更详细的信息。一种方法是使用机器翻译将所有文本翻译成某种通用语言(例如英语),然后使用术语/文档向量来识别相似的文本。看看这个:elastic.co/blog/… 我发现这个功能在类似的情况下非常有用。您的问题中最困难的部分是多语言方面,因为在嵌入模型中让多种语言共享向量空间非常困难。
      • 我试试看!谢谢!
      【解决方案4】:

      假设您的任务是关于细粒度的实体识别。我认为你有一个明确定义的实体:品牌、尺寸等...... 因此,这些定义产品的每个特征都可以是一个向量,这意味着您的产品可以用一个矩阵来表示。 您可以使用嵌入来表示每个特征。 或者是嵌入向量和 one-hot 向量的混合。

      方法如下。

      1. 定义产品功能列表: 产品名称、品牌名称、尺寸、重量。
      2. 对于每个产品功能,您需要一个文本识别模型: 例如。通过品牌识别,您可以找到文本的哪一部分是其品牌名称。
      3. 如果可以对所有子文本进行统一的语言表示,请使用机器翻译。例如。 Coca Colaru Кока-Кола, en Coca Cola
      4. 使用上下文嵌入(即拥抱脸多语言 BERT 或更好的东西)将提示文本转换为一个向量。
      5. 为了比较两个产品,比较它们的特征向量:两个特征数组之间的平均相似度是多少。您还可以决定每个特征的权重。
      6. 尝试其他矢量化方法。也许你不想混合品牌仿冒品:“可口可乐”类似于“酷可乐”。所以,也许嵌入对于品牌名称、尺寸和重量来说并不好,但对于产品名称来说就足够了。如果您想要完全匹配,则需要为其文本使用哈希函数。关于他们的多语言提示工程文本。
      7. 您还可以扩展每个特征向量,将多个嵌入或源语言的一个热向量串联起来,诸如此类。

      这里没有确定的答案,您需要进行试验和测试,看看什么是最好的解决方案。您可以创建一个测试集并为您的解决方案制定基准。

      【讨论】:

      • 很遗憾,没有预定义的品牌、尺寸等集合。也可能存在根本没有任何特征的产品(例如,lemons)。而且新产品经常出现(而且数量很多),因此创建现有特征列表可能不是一种选择
      • 您不需要在此解决方案中预定义品牌或产品类型列表。但是,您需要确定在特性列表中表示产品特性的最佳方式是什么。您需要有一个解决方案来为每个特征提取一个值,以及一种将它们相互比较的方法。如果您不知道,也许您可​​以从语义网络的产品本体子集开始:schema.org/Product
      • 谢谢,我一定会试一试的!
      • 发现这种方法很有用。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多