在 Python 中使用 Gensim 的 Phraser 包生成 Trigrams

Generating Trigrams with Gensim's Phraser Package in Python

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

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。 不幸的是,我没有计算机科学背景,我在网上找到的解决方案也无济于事。

一般情况下,最好在您的问题中包含(如有必要,稍后进行编辑)您收到的整个多行错误消息,包括任何 'traceback'显示涉及的文件名,line-numbers,和 lines-of-source-code。这有助于潜在的回答者准确地关注哪里出了问题。

此外,请注意 'towardsdatascience.com' 上的许多教程质量很差。我看不到你在没有注册的情况下链接的确切链接(我宁愿不注册),但是从你的代码摘录中,我已经看到了一些你正在尝试做的事情严重程度不同的问题:

  • (致命)如果要多次应用 Phrases 算法来组成比双字母组更长的短语,则不能重复使用为双字母组训练的模型。您需要在先前模型的 输出 上为每个新 level-of-combination 训练一个新模型。也就是说,trigrams Phrases 模型(必须训练)的输入必须是应用 bigram 模型的结果,因此它看到原始 unigrams & now-combined bigrams 的混合。
  • (不明智)通常,在这些 data-hungry 模型上使用低 min_count=1 很容易适得其反。他们需要很多例子,他们 statistical-methods 才能做任何明智的事情;丢弃最稀有的单词通常有助于加快处理速度、缩小模型并主要处理有足够示例来做一些可能明智的事情的标记。 (使用示例很少或只有 1 个,结果可能看起来有点 random/arbitrary。)
  • (有点过时但不是大问题)在 Gensim 4+ 中,Phraser 实用程序 class – 它的存在只是为了优化 Phrases 模型,当你确定您完成了 training/tuning – 已重命名 FrozenPhrases。 (旧名称仍然有效,但这表明教程最近没有更新。)

一般来说,请注意:没有大量数据,任何数量的 Phrases 应用程序的输出都可能不强。在所有情况下,它可能不会 'look right' 对人类的敏感性 – 因为它是纯粹的统计,co-occurrence 驱动。 (虽然,即使它的输出看起来很奇怪,它有时也会对某些 info-retrieval/classification 任务有所帮助,因为它设法创建了有用的新功能,这些功能不同于单独的 unigrams。)

我的建议是:

  • 仅在没有工作的情况下添加任何 Phrases 组合,因此您可以比较结果并查看它是否有帮助。
  • 仅从二元语法开始,并通过仔细审查或严格评分确保 working/helping
  • 如果您需要另一个级别的组合,请稍后添加,并确保使用 already-bigram-combined 文本初始化三元组 Phrases

(不幸的是,我在当前的 Gensim 文档中找不到使用 two-level Phrases 的示例——我认为一些旧示例在文档简化工作中是 edited-out。但是在项目的测试源代码中有几个未使用 all-wrong 的示例 – 在文件 https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/test/test_phrases.py 中搜索 trigram。但请记住,这些也不是最佳实践,因为重点最少的测试。)