Advertisement
Guest User

Untitled

a guest
Sep 21st, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.97 KB | None | 0 0
  1. # -*- coding: UTF-8 -*-
  2. # Fake users
  3. from random import choice, random, uniform, gauss, shuffle, randint
  4. from logging import info
  5.  
  6. #[]
  7.  
  8. class Orthography:
  9.     consonants = ['q','w','r','t','z','p','s','d','f','g','h','j','k','l','x','c','v','b','n','m']
  10.     for i in range(0,len(consonants)):
  11.             consonants.append(consonants[i].capitalize())
  12.     vowelPairs = [('o','ó'),('ö','ő'),('u','ú'),('ü','ű'),('i','í')] # +('a','á'),('e','é')
  13.     for i in range(0,len(vowelPairs)):
  14.             vowelPairs.append((vowelPairs[i][0].capitalize(),vowelPairs[i][1].capitalize()))
  15.     lyj = [('ly','j'),('LY','J'),('Ly','J')]
  16.    
  17.     def __init__(self, badjandlyfactor, badconsonantdoublefactor, badvowelfactor):
  18.         self.badjandlyfactor = badjandlyfactor
  19.         self.badconsonantdoublefactor = badconsonantdoublefactor
  20.         self.badvowelfactor = badvowelfactor
  21.    
  22.     def screwUp(self, s):
  23.         if random() < self.badjandlyfactor:
  24.             try:
  25.                 s = self.ly2j(s)
  26.             except ValueError:
  27.                 try:
  28.                     s = self.j2ly(s)
  29.                 except ValueError:
  30.                     pass
  31.         if random() < self.badconsonantdoublefactor:
  32.             try:
  33.                 s = self.randomDoubleConsonantRemover(s)
  34.             except ValueError:
  35.                 try:
  36.                     s = self.randomConsonantDoubler(s)
  37.                 except ValueError:
  38.                     pass
  39.         if random() < self.badvowelfactor:
  40.             s = self.randomVowelChanger(s)
  41.         return s
  42.        
  43.     def ly2j(self, s):
  44.         for i in self.lyj:
  45.             try:
  46.                 ind = s.index(i[0])
  47.                 s = list(s)
  48.                 s[ind] = i[1]
  49.                 s = "".join(s)
  50.             except ValueError:
  51.                 continue
  52.         raise ValueError
  53.    
  54.     def j2ly(self, s):
  55.         for i in self.lyj:
  56.             try:
  57.                 ind = s.index(i[1])
  58.                 s = list(s)
  59.                 s[ind] = i[0]
  60.                 s = "".join(s)
  61.                 return s
  62.             except ValueError:
  63.                 continue
  64.         raise ValueError
  65.    
  66.     def randomConsonantDoubler(self, s):
  67.         for i in range(randint(0, len(s)), len(s)):
  68.             for j in self.consonants:
  69.                 if s[i] == j:
  70.                     s = list(s)
  71.                     s[i] = s[i]+s[i]
  72.                     s = "".join(s)
  73.                     return s
  74.         raise ValueError
  75.                
  76.     def randomDoubleConsonantRemover(self, s):
  77.         for i in range(randint(0, len(s)-1), len(s)-1):
  78.             if s[i] == s[i+1]:
  79.                 s = s.replace(s[i]+s[i], s[i])
  80.                 return s
  81.         raise ValueError
  82.  
  83.     def randomVowelChanger(self, s):
  84.         for i in range(randint(0, len(s)), len(s)):
  85.             for j in self.vowelPairs:
  86.                 if s[i] == j[0]:
  87.                     s = list(s)
  88.                     s[i] = j[1]
  89.                     s = "".join(s)
  90.                     return s
  91.                 elif s[i] == j[1]:
  92.                     s = list(s)
  93.                     s[i] = j[0]
  94.                     s = "".join(s)
  95.                     return s
  96.         return s
  97.  
  98.            
  99. class cUser:
  100.     INTEREST_MULTIPLICATOR = 0.5
  101.    
  102.     def __init__(self, name, tags, comment_repo):
  103.         '''
  104.        Konstruktor: bemenetként egy listát vár a lehetséges tag-ekkel, illetve egy referenciát egy CommentRepo objektumra.
  105.        '''
  106.         self.name = name
  107.         self.interests={}
  108.         for i in tags:
  109.             self.interests[i] = random()*self.INTEREST_MULTIPLICATOR
  110.         self.interestThreshold = random()*1.16
  111.         self.commentRepo = comment_repo
  112.         self.generalLikelihood = random()
  113.         self.ortography = Orthography(random()*0.4, random(), random()*1.16)
  114.  
  115.     def respond(self, tags):
  116.         '''
  117.        Adott tag-listához válaszüzenettel tér vissza, illetve None-al, ha nem érdekli az adott user-t a téma
  118.        '''
  119.         tag_likelihood = [] # az adott lekérdezésben használt tagek felhasználói preferenciával bővített listája
  120.         intr_sum = 0 # a felhasználói preferenciák összege
  121.        
  122.         # feltöltjük az aktuális preferencia-listát
  123.         for tag in tags:
  124.             try:
  125.                 act_intrest = self.interests[tag]
  126.             except KeyError:
  127.                 # ha még nincs ilyen tag a self.interests listában, csinálunk
  128.                 act_intrest = random()*self.INTEREST_MULTIPLICATOR
  129.                 self.interests[tag] = act_intrest
  130.             # szűrjük a tageket, ha nem érdekli a felhasználót, nem rakjuk bele!
  131.             # az alap INTEREST_THRESHOLD-od kap egy random zajt, ami a hozzászóló "kedvét" modellezi
  132.             motivation = self.interestThreshold + gauss(0,0.06)
  133.             info("{0}: motivation: {1}".format(self.name, str(motivation)))
  134.             if act_intrest >= motivation:
  135.                 #print(tag)
  136.                 #print("act_intrest: {0} motivation:{1}".format(act_intrest, motivation))
  137.                 tag_likelihood.append((tag,act_intrest))
  138.                 intr_sum += act_intrest
  139.                
  140.         # ha nem volt semmi olyan ami a felhasználót érdekelte volna, nem válaszol!
  141.         info("{0}: tag_likelihood: {1}".format(self.name, str(tag_likelihood)))
  142.         if not tag_likelihood:
  143.             return None
  144.        
  145.         # választunk az aktuális preferencia-listából egy tag-et a tag-ek preferenciája eséllyel váletlenül,
  146.         # amire válaszolni fogunk
  147.         intr_choice = uniform(0,intr_sum)
  148.         intr_sum_search = 0
  149.         for i in tag_likelihood:
  150.             intr_sum_search += i[1]
  151.             if intr_choice <= intr_sum_search:
  152.                 msg = self.commentRepo.getMsg(i[0], self.generalLikelihood)
  153.                 if msg:
  154.                     return self.ortography.screwUp(msg)
  155.                 return None
  156.         raise Exception("miafasz?")
  157.    
  158.     def __str__(self):
  159.         s = "user[{0}]: interests:\n".format(self.name)
  160.         for tag in self.interests.keys():
  161.             s += "{0}: {1}\n".format(str(tag), str(self.interests[tag]))
  162.         return s
  163.    
  164. class CommentRepo:
  165.     def __init__(self, comment_dict):
  166.         '''
  167.        Konstruktor: bemenetként egy dictionary-t vár, amelyben a kulcsok a tag-ek,
  168.        a hozzá tartozó értékpárok pedig az adott taghez tartozó hozzászólások lehetséges listája.
  169.        '''
  170.         self.commentDict = comment_dict
  171.         self.commentUsabilityDict = {}
  172.         for msglist in comment_dict.values():
  173.             for msg in msglist:
  174.                 self.commentUsabilityDict[msg] = True
  175.        
  176.     def getMsg(self, tag, general_likelihood):
  177.         '''
  178.        Visszaad egy üzenetet, az üzenet general_likelihood eséllyel lesz általános típusú,
  179.        értelemszerűen 1-general_likelihood eséllyel lesz az adott taghoz tartozó speciális üzenet
  180.        '''
  181.         if random() >= general_likelihood:
  182.             try:
  183.                 msg = choice(self.commentDict[tag])
  184.             except KeyError:
  185.                 msg = choice(self.commentDict['general'])
  186.             except IndexError:
  187.                 msg = choice(self.commentDict['general'])
  188.         else:
  189.             msg = choice(self.commentDict['general'])
  190.         # megvizsgáljuk, adott fonálban használták-e már az adott üzenetet
  191.         if self.commentUsabilityDict[msg] == True:
  192.             self.commentUsabilityDict[msg] = False
  193.             return msg
  194.         else:
  195.             return None
  196.        
  197.     def flushUsabilityList(self):
  198.         '''
  199.        Nullázza a usability listában az egyes megjegyzésekhez tartozó használt-értékeket.
  200.        '''
  201.         for msg in self.commentUsabilityDict.keys():
  202.             self.commentUsabilityDict[msg] = True
  203.    
  204.  
  205. class cUserRepo:
  206.     def __init__(self, usernames, comment_dict):
  207.         '''
  208.        Konstruktor: bemenetként az userneveek listáját várja, illetve egy dictionary-t, amelyben a kulcsok a tag-ek,
  209.        a hozzá tartozó értékpárok pedig az adott taghez tartozó hozzászólások lehetséges listája.
  210.        '''
  211.         self.commentRepo = CommentRepo(comment_dict)
  212.         self.users = []
  213.         for name in usernames:
  214.             self.users.append(cUser(name, comment_dict.keys(), self.commentRepo))
  215.        
  216.     def getResponses(self, tags):
  217.         '''
  218.        A megadott tagek listájához visszatér a hozzászólások listájával, ahol az egyes listaelemek hozzászóló neve - hozzászólás párok.
  219.        '''
  220.         responses = []
  221.         for user in self.users:
  222.             response = user.respond(tags)
  223.             if response is not None:
  224.                 responses.append((user.name, response))
  225.         self.commentRepo.flushUsabilityList()
  226.         shuffle(responses)
  227.         return responses
  228.    
  229.     def __str__(self):
  230.         s = "cUserRepo: users:\n"
  231.         for user in self.users:
  232.             s += str(user) + "\n"
  233.         return s
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement