Маленькая НЛП просьба на Монгодб

1

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

Наш запрос:

t.aggregate([{$project:{wordt:{$split:["$text"," "]}}},
{$lookup:{from:"infi",localField:"wordt",foreignField:"word",as:"test_word"}},
{$project:
    {tpositif:
        {$cond:[{$eq:["$test_word.polarity","positive"]},1,0]},

    tnegatif:
        {$cond:[{$eq:["$test_word.polarity","negative"]},1,0]}}},

{$group:{
        _id:"$_id",
        count_pos:{$sum:"$tpositif"},
        count_neg:{$sum:"$tnegatif"}
        }])

t - это коллекция твитов, а также коллекция слов.

Мы не можем понять, почему он всегда считает 0.

Спасибо за совет.

  • 0
    Можете ли вы предоставить некоторые примеры данных и структуру двух коллекций. Это помогло бы выполнить запрос.
Теги:
nlp

1 ответ

0

Вы тестируете "$test_word.polarity" но test_word является массивом.

Вы можете решить эту проблему, раскрутив поиск, который разделяет "соединенные" строки на их собственные строки верхнего уровня. Это не должно быть проблемой для вас, так как у вас должна быть только одна запись настроения на слово (иначе вы получите дубликаты).

t.aggregate([{$project:{wordt:{$split:["$text"," "]}}},
{$lookup: 
{from:"infi",localField:"wordt",foreignField:"word",as:"test_word"}},
{$unwind:"$test_word"},
{$project:
    {tpositif:
        {$cond:[{$eq:["$test_word.polarity","positive"]},1,0]},

    tnegatif:
        {$cond:[{$eq:["$test_word.polarity","negative"]},1,0]}}},

{$group:{
        _id:"$_id",
        count_pos:{$sum:"$tpositif"},
        count_neg:{$sum:"$tnegatif"}
        }])

Хороший способ диагностики агрегатных запросов - это вернуть конвейер обратно в начальное предложение и посмотреть, соответствуют ли ожидаемые вами промежуточные коллекции документов. Затем добавьте пункты по одному.

например, сокращение его до двух пунктов выявляет проблему:

> db.tweets.aggregate([ {$project:{wordt:{$split:["$text"," "]}}}, {$lookup:{from:"infi",localField:"wordt",foreignField:"word",as:"test_word"}},  ]);
{ "_id" : ObjectId("5c59442c365f7243b44062f8"), "wordt" : [ "test", "1" ], "test_word" : [ { "_id" : ObjectId("5c594473365f7243b44062f9"), "word" : "test", "polarity" : "negative" } ] }
{ "_id" : ObjectId("5c59463fd56fd34fcc370c74"), "wordt" : [ "the", "infinite", "fool" ], "test_word" : [ { "_id" : ObjectId("5c594625d56fd34fcc370c73"), "word" : "fool", "polarity" : "positive" } ] }
{ "_id" : ObjectId("5c594657d56fd34fcc370c75"), "wordt" : [ "test", "the", "infinite", "fool" ], "test_word" : [ { "_id" : ObjectId("5c594473365f7243b44062f9"), "word" : "test", "polarity" : "negative" }, { "_id" : ObjectId("5c594625d56fd34fcc370c73"), "word" : "fool", "polarity" : "positive" } ] }

Здесь вы можете видеть, что "test_word": [ { "_id"... это массив в квадратных скобках. Таким образом, свойство polarity находится в первом элементе массива, а не в самом $test_word.

КСТАТИ. Сначала я подумал, что вы можете разыменовать первый элемент массива в $eq например, "$test_word[0].polarity" но, похоже, он не работает (я думал, что сделал это один раз).

  • 0
    Вау, спасибо большое Scipilot, мы видим нашу проблему. Еще раз спасибо за ваше время и ваши объяснения. И извините за время ответа, я не понимаю, почему я просто получаю уведомление.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню