使用大量标点符号处理句子的Gensim短语

2024-10-05 14:29:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

假设我拥有与汽车品牌相关的语料库,通过删除标点符号和停止词,将句子标记化,例如:

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
...

非常感谢你的帮助


Tags: iscarsentmartinminiphrasesbrandgensim
1条回答
网友
1楼 · 发布于 2024-10-05 14:29:16

标点符号可能不是你不满意结果的主要原因

Phrases类需要大量的自然用法示例来应用其纯粹基于统计的似是而非的bigram组合。(它在小型/玩具大小/人造数据集上无法正常工作。)

即使有大量的数据,这个类也无法始终与人类自然感知的“短语”或“实体”相匹配,因为人类使用了对词类和世界基本概念的理解。即使有很多对它的元参数的调整,它也会错过你可能喜欢的配对,并使你可能认为不自然的配对。添加配对的文本可能仍有许多用途,尤其是分类和分类;信息检索任务–但在人类评论员看来,这不太可能在美学上正确

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

为了防止这种特殊的结果,你可以考虑(1)给出^ {CD1>}更多/更好的数据;(2) 调整Phrases参数,如min_countthresholdscorer;或者(3)更改预处理/标记化

我不确定对于您的完整数据集&;项目目标,如上所述,此技术的结果可能永远不会与您对mutli单词汽车术语的想法紧密匹配

你也可以考虑在标点符号中留下标记,然后用停止词来保留,这样你的预处理就不会产生类似“Martin Mini”这样的错误配对。例如,您的sent5标记化可以变成:

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

数据的自然分割martinmini将在到达Phrases的版本中恢复,因此您不太可能看到与您看到的相同的故障。(相反,您可能会看到其他失败,不需要的标点符号或停止词成为已识别的bigram的一部分,而统计数据表明这些标记经常同时出现,足以被视为单个单元。但这就是Phrases算法的本质和局限性。)

相关问题 更多 >