【问题标题】:Gensim phrase handling sentence with a lot of punctuationGensim 短语处理带有大量标点符号的句子
【发布时间】:2020-03-13 11:17:40
【问题描述】:

现在我正在尝试使用gensim Phrases,以便根据我自己的语料库学习短语/特殊含义。

假设我有与汽车品牌相关的语料库,通过去除标点符号停用词标记句子,例如: p>

sent1 = 'aston martin is a car brand'
sent2 = 'audi is a car brand'
sent3 = 'bmw is a car brand'
...

这样,我想用gensim Phrases来学习,输出如下:

from gensim.models import Phrases
sents = [sent1, sent2, sent3, ...]
sents_stream = [sent.split() for sent in sents]
bigram = Phrases(sents_stream)

for sent in sents:
    print(bigram [sent])

# Ouput should be like:
['aston_martin', 'car', 'brand']
['audi', 'car', 'brand']
['bmw', 'car', 'brand']
...

但是,如果很多句子有很多标点符号:

sent1 = 'aston martin is a car brand'
sent2 = 'audi is a car brand'
sent3 = 'bmw is a car brand'
sent4 = 'jaguar, aston martin, mini cooper are british car brand'
sent5 = 'In all brand, I love jaguar, aston martin and mini cooper'
...

那么输出如下:

from gensim.models import Phrases
sents = [sent1, sent2, sent3, sent4, sent5, ...]
sents_stream = [sent.split() for sent in sents]
bigram = Phrases(sents_stream)

for sent in sents:
    print(bigram [sent])

# Ouput should be like:
['aston', 'martin', 'car', 'brand']
['audi', 'car', 'brand']
['bmw', 'car', 'brand']
['jaguar', 'aston', 'martin_mini', 'cooper', 'british', 'car', 'brand']
['all', 'brand', 'love', 'jaguar', 'aston', 'martin_mini', 'cooper']
...

在这种情况下,我应该如何处理带有大量标点符号的句子以防止martin_mini大小写并使输出看起来像:

['aston', 'martin', 'car', 'brand']
['audi', 'car', 'brand']
['bmw', 'car', 'brand']
['jaguar', 'aston_martin', 'mini_cooper', 'british', 'car', 'brand'] # Change
['all', 'brand', 'love', 'jaguar', 'aston_martin', 'mini_cooper'] # Change
...

非常感谢您的帮助!

【问题讨论】:

    标签: python nlp gensim phrase


    【解决方案1】:

    标点符号可能不是导致您不满意结果的主要原因。

    Phrases 类需要大量自然使用示例来应用其基于纯统计的合理二元组组合。 (它不适用于小型/玩具大小/人为的数据集。)

    即使有大量数据,Phrases 类也不会始终匹配人类自然感知的“短语”或“实体”,使用他们对词性和世界中基本概念的理解。即使对其各种元参数进行了大量调整,它也会错过您可能喜欢的配对,并使您认为不自然的配对。添加了配对的文本可能仍可用于许多目的——尤其是分类和信息检索任务——但在人类审阅者看来不太可能在美学上正确。

    在您的小人为示例中,martin_mini 似乎变成了一个二元组,因为与它们各自的频率相比,martinmini 两个词彼此并排出现的频率足以触发 Phrases 算法组合。

    为防止出现这种特定结果,您可以考虑 (1) 提供Phrases 更多/更好的数据; (2) 调优Phrasesmin_countthresholdscorer等参数;或 (3) 更改您的预处理/标记化。

    我不确定哪种方法最适合您的完整数据集和项目目标,并且如上所述,这种技术的结果可能永远不会与您对多词汽车术语的想法非常匹配。

    您还可以考虑在标点符号中留下标记,并在停用词中留下,这样您的预处理就不会产生像“martin mini”这样的错误配对。例如,您的 sent5 标记化可能变为:

    ['in', 'all', 'brand', ',', 'i', 'love', 'jaguar', ',', 'aston', 'martin', 'and', 'mini', 'cooper']
    

    martinmini 的数据自然拆分随后将在达到 Phrases 的版本中恢复 - 因此您不太可能看到与您看到的相同的故障。 (您很可能会看到其他失败,其中不受欢迎的标点符号或停用词成为已识别的二元组的一部分,当统计数据表明这些标记经常同时出现以被视为一个单元时。但这是@987654337 的本质和限制@算法。)

    【讨论】:

      猜你喜欢
      • 2021-01-10
      • 2021-10-10
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多