Маленькая НЛП просьба на Монгодб - PullRequest
0 голосов
/ 04 февраля 2019

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

Наш запрос:

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.

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

1 Ответ

0 голосов
/ 05 февраля 2019

Вы тестируете "$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", но, похоже, он не работает (я думал, что сделал это один раз).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...