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

Python 使用大量标点符号处理句子的Gensim短语,python,nlp,gensim,phrase,Python,Nlp,Gensim,Phrase,现在我正在尝试使用gensim短语,以便在我自己的语料库基础上学习短语/特殊意义 假设我拥有与汽车品牌相关的语料库,通过删除标点符号和停止词,将句子标记化,例如: sent1 = 'aston martin is a car brand' sent2 = 'audi is a car brand' sent3 = 'bmw is a car brand' ... 通过这种方式,我希望使用gensim短语进行学习,以便输出如下所示: from gensim.models import Phras

现在我正在尝试使用
gensim短语
,以便在我自己的语料库基础上学习短语/特殊意义

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

sent1 = 'aston martin is a car brand'
sent2 = 'audi is a car brand'
sent3 = 'bmw is a car brand'
...
通过这种方式,我希望使用
gensim短语
进行学习,以便输出如下所示:

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']
...
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']
...
['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
...
但是,如果很多句子都有很多标点符号:

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, ...]
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']
...
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']
...
['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
...
在这种情况下,我应该如何处理带有大量标点符号的句子,以防止出现
martin_mini
case,并使输出看起来像:

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']
...
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']
...
['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
...

非常感谢你的帮助

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

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

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

在你设计的小例子中,
martin_mini
似乎变成了一个双字符,因为单词
martin
mini
与它们各自的频率相比,彼此并排出现,足以触发
短语
算法组合

为了防止这种特殊的结果,你可以考虑(1)给出<代码>短语< /代码>更多/更好的数据;(2) 调整

短语
参数,如
最小计数
阈值
,或
记分器
;或者(3)更改预处理/标记化

我不确定什么对您的完整数据集和项目目标最有效,如上所述,这种技术的结果可能永远不会与您对多词汽车术语的想法紧密匹配

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

sent5
标记化可以变成:

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