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

原文标题Generating Trigrams with Gensim’s Phraser Package in Python

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

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

原文链接:https://stackoverflow.com//questions/71914383/generating-trigrams-with-gensims-phraser-package-in-python

回复

我来回复
  • gojomo的头像
    gojomo 评论

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

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

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

    总的来说,要注意:没有大量数据,任何数量的Phrases应用程序的输出都可能不强。而且在所有情况下,它可能对人类的感觉“看起来不正确”——因为它是纯粹的统计数据、共现驱动的。 (虽然,即使它的输出看起来很奇怪,它有时也会有助于某些信息检索/分类任务,因为它设法创建了不同于单字元的有用的新特征。)

    我的建议是:

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

    (不幸的是,我在当前的 Gensim 文档中找不到两级Phrases使用的示例——我认为一些旧示例在文档简化工作中被删掉了。但是有几个示例没有使用全错在项目的测试源代码中 – 搜索文件 https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/test/test_phrases.pyfortrigram。但请记住,这些也不是最佳实践,因为关注最少测试。)

    2年前 0条评论