Фраза Gensim обрабатывает предложение с большим количеством знаков препинания - PullRequest
0 голосов
/ 13 марта 2020

Теперь я пытаюсь использовать 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
...

Большое спасибо за помощь!

1 Ответ

0 голосов
/ 14 марта 2020

Знаки препинания не могут быть основной причиной ваших неудовлетворительных результатов.

Классу Phrases требуется множество примеров естественного использования, чтобы применить свою комбинацию правдоподобных биграмм, основанную исключительно на статистике. (Это не будет хорошо работать с маленькими / игрушечными / надуманными наборами данных.)

И даже с большим количеством данных этот класс Phrases не будет постоянно соответствовать "фразам" или "объектам", которые люди естественно воспринимают, используя свое понимание частей речи и основополагающих концепций в мире. Даже с большим количеством настроек его различных мета-параметров, он будет пропускать пары, которые вы предпочитаете, и создавать пары, которые вы считаете неестественными. Текст с добавленными сопряжениями все еще может быть полезен для многих целей, особенно для задач классификации и поиска информации, но вряд ли он будет выглядеть эстетически корректным для рецензентов.

В вашем крошечном надуманном примере кажется, что martin_mini становится биграммой, потому что слова martin и mini появляются рядом друг с другом достаточно, по сравнению с их отдельными частотами, чтобы вызвать Phrases алгоритм c -комбинацию.

Чтобы предотвратить этот конкретный результат, вы можете рассмотреть (1) предоставление Phrases большего / лучшего объема данных; (2) настройка Phrases параметров, таких как min_count, threshold или scorer; или (3) изменение вашей предварительной обработки / токенизации.

Я не уверен, что будет работать лучше всего для ваших полных наборов данных и целей проекта, и, как отмечалось выше, результаты этого метода могут никогда не совпадать с вашими представлениями об автомобильных терминах, состоящих из нескольких слов.

Вы можете также рассмотреть вопрос о том, чтобы оставить пунктуацию в качестве маркеров и оставить в стоп-словах, чтобы ваша предварительная обработка не создавала ложных пар, таких как «martin mini». Например, ваш sent5 токен может стать:

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

Естественное разбиение данных martin и mini будет затем восстановлено в версии, которая достигает Phrases - так что вы будете вряд ли вы увидите ту же ошибку, что и вы. (Вместо этого вы могли бы очень хорошо видеть другие сбои, когда нежелательные знаки препинания или стоп-слова становятся частью идентифицированных биграмм, когда статистика подразумевает, что эти токены встречаются достаточно часто, чтобы считаться одной единицей. Но это суть и ограничение Phrases алгоритм.)

...