首页 > 解决方案 > 是否可以在 Python 中将 Gensim 包用于非英语语言?

问题描述

我正在将输入文本与文本文件中的文本进行比较。我为此使用了 Gensim 包。在该包中,有几种方法可以将输入字符串与文本文件中的不同字符串进行比较:首先,通过查看单词的出现。只考虑词的频率,而不考虑语义。因此,在这种情况下,文本的语言并不重要。然而,结果是“你几岁?” 和“你几岁?” 没有相似之处,因为这些句子只包含不同的单词。我希望这两个句子重叠,因为它们确实具有相同的语义。

我为此使用了这个例子。包的corporasimilarities模块gensim用于此目的。但是,输入文本和数据库文件中的文本是荷兰语,而不是英语。

我无法找到可以在这些模块中使用非英语语言的任何地方,但我也没有阅读任何你不能阅读的地方。有人可以告诉我这是否可能吗?如果没有,有没有人知道一个好的替代方案?

标签: pythongensimsimilarity

解决方案


Gensim 中的算法通常不是特定于英语的,只要可以将文本标记为单词即可。所以:你正在尝试的是可能的,Gensim 中的算法/示例是一个很好的起点。

您是否尝试过文本上链接的教程示例中的任何代码?结果如何?您提供了多少培训文本?

一般来说,由于算法不是特定于语言的,并且不是从对任何语言的任何先前理解开始的,所以它们所知道的一切都需要从提供的文本中的模式中学习。因此,您需要提供尽可能多的训练数据。

这意味着大多数有趣的算法不会从一个很小的玩具数据集中学习任何东西,例如:

[
  ['how', 'old', 'are', 'you', '?'],
  ['what', 'is', 'your', 'age', '?'],
]

这是因为,在没有任何其他信息的情况下,在算法看来,这基本上是完全相同的数据,如下所示:

[
  ['A', 'B', 'C', 'D', 'E'],
  ['F', 'G', 'H', 'I', 'E'],
]

(只有'E'标记在不同的地方重复,所以在基于共现的分析级别上,它是唯一不同于其他任何标记的。)

但是,如果您有数百、数千或数万个来自目标语言和问题域的真实文本,那么该算法将不会被单一的令牌'B'(又名'old')的发育不良示例所困。它会有几十个或数百个用法示例,每个示例都有各种不同的周围单词。

那时,这些算法中的数学可以检测到有用的模式。然后很可能会“意识到” 'B'( 'old') 和'I'( 'age') 有某种关系。事实上,这些算法中的许多都可以检测到,即使它们从未完全同时出现或相互替换,而只是具有它们经常出现的其他词。那时,对更大的语料库进行训练之后,您的两个句子可能会被认为是相似的。

所以:

  • 不用担心荷兰语和英语的角度,只要你能把你的文本很好地分割成单词标记列表
  • 尝试使用 Gensim 文档中的示例,但使用尽可能多的相关训练数据,您可以实际找到或等待它进行训练 - 这就是它了解单词/语言的方式,而不是来自任何预编程的定义
  • 如果遇到问题,请确保此处的问题描述了您尝试过的内容(最好使用实际代码)以及结果/错误与预期不符的原因

另一种相关的技术是使用word-vectors,它可以被训练,或者从别人的预训练向量中加载,然后用于协助执行文本分析的下一步。Gensim 没有任何词向量,但它可以用来训练它们或加载其他集合。

将词向量应用于您的任务的最简单方法可能是:

  • 找到别人的荷兰语词向量(或者自己训练他们——如果你有很多好的特定领域的文本,这可能比别人的通用向量好得多)
  • 将任何多词文本更改为其所有单个词的平均值
  • 比较这些向量作为文本相似性的基本检查

这仍然会错过(或稀释/取消/等)许多人类感知的文本含义,因为它不考虑语法/词序/上下文/等。但对于广泛的主题比较/检索,这是一个公平的基线。

您训练或找到的任何好的词向量都可能在其自身中捕捉到'how'问题'what'词,'old'并且'age'关注相似的生命周期。所以这个简单的基线可能表明你的 2 个句子比其他 4-5 个单词的随机集合更接近。

根据您的最终需求和资源,可以尝试其他更复杂的文本建模或文本比较的东西 - 包括也使用词向量作为输入或将有序的词序列馈送到更深层神经的东西网络算法来创建更多对长文本的顺序/语法敏感的向量表示。


推荐阅读