summary refs log tree commit diff stats
path: root/dialogue.cpp
blob: dd34ee5dc523a7f7c459afca02b0135977b4c2ef (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "vendor/csv.h"
#include "identifier.h"
#include "histogram.h"
#include <rawr.h>
#include <cstdlib>
#include <ctime>
#include <map>
#include <string>
#include <iostream>
#include <sstream>



using speakerstore = identifier<std::string>;
using speaker_id = speakerstore::key_type;


struct speaker_data {

  std::string name;
  histogram<speaker_id> nextSpeaker;
  rawr chain;

};




int main(int, char**)
{
  srand(time(NULL));
  rand(); rand(); rand(); rand();

  speakerstore speakers;
  std::map<speaker_id, speaker_data> speakerData;
  histogram<speaker_id> allSpeakers;



  io::CSVReader<2,io::trim_chars<' ', '\t'>,io::double_quote_escape<',', '"'>> in("../dialogue.csv");
  std::string speaker;
  std::string line;

  bool hadPrev = false;
  speaker_id prevSpeaker;

  while (in.read_row(speaker, line))
  {
    speaker_id spId = speakers.add(speaker);
    speaker_data& myData = speakerData[spId];
    myData.name = speaker;

    allSpeakers.add(spId);

    if (hadPrev && prevSpeaker != spId)
    {
      speaker_data& psd = speakerData[prevSpeaker];
      psd.nextSpeaker.add(spId);
    }

    myData.chain.addCorpus(line);

    hadPrev = true;
    prevSpeaker = spId;
  }

  for (auto& sp : speakerData)
  {
    sp.second.chain.compile(4);
    sp.second.nextSpeaker.compile();
  }

  std::cout << "Speakers:" << std::endl;
  for (auto& sp : speakerData)
  {
    std::cout << "  " << sp.second.name << std::endl;
  }
  std::cout << std::endl;

  allSpeakers.compile();

  for (;;)
  {
    speaker_id curSpeaker = allSpeakers.next();

    std::ostringstream theEnd;

    for (int i = 0; i < 5; i++)
    {
      speaker_data& curSd = speakerData.at(curSpeaker);

      //std::ostringstream thisLine;

      if (curSd.name != "")
      {
        theEnd << curSd.name << ": ";
      }

      theEnd << curSd.chain.randomSentence(1);

      /*if (i > 0 && theEnd.str().length() + thisLine.str().length() > 280)
      {
        break;
      }*/

      theEnd << std::endl;
      //theEnd << thisLine.str();

      curSpeaker = curSd.nextSpeaker.next();
    }

    std::string output = theEnd.str();
    output.resize(280);
    output = output.substr(0, output.find_last_of('\n'));
    std::cout << output;

    std::cout << std::endl;
    std::cout << std::endl;

    getc(stdin);
  }
}