在 Python 中使用 Gensim 的短语包生成三元组



我在本教程的帮助下创建了以下代码片段,用于无监督情绪分析目的:

sent = [row for row in file_model.message]
phrases = Phrases(sent, min_count=1, progress_per=50000)
bigram = Phraser(phrases)
sentences = bigram[sent]
sentences[1]
file_export = file_model.copy()
file_export['old_message'] = file_export.message
file_export.old_message = file_export.old_message.str.join(' ')
file_export.message = file_export.message.apply(lambda x: ' '.join(bigram[x]))
file_export.to_csv('cleaned_dataset.csv', index=False)

由于现在我想拥有双元组和三元组,我尝试将其调整为:

sent = [row for row in file_model.message]
phrases = Phrases(sent, min_count=1, progress_per=50000)
bigram = Phraser(phrases)
trigram = Phraser(bigram[phrases])
sentences = trigram[sent]
sentences[1]
file_export = file_model.copy()
file_export['old_message'] = file_export.message
file_export.old_message = file_export.old_message.str.join(' ')
file_export.message = file_export.message.apply(lambda x: ' '.join(trigram[x]))
file_export.to_csv('cleaned_dataset.csv', index=False)

但是当我运行这个时,我得到了TypeError: 'int' object is not iterable我认为这是指我对trigram = Phraser(bigram[phrases])的调整。我正在使用gensim 4.1.2. 不幸的是,我没有计算机科学背景,我在网上找到的解决方案也无济于事。

一般来说,最好在问题中包含您收到的整个多行错误消息(如有必要,稍后进行编辑),包括任何显示涉及文件名、行号和源代码行的"回溯"。这有助于潜在的回答者专注于哪里出了问题。

另外,请注意,"towardsdatascience.com"中的许多教程质量很差。我无法在不注册的情况下看到您链接的确切内容(我宁愿不这样做),但是从您的代码摘录中,我已经看到了您尝试执行的操作的一些不同严重程度的问题:

  • (致命)如果要多次应用Phrases算法,以编写比双字母更长的短语,则无法重用为双字母训练的模型。您需要在先前模型的输出上为每个新的组合级别训练一个新模型。也就是说,三元组Phrases模型(必须经过训练)的输入必须是应用二进制模型的结果,因此它看到原始的 unigram 和现在组合的二进制组合的混合。
  • (不明智)一般来说,在这些数据饥渴的模型上使用低min_count=1很容易适得其反。他们需要许多例子来证明他们的统计方法可以做任何明智的事情;丢弃最稀有的单词通常有助于加快处理速度,缩小模型,并主要在令牌上工作,因为有足够的示例来做一些可能明智的事情。(使用示例很少或只有 1 个,结果可能看起来有些随机/任意。
  • (有点过时,但不是大问题) 在 Gensim 4+ 中,Phraserutiity 类——它的存在只是为了稍微优化一下Phrases模型,当你确定你已经完成了训练/调整时——已经重命名为FrozenPhrases.(旧名称仍然有效,但这表明教程最近尚未刷新。

一般来说,请注意:如果没有大量数据,任何数量的Phrases应用程序的输出都可能不强。在所有情况下,它可能对人类的敏感性来说并不"正确"——因为它是纯粹的统计,共同发生驱动的。(虽然,即使它的输出看起来很奇怪,它有时也会帮助某些信息检索/分类任务,因为它设法创建与单独的 unigram 不同的有用新功能。

我的建议是:

  • 只有在事情没有工作之后才添加任何Phrases组合,这样您就可以比较结果并查看是否有帮助。
  • 仅从双字母开始,并确保通过仔细审查或严格的评分来工作/帮助
  • 如果您需要另一个级别的组合,请稍后添加,并确保使用已经组合的文本初始化三元组Phrases

(不幸的是,我在当前的 Gensim 文档中找不到两级Phrases使用的示例——我认为一些旧示例在文档简化工作中被编辑掉了。但是有几个例子表明它在项目的测试源代码中并没有被完全错误地使用——https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/test/test_phrases.py 文件搜索trigram。但请记住,这些也不是最佳实践,因为集中的最小测试。

最新更新