Pythonã§ã¬ã³ã¡ã³ãã»ã·ã¹ãã ãã¤ãã
å調ãã£ã«ã¿ãªã³ã°ã£ã¦ãããã¤ã§ããã
Last.fmã¦ã¼ã¶ã®ãã¼ã¿ã»ããã使ã£ã¦ã
ã¢ã¼ãã£ã¹ããã¬ã³ã¡ã³ããã¦ãããããã°ã©ã ãä½ã£ã¦ã¿ãã
$ recommend.py 274 ï¼ããªããåçãããã¨ã®ããã¢ã¼ãã£ã¹ã:åçæ°ï¼ Depeche Mode : 7386 æµå´ããã¿ : 2046 X JAPAN : 1365 Michael Jackson : 1261 åç°ä¾æª : 1024 hide : 910 GACKT : 746 å®å®¤å¥ç¾æµ : 689 ZARD : 560 Céline Dion : 552 Emilie Autumn : 487 MALICE MIZER : 483 the GazettE : 462 L'Arc~en~Ciel : 373 KAT-TUN : 316 å®å¤ç°ãã«ã« : 295 Aerosmith : 274 AAA : 264 ã¢ã³ãã£ãã¯-çç²åº- : 247 ã¢ã¼ãã³ã°å¨ã : 241 æ¸ æ¥ : 222 Marilyn Manson : 216 Cristina D'Avena : 212 SUGIZO : 210 YOSHIKI : 199 LUNA SEA : 197 Martin L. Gore : 184 DIR EN GREY : 175 é -MIYAVI- : 169 Tommy february6 : 165 Dave Gahan : 164 YUI : 152 Lucio Battisti : 145 大å¡æ : 145 hitomi : 143 Alphaville : 137 T.M.Revolution : 128 SADS : 126 Wonder Girls : 124 NEWS : 118 Fabrizio De André : 118 Capsule : 109 883 : 105 ëë°©ì 기 : 104 RENTRER EN SOI : 99 KOKIA : 95 åæ¨éº»è¡£ : 94 ãã«ãã°ã©ãã£ã㣠: 94 ãããã®ããã : 90 DJ OZMA : 86 ï¼ããªãã«ãªã¹ã¹ã¡ã®ã¢ã¼ãã£ã¹ã:æ¨è¦åº¦ï¼ Luzmelt : 702 Lady Gaga : 591 Eths : 584 BoA : 509 åµ : 470 BIG BANG : 422 KOTOKO : 370 The Horrors : 344 Perfume : 298 Dark Schneider : 295
ãããªæãã§ãåçå±¥æ´ã«å¿ãã¦ãããããã®è´ãã¦ããªãã¢ã¼ãã£ã¹ããã¬ã³ã¡ã³ããã¦ããã¾ãã
ãã£ã¦ããã¨
ãã¼ã¿ã»ãããããã¦ã¼ã¶ã¨ãã®å好ï¼ä»åã¯åçæ°ï¼ãåå¾ãã¦ã
ã¦ã¼ã¶éã®ã¦ã¼ã¯ãªããè·é¢ãããã¯ãã¢ã½ã³ç¸é¢ä¿æ°ãæ±ãã¦ãé¡ä¼¼åº¦ãå¤å®ã
æ±ããããã¦ã¼ã¶éã®é¡ä¼¼åº¦ãããã¦ã¼ã¶ãåçãããã¨ã®ãªãã¢ã¼ãã£ã¹ãã®æ¨è¦åº¦ãæ±ããã
ããã¦ãã®æ¨è¦åº¦TOP10ã®ã¢ã¼ãã£ã¹ããåºåããã
ã¦ã¼ã¯ãªããè·é¢ã«ããé¡ä¼¼åº¦å°åº
ãããããªè·é¢ææ¨ï¼ã¦ã¼ã¯ãªããããã³ããã¿ã³ãããã©ããã¹â¦ï¼ããããã©ãã
ä¸çªããã¥ã©ã¼ãªãã¤ã£ãããä¸å¹³æ¹ã®å®çãå©ç¨ããããã§ãã
n次å
ã®å好空éä¸ã®ã¦ã¼ã¶éã®è·é¢ã調ã¹ããã®éæ°ãé¡ä¼¼åº¦ã¨ããæ¹æ³ã§ãã
ã¦ã¼ã¶sã«ããã¢ã¼ãã£ã¹ãiã®åçæ°ãã¨ãã¦ã
ã¦ã¼ã¶s, téã®é¡ä¼¼åº¦ã¯
ã§æ±ããããã
ã¼ãé¤ç®ãåé¿ããããã«åæ¯ã«1ãå ç®ãã¦ãã¾ãã
ããã§ãå
±éããã¢ã¼ãã£ã¹ããè´ãã¦ããªãã¦ã¼ã¶éã§ã¯1ãåºåããããã¨ã«æ³¨æã§ãã
ã¤ã¾ããé¡ä¼¼åº¦ã1ã¨ãã¦åºåãããå ´åã¯åä¸ã¦ã¼ã¶ãé¡ä¼¼åº¦ãå
¨ããªãå ´åã¨èãã
ãã®ãã¨ã§è¡ãã¢ã¼ãã£ã¹ãã®æ¨è¦åº¦å°åºå¼ã«ã¯å«ããã¹ãã§ã¯ãªãã¨ãããã¨ã
ãã¢ã½ã³ç¸é¢ä¿æ°ã«ããé¡ä¼¼åº¦å°åº
ãã¼ã¿ã»ãããè¦ã¦ã¿ãã¨ãå
¨ä½çã«åçæ°ãå¤ã人ãå°ãªã人ãããããã§ãã
ãã®äººãã¡ãåããããªå好ã ã¨ãã¦ããåçæ°ã«ããã¦ã¼ã¯ãªããè·é¢ã調ã¹ã¦ã¿ãã¨ã
æ°å¼ã®æ§è³ªä¸ãã©ããã¦ãè·é¢ã大ãããªã£ã¦ãã¾ããé¡ä¼¼åº¦ãä½ããªã£ã¦ãã¾ãã
ããã§ãã¦ã¼ã¶éã®å好ã®ç¸é¢ãè¦ããããããã¨ã§åºã¦ããã®ããã¢ã½ã³ç¸é¢ä¿æ°ã
ã¦ã¼ã¶sã«ããã¢ã¼ãã£ã¹ãiã®åçæ°ãã
ã¦ã¼ã¶sã®åçæ°ã®å¹³åããã¨è¡¨ãã¨ãã
ã¦ã¼ã¶s, téã®é¡ä¼¼åº¦ã¯
ã§æ±ããããã
ç¸é¢ãªã®ã§ã-1ã1ã®å¤ãæ±ããããã
1ã¯ç¸é¢ãããã0ã¯ç¡ç¸é¢ã-1ã¯çéã®å好ï¼ã¤ã¾ãã¦ã¼ã¶sã好ããªã¢ã¼ãã£ã¹ããã¦ã¼ã¶tã¯å«ãå¾åã«ããï¼ã¨ãããã¨ãæå³ããããã ã
å®è£
æã«ã¯ãã¼ãé¤ç®ã¨ãªãå ´åã¯0ã¨è¿ãããã«ããªãã¨ãããªãã
ãã¨ããã®æ°å¼ã§ã¯ãå
±éããåçã¢ã¼ãã£ã¹ãã1人ã®å ´åã§ãç¸é¢ä¿æ°ã1ã¨ãªãã¨ããããã
ãªã®ã§ãå
±éã¢ã¼ãã£ã¹ããããä¸å®æ°ä»¥ä¸ã«æºããªãå ´åã¯è¨ç®ããªããªã©ã®å¦çãå¿
è¦ã ã¨æãã
ã¢ã¼ãã£ã¹ãã®æ¨è¦åº¦ã®å°åº
ã¦ã¼ã¶éã®é¡ä¼¼åº¦ãå°åºã§ããããä»åº¦ã¯ã¢ã¼ãã£ã¹ãã®æ¨è¦åº¦ãæ±ããã
ããã¯ãããããªèãæ¹ãæ¹æ³ãããã¨æãããä»åã¯ä»¥ä¸ã®æ°å¼ã使ã£ã¦æ±ããã
ããã§ã¯ããã¢ã¼ãã£ã¹ãiãåçããå
¨ã¦ã¼ã¶ã®éåã
ãã®å¼ã¯ããããããªäººã«åçããã¦ãããããªå ´åã
æ¨è¦åº¦ãé«ããªãå¾åãããç¨åº¦æãããã¨ãã§ããã
ãã¼ã¿ã»ãã
ä»åã¯ãHetRec2011ç¨ã«ç¨æããããã¼ã¿ã使ã£ã¦ã¿ãã
åç¨å©ç¨ã§ãªããã°ä½¿ã£ã¦ããã¨ããã©ã¤ã»ã³ã¹ã
HetRec2011 http://grouplens.org/datasets/hetrec-2011/
åºæ¬çã«ã¿ãåºåãã«ãªã£ã¦ããã®ã§ã
csvã¢ã¸ã¥ã¼ã«ãã¤ã³ãã¼ããã¦ãdelimiterãã¿ãã«å¤ãã¦ãããã°ãã¼ã¹ã§ããã
詳ãããã©ã¼ãããã«ã¤ãã¦ã¯readme.txtãè¦ãã¦ã¿ã¦ãã ããã
ãªããåçæ°ãã¼ã¿ä»¥å¤ã«ãããããã¯ãã£ã¦ã¾ããã
ã½ã¼ã¹ã³ã¼ã
ä¸ã®ãã¨ãè¸ã¾ãã¦ã³ã¼ãã£ã³ã°ãããé·ãã®ã§å°ã è¦è¾ãâ¦
# -*- coding: utf-8 -*- import csv import sys class User: """ ã¦ã¼ã¶IDã¨åçããã¢ã¼ãã£ã¹ãã®IDã®ãã£ã¯ã·ã§ããªãä¿æ usrId...<int>çæããã¦ã¼ã¶ã®ID artists...<dictionary>ã¦ã¼ã¶ãåçãããã¨ã®ããã¢ã¼ãã£ã¹ã """ def __init__(self, usrId, playedArtistsDic): """ ã³ã³ã¹ãã©ã¯ã¿ usrId...<int>çæããã¦ã¼ã¶ã®ID playedArtistsDic...<dictionary>ã¦ã¼ã¶ãåçãããã¨ã®ããã¢ã¼ãã£ã¹ã """ self.usrId = usrId self.artists = playedArtistsDic.copy() def getSimilar1(self, target, thld=0): """ ããã¦ã¼ã¶ã¨ã®é¡ä¼¼åº¦ãè¨ç®(ã¦ã¼ã¯ãªããè·é¢) target...<User>é¡ä¼¼åº¦ãè¨ç®ããã¦ã¼ã¶ã¤ã³ã¹ã¿ã³ã¹ thld...<int>ã¦ã¼ã¶å士ã§å ±éã¢ã¼ãã£ã¹ãæ°ã®é¾å¤ thldæªæºã®å ±éã¢ã¼ãã£ã¹ãæ°ã§ã¯é¡ä¼¼åº¦ã¯0ã¨èãã return...<float>é¡ä¼¼åº¦ """ distance = 0.0 #ã¦ã¼ã¯ãªããè·é¢ unionArtistN = 0 for myArtist in self.artists: for targetArtist in target.artists: if(myArtist==targetArtist): #ã¢ã¼ãã£ã¹ãIDãä¸è´ããã°è·é¢è¨ç®ã«å å³ unionArtistN += 1 myWeight = self.artists.get(myArtist) targetWeight = target.artists.get(targetArtist) distance += (myWeight - targetWeight)**2 print distance distance = 1 + distance**0.5 if(distance==1.0 or unionArtistN<thld): #ã¦ã¼ã¯ãªããè·é¢ã1ã®å ´åã¯é¡ä¼¼åº¦ããªãã®ã§ã0ãreturn #ä¸å®æ°å ±éã¢ã¼ãã£ã¹ããããªããã°é¡ä¼¼åº¦ã¯0 return 0.0 return 1 / distance def getSimilar2(self, target, thld=0): """ ãã¢ã½ã³ç¸é¢ä¿æ°ã«ããã¦ã¼ã¶éé¡ä¼¼åº¦è¨ç® target...<User>é¡ä¼¼åº¦ãè¨ç®ããã¦ã¼ã¶ã¤ã³ã¹ã¿ã³ã¹ thld...<int>ã¦ã¼ã¶å士ã§å ±éã¢ã¼ãã£ã¹ãæ°ã®é¾å¤ thldæªæºã®å ±éã¢ã¼ãã£ã¹ãæ°ã§ã¯é¡ä¼¼åº¦ã¯0ã¨èãã """ #ããããã®ã¦ã¼ã¶ã®åçæ°å¹³åãå°åº myMean = 0.0 targetMean = 0.0 for i in self.artists.values(): myMean += i for i in target.artists.values(): targetMean += i myMean = myMean / float(len(self.artists)) targetMean = targetMean / float(len(target.artists)) #ãã¢ã½ã³ç¸é¢ä¿æ°ãå°åº coVar = 0.0 mySd = 0.0 targetSd = 0.0 unionArtistN = 0 for myArtist in self.artists: for targetArtist in target.artists: if(myArtist==targetArtist): unionArtistN += 1 myWeight = float(self.artists.get(myArtist)) targetWeight = float(target.artists.get(targetArtist)) mySd+= (myWeight - myMean)**2 targetSd += (targetWeight - targetMean)**2 coVar += (myWeight - myMean) * (targetWeight - targetMean) mySd = mySd**0.5 targetSd = targetSd**0.5 if(mySd*targetSd==0.0 or unionArtistN<thld): #ã¼ãé¤ç®ãé¿ãã/ä¸å®æ°å ±éã¢ã¼ãã£ã¹ããããªããã°é¡ä¼¼åº¦ã¯0 return 0.0 return coVar / (mySd * targetSd) def getSimilarUsrs(self, usrsDic, thld=0, pearson=True): """ åã¦ã¼ã¶ã®é¡ä¼¼åº¦ãè¨ç®ããã¿ãã«ãªã¹ãï¼ã½ã¼ãæ¸ã¿ï¼ãè¿ã usrsDic...<dictionary>ã¦ã¼ã¶ãã¼ã¿ãã£ã¯ã·ã§ã㪠thld...<int>ã¦ã¼ã¶å士ã®å ±éã¢ã¼ãã£ã¹ãæ°ã®é¾å¤ thldæªæºã®å ±éã¢ã¼ãã£ã¹ãæ°ã§ã¯é¡ä¼¼åº¦ã¯0ã¨èãã mode...<bool>pearsonç¸é¢ä¿æ°ã«ããé¡ä¼¼åº¦é¢æ°ã使ãã return...<taple list>é¡ä¼¼é ã«ã½ã¼ããããé¡ä¼¼ã¦ã¼ã¶ãªã¹ã """ simDic = {} for targetId in usrsDic: if(targetId!=self.usrId): #èªåèªèº«ã¨ã®é¡ä¼¼åº¦ã¯è¨ç®ããªã #ã¿ã¼ã²ããã®ã¦ã¼ã¶ã¤ã³ã¹ã¿ã³ã¹ãçæ target = User(targetId, usrsDic.get(targetId)) if(pearson): sim = self.getSimilar2(target, thld) #ã¿ã¼ã²ããã¨ã®é¡ä¼¼åº¦ else: sim = self.getSimilar1(target, thld) if(sim > 0.0): #é¡ä¼¼åº¦ãããã°ãã£ã¯ã·ã§ããªã«è¿½å simDic[target.usrId] = sim if(len(simDic)==0): #é¡ä¼¼ããã¦ã¼ã¶ãå ¨ãè¦ã¤ãããªãã£ãå ´å print "Could not find your similar user." quit() return sorted(simDic.items(), key=lambda d:d[1], reverse=True) def getRecommendArtists(self, simUsrs, usrsDic): """ é¡ä¼¼ã¦ã¼ã¶ã®åçã¢ã¼ãã£ã¹ãæ å ±ããåã¢ã¼ãã£ã¹ãã®æ¨è¦åº¦ãè¿ã simUsrs...<taple list>é¡ä¼¼ã¦ã¼ã¶ usrsDic...<dictionary>ã¦ã¼ã¶ãã¼ã¿ãã£ã¯ã·ã§ã㪠return...<taple list>æ¨è¦åº¦é ã«ã½ã¼ããããæ¨è¦ã¢ã¼ãã£ã¹ããªã¹ã """ recomArtists = {} totalSim = {} #ã¢ã¼ãã£ã¹ããã¨ã«ã¦ã¼ã¶ã®é¡ä¼¼åº¦ã®åè¨ãæ㤠for usr in simUsrs: simUsr = User(usr[0], usrsDic.get(usr[0])) for artist in simUsr.artists: if(artist not in self.artists): #èªåãåçãã¦ããã¢ã¼ãã£ã¹ãã¯æ¨è¦ããªã if(artist not in recomArtists): #recomArtistsã«artistãããªããã°è¿½å ãã recomArtists[artist] = 0.0 totalSim[artist] = 1.0 simUsrMean = sum([i for i in simUsr.artists.values()]) / len(simUsr.artists) recomPoint = usr[1] * (simUsr.artists.get(artist) - simUsrMean) recomPoint += recomArtists.get(artist) recomArtists[artist] = recomPoint #åæ§ã«åçãã¦ããã¦ã¼ã¶ã®é¡ä¼¼åº¦ã®åè¨ãæ±ãã totalSim[artist] = totalSim.get(artist) + abs(usr[1]) for artist in recomArtists: #åã¢ã¼ãã£ã¹ãã®æ¨è¦åº¦ãè¨ç®ãã recomArtists[artist] = recomArtists.get(artist) / totalSim.get(artist) return sorted(recomArtists.items(), key=lambda d:d[1], reverse=True) def readUsersData(path): """ TSVåã®ã¦ã¼ã¶ãã¼ã¿ãã¡ã¤ã«ãèªã¿è¾¼ã¿ãå ¨ã¦ã¼ã¶ãã¼ã¿ããã£ã¯ã·ã§ããªã§è¿ã path...<string>ãã¼ã¿ãã¹ return...<dictionary>ã¦ã¼ã¶ãã¼ã¿ãã£ã¯ã·ã§ã㪠""" tsv = csv.reader(file(path, 'r'), delimiter = '\t') firstRow = True secondRow = False dic = {} usrsDic = {} usrId = 0 for row in tsv: if(firstRow): #ä¸è¡ç®ã¯èªã¿é£ã°ã firstRow = False secondRow = True else: if(secondRow): usrId = int(row[0]) secondRow = False nowUsrId = int(row[0]) if(nowUsrId!=usrId): #ç¾å¨ãã§ãã¯ãã¦ããIDã¨åã¾ã§ã®IDãä¸è´ãã¦ããã #ä¸è´ããªããã°ã¦ã¼ã¶ãå¤ãã£ã¦ããã®ã§ãããã§usrsDicã«è¿½å usrsDic[usrId] = dic.copy() dic = {} dic[int(row[1])] = int(row[2]) usrId = nowUsrId #æå¾ã®ã¦ã¼ã¶ã®æ¸ã込㿠usrsDic[usrId] = dic.copy() return usrsDic.copy() def readArtistsData(path): """ TSVåã®ã¢ã¼ãã£ã¹ããã¼ã¿ãã¡ã¤ã«ãèªã¿è¾¼ã¿ãå ¨ã¢ã¼ãã£ã¹ããã¼ã¿ããã£ã¯ã·ã§ããªã§è¿ã ãã£ã¯ã·ã§ããªã®keyã¯ã¢ã¼ãã£ã¹ãã®IDãvalueã¯ã¢ã¼ãã£ã¹ãå path...<string>ãã¼ã¿ãã¹ return...<dictionary>ã¢ã¼ãã£ã¹ããã¼ã¿ãã£ã¯ã·ã§ã㪠""" tsv = csv.reader(file(path, 'r'), delimiter = '\t') firstRow = True artistsDic = {} for row in tsv: if(firstRow): #ä¸è¡ç®ã¯èªã¿é£ã°ã firstRow = False else: artistsDic[int(row[0])] = row[1] return artistsDic def getArg(): """ ã³ãã³ãã©ã¤ã³å¼æ°(ã¦ã¼ã¶ID)ãåå¾ return...<int>ã¦ã¼ã¶ID """ argv = sys.argv argc = len(argv) if (argc != 2): #å¼æ°ããªãå ´åã¯çµäº print 'Usage: python %s userId' %argv[0] quit() return int(argv[1]) def main(usrId): #ã¦ã¼ã¶ãã¼ã¿ã®åå¾ usrsDic = readUsersData("hetrec2011-lastfm-2k/user_artists.dat") #ã¢ã¼ãã£ã¹ãåãã£ã¯ã·ã§ããªã®åå¾ artistsName = readArtistsData("hetrec2011-lastfm-2k/artists.dat") #ã¬ã³ã¡ã³ãããã¦ã¼ã¶ã¤ã³ã¹ã¿ã³ã¹ãçæ if(usrId not in usrsDic): #åå¨ããªãã¦ã¼ã¶IDãæå®ããã¦ããã¨ãã¯çµäº print 'usrId: %d does NOT exist.' %usrId quit() usr = User(usrId, usrsDic.get(usrId)) #é¡ä¼¼ã¦ã¼ã¶ã®åå¾ simUsrs = usr.getSimilarUsrs(usrsDic, 5) #ã¬ã³ã¡ã³ãã¢ã¼ãã£ã¹ãã®åå¾ recommendArtists = usr.getRecommendArtists(simUsrs, usrsDic) #ã¦ã¼ã¶ãåçãããã¨ã®ããã¢ã¼ãã£ã¹ãã表示 print "ï¼ããªããåçãããã¨ã®ããã¢ã¼ãã£ã¹ã:åçæ°ï¼" #weightãé«ãé ã«ã½ã¼ã artists = sorted(usr.artists.items(), key=lambda d:d[1], reverse=True) for artist in artists: print "%s : %d" %(artistsName.get(artist[0]), artist[1]) #æ¨è¦åº¦ä¸ä½10ã®ã¢ã¼ãã£ã¹ããã¬ã³ã¡ã³ããã depth = 10 print "ï¼ããªãã«ãªã¹ã¹ã¡ã®ã¢ã¼ãã£ã¹ã:æ¨è¦åº¦ï¼" for i in range(depth): artistId = recommendArtists[i][0] print "%s : %d" %(artistsName.get(artistId), recommendArtists[i][1]) #ä¸çªä¼¼ã¦ããã¦ã¼ã¶ãåçãã¦ããã¢ã¼ãã£ã¹ãã表示 # simUsr = User(simUsrs[0][0], usrsDic.get(simUsrs[0][0])) # print "ï¼ããªãã«ä¸çªä¼¼ã¦ããã¦ã¼ã¶%d(%f)ã®ãã¬ã¤ãªã¹ãï¼" %(simUsr.usrId, simUsrs[0][1]) # artists = sorted(simUsr.artists.items(), key=lambda d:d[1], reverse=True) # for artist in artists: # print "%s : %d" %(artistsName.get(artist[0]), artist[1]) if __name__ == '__main__': usrId = getArg() main(usrId)
readUsersDataé¢æ°ã§è¿ããããã£ã¯ã·ã§ããªã¯ã
valueãã¾ããã£ã¯ã·ã§ããªã ã£ãããã®ã§ãå°ããããããã§ãã
ãã¨ããã£ã¯ã·ã§ããªã«é åºã¨ããæ¦å¿µããªãã®ã§ã
é¡ä¼¼åº¦ãæ¨è¦åº¦ãé«ãé ã«ãã¼ã¿ãå¾ãããããã«ã
sortedé¢æ°ä½¿ã£ã¦ã¿ãã«ãªã¹ãã§è¿ãã¦ããã¨ããããã¾ãã
éæ
ãã¯ãé¡ä¼¼åº¦ææ¨ãæ±ããéã«ãå
±éããåçã¢ã¼ãã£ã¹ãæ°ã§ãã£ã«ã¿ããªãã¨ãã©ããã¦ãã1,2ã¢ã¼ãã£ã¹ããã被ã£ã¦ãããããã¤ããã¾ãé¢ä¿ãªããããªã¢ã¼ãã£ã¹ãã®ã¬ã³ã¡ã³ãã®å¾åãä½ããã¨ãèµ·ããã
å
±éããåçã¢ã¼ãã£ã¹ãæ°ãã©ã®ç¨åº¦ã«ããã°ãããã¯é£ããã¨ããâ¦ã
ãã¨ãããã¯ãã®ãã¼ã¿ã»ããã®ç¹å¾´ãããããªããã
å
¨ä½çã«æ¥æ¬ã®ã¢ã¼ãã£ã¹ããè´ãã¦ã¼ã¶ãå°ãªããã©ããã¦ãæ¥æ¬äººã¢ã¼ãã£ã¹ãã¸ã®è©ä¾¡æ°ãå°ãªãã¨ããç¹ã¯æ°ã«ãªã£ãã
ã¤ã¾ããè©ä¾¡æ°ï¼è´ãã¦ãã人ï¼ãå°ãªãã¨ããã®ã¢ã¼ãã£ã¹ããå
±éãã¦è´ã人ãå°ãªãããããã®ã¢ã¼ãã£ã¹ããåçãã¦ããã¨ãããã¼ã¿ãæ´»ãããã¬ã³ã¡ã³ããæ示ã§ããªãã¨ãããã¨ã
ä¾ãã°ãã¢ãã½ã³ãããæãæ¥æ¬äººã¢ã¼ãã£ã¹ããããè´ãã¦ã¼ã¶ãã¼ã¿ãä½ã£ã¦ã¬ã³ã¡ã³ãããã¦ã¿ã¦ããä»ã®è´ãã¦ããªãã¢ãã½ã³ç³»ã¢ã¼ãã£ã¹ãããªããªãã¬ã³ã¡ã³ããããªãã£ããããã
ãã¨ã¯ãå
¨ä½ã¨ãã¦è´ãã¸ã£ã³ã«ã¯åã£ã¦ãããã ãã©ããåã¸ã£ã³ã«ã®æåã¢ã¼ãã£ã¹ããããåçãã¦ãããããªã¦ã¼ã¶ã®å ´åããªããªãä¸æãã¬ã³ã¡ã³ããåãã¦ããªãããã«è¦ããã確ãã«ãå
±éã¢ã¼ãã£ã¹ãæ°ã®é¾å¤ãä¸ããã°è¯ããªããã ãã©ããããªãï¼7人以ä¸ï¼ä¸ããªãã¨è¯ããããªçµæãå¾ãããªãã£ãã
ããã¯ãç°è²ã®ç¾ãªãã¦ããå¼ã°ãæ¹ãããåé¡ã§ãè¤æ°ã®ã¦ã¼ã¶ã¿ã¤ãã«å±ãã¦ãã¾ãã¦ã¼ã¶ã«å¯¾ãã¦ã¯ãæé©ãªã¬ã³ã¡ã³ããã§ããªãã¨ãããï¼ã³ã³ãã³ããã¼ã¹ãã£ã«ã¿ãªã³ã°ã«ãã解決çã¯ç¤ºããã¦ããï¼
ãã£ã¨æãããã¨ãã¾ã¨ããã¨ãæ§ã
ãªã¿ã¤ãã«å¯¾å¿ãããªããé常ã«å¤ãã®ãã¼ã¿ãå¿
è¦ã«ãªããã ãªã£ã¦ãããã¨ã
ä»åã¯ç´2K人ã§ããããå
¨ç¶è¶³ããªãã£ãããããã°ãã¼ã¿ã»ããã
ï¼ããããä»åã®ããã°ã©ã ã¯å®è£
ä¸ãè¨ç®éçã«ãè¨å¤§ãªãã¼ã¿ã«ã¯å¯¾å¿ã§ããªãâ¦ï¼
ãã ãã¢ã«ã´ãªãºã èªä½ã¯ç°¡åã§ããã«ã³ã¼ãã«èµ·ãããã®ã§ãã¨ã¦ãããããããã®ã ã¨æã£ãã
ï¼Î±
ã¬ã³ã¡ã³ãã¨ã³ã¸ã³ãªãã¦ããã¨ãGunosyãªãããããããã¢ã«ã´ãªãºã ãªãã ãããâ¦
ã«ãã¦ãAmazonã®ã¢ã¤ãã ã¬ã³ã¡ã³ãã¨ããTwitterã§ã®ã¦ã¼ã¶ã¬ã³ã¡ã³ãã¨ãã
webã®ãããããªã¨ããã§ã¬ã³ã¡ã³ãã·ã¹ãã ã¯åãã¦ãããªã®ã§ãå°ãåå¼·ã§ãã¦ããã£ãã
ä»ååãä¸ãããã®ã¯ãããããå調ãã£ã«ã¿ãªã³ã°ã®ä¸ã§ãããªãåç´ãªãã®ã£ã½ãã
ãã¤ã¸ã¢ã³ãããã¯ã¼ã¯ã使ã£ããã®ãã¯ã©ã¹ã¿ãªã³ã°ææ³ãå©ç¨ãããã®ãããã¿ããã
ããããã°ããã£ã«ã¿ã¼ããã«åé¡ã£ã¦ããè¨èããã£ããã¼ã
ãã®ãããã®ç 究ã¯ã¾ã ã¾ã é²ãã§ããæããªãã§ããããã
ã¾ãæ©ä¼ãããã°ããå°ãåå¼·ãã¦ã¿ããã
éåç¥ããã°ã©ãã³ã°
- ä½è : Toby Segaran,ç¶å±±ä»å¥,鴨澤ç夫
- åºç社/ã¡ã¼ã«ã¼: ãªã©ã¤ãªã¼ã¸ã£ãã³
- çºå£²æ¥: 2008/07/25
- ã¡ãã£ã¢: 大åæ¬
- è³¼å ¥: 91人 ã¯ãªãã¯: 2,220å
- ãã®ååãå«ãããã° (277件) ãè¦ã