A New Feed Using Upvotes From The People You Follow. Improving Content Discovery!

in #curation7 years ago

Finding personally targeted content is one of the biggest problems on steemit right now in my opinion. Anyone familiar with other social networks/content sites have probably noticed this. I have been trying to think of a good solution to this since I first started using steemit. I think I finally have a good enough start that I can share it with you guys.

The Idea

What if your default feed was put in order by the posts that were upvoted the most out of the people that you follow, weighted by which of them have voted on the same posts as you in the past.

For example:

Let's say that I am following 3 accounts; John, Jane, and Bob. Each one of them have voted on different things that you also have voted on in the past. In the last month the post that you both voted on are as follows:

John: 12 (he voted on 12 posts that you also voted on)

Jane: 2

Bob : 0

Let's call these numbers our "similarity score". Now we can use this information to give us our new feed list. Suppose we have 5 articles on steemit that you have not come across, I will list below who voted on each of them

Article 1: Bob

Article 2: Jane

Article 3: Jane, John

Article 4: John

Article 5: Jane, Bob

Each article would get a score as follows: Article score = sum(following*similarity score)

So now the scores would look like this

Article 1: 0 (Bob liked it but his score is zero; 1 * 0 = 0)

Article 2: 2 (Jane upvoted, her score is 2; 1 * 2 = 2)

Article 3: 14 (Jane and John upvoted, their scores are 2 and 12 respectively; 1 * 2 + 1 * 12 =14)

Article 4: 12 (John upvoted, his score is 12; 1 * 12 = 12

Article 5: 2 (Jane and Bob upvoted with scores of 2 and 0 respectively; 1 * 0 + 1 * 2 = 2)

So now we would order our feed like this

Article 3

Article 4

Article 5

Article 2

Article 1

Are you still with me?

Next we scroll through our feed and we upvote articles 2, 5, 1 because we now upvoted on things that the people we are following voted on their scores now change.

John: 12 (John stays the same because none of our votes matched

Jane: 4 (Jane's score goes up by 2 because we matched 2 of her upvotes)

Bob: 2 (Bob also goes up by 2 because we matched 2 upvotes)

Outcome

This starts to narrow down the people that are upvoting the most similar things to you and creates a positive feedback loop where the people that are more likely to like the same things as you are going to have a greater influence on the things in your feed. This also gives you a benefit of being exposed to things that you will probably like that aren't on the main pages or in your follower feed.

I have tested this a little bit and it already gives me a much better feed than any of the default ones we have and I've already discovered a few more interesting people to follow that had very undervalued posts!

Another benefit is that it allows people to curate simply by upvoting instead of having to resteem anything they want to share. All their upvotes will influence their follower's feeds in a less obtrusive way. Personally I upvote WAY more things than I resteem because I don't want my followers to always just see resteemed articles.

Implimentation

This is all great, but how could we actually make this happen? Well I propose that we make a new front-end (or maybe an add on to one of the current front ends). I have been trying to figure out how to do it. I've been teaching myself javascript and html but the progress is slow and so far all I've been able to do is to get my upvoted posts from the last 7 days (thanks to @revo for some pointers, ok he basically did all the work for me ;) ) So if anyone wants to help I would appreciate it!

I am really good with google sheets though so I was able to make a proof-of-concept on google sheets but it, of course, has severe limitations. It is very, very slow. I have to manually recalculate everything when I want to refresh my feed which is, again, very slow. It also can't get some people I'm following who have been on for a while because there is just too much data. But I thought I would share it with you so you can see how I envision it to work.

Proof of Concept

https://docs.google.com/spreadsheets/d/1B5EeXPzwVj645ajkMHhcOrymPz33YB5B-p2GVjsW5WA/edit?usp=sharing

You can view the document here and you can make a copy of it to try out for yourself if you want. I just put a ' in front of most of the formulas so that they won't run until you delete the '

To make a copy, go to file -> make a copy

Screenshot 2018-01-01 at 9.37.00 AM.png

Alright, so first thing we do is we grab all of our followers using the "importJSON" formula:

=ImportJSON("https://api.steemjs.com/get_following?follower=littlejoeward&startFollowing=a&followType=blog&limit=100"
)

Note: the api will only give you up to 100 followers so to get the rest of your followers you have to do several of these requests.

Screenshot 2018-01-01 at 9.41.11 AM.png

Next we look at each one of their upvotes =array_constrain(sort(query(importjson("https://api.steemjs.com/get_account_votes?voter=Voter Name Here"),"select Col1, Col5"),2,0),100,1)

I constrained it to only bring in the last 100 votes otherwise the spreadsheet would never load. I also sorted it from newest to oldest. Ideally this would just pull in any votes made on posts that are less than 7 days old.

Screenshot 2018-01-01 at 9.46.01 AM.png

Now we count how many times anyone upvoted the same thing as us. This gives us our similarity score.

=max(B1-1, sum(ArrayFormula(iferror(if(match($A5:$A102,B5:B102,0),1,)))))

Screenshot 2018-01-01 at 9.48.23 AM.png

Next, we look at each post and give them score based on how many of the people we are following upvoted it, multiplied by the similarity score of each voter.

=UNIQUE({Sheet3!B5:B102;Sheet3!C5:C102;Sheet3!D5:D102;Sheet3!E5:E102;Sheet3!F5:F102;Sheet3!G5:G102;Sheet3!H5:H102;Sheet3!I5:I102;Sheet3!J5:J102;Sheet3!K5:K102;Sheet3!L5:L102;Sheet3!M5:M102;Sheet3!N5:N102;Sheet3!O5:O102;Sheet3!P5:P102;Sheet3!Q5:Q102;Sheet3!R5:R102;Sheet3!S5:S102;Sheet3!T5:T102;Sheet3!U5:U102;Sheet3!V5:V102;Sheet3!W5:W102;Sheet3!X5:X102;Sheet3!Y5:Y102;Sheet3!Z5:Z102;Sheet3!AA5:AA102;Sheet3!AB5:AB102;Sheet3!AC5:AC102;Sheet3!AD5:AD102;Sheet3!AE5:AE102;Sheet3!AF5:AF102;Sheet3!AG5:AG102;Sheet3!AH5:AH102;Sheet3!AI5:AI102;Sheet3!AJ5:AJ102;Sheet3!AK5:AK102;Sheet3!AL5:AL102;Sheet3!AM5:AM102;Sheet3!AN5:AN102;Sheet3!AO5:AO102;Sheet3!AP5:AP102;Sheet3!AQ5:AQ102;Sheet3!AR5:AR102;Sheet3!AS5:AS102;Sheet3!AT5:AT102;Sheet3!AU5:AU102;Sheet3!AV5:AV102;Sheet3!AW5:AW102;Sheet3!AX5:AX102;Sheet3!AY5:AY102;Sheet3!AZ5:AZ102;Sheet3!BA5:BA102;Sheet3!BB5:BB102;Sheet3!BC5:BC102;Sheet3!BD5:BD102;Sheet3!BE5:BE102;Sheet3!BF5:BF102;Sheet3!BG5:BG102;Sheet3!BH5:BH102;Sheet3!BI5:BI102;Sheet3!BJ5:BJ102;Sheet3!BK5:BK102;Sheet3!BL5:BL102;Sheet3!BM5:BM102;Sheet3!BN5:BN102;Sheet3!BO5:BO102;Sheet3!BP5:BP102;Sheet3!BQ5:BQ102;Sheet3!BR5:BR102;Sheet3!BS5:BS102;Sheet3!BT5:BT102;Sheet3!BU5:BU102;Sheet3!BV5:BV102;Sheet3!BW5:BW102;Sheet3!BX5:BX102;Sheet3!BY5:BY102;Sheet3!BZ5:BZ102;Sheet3!CA5:CA102;Sheet3!CB5:CB102;Sheet3!CC5:CC102;Sheet3!CD5:CD102;Sheet3!CE5:CE102;Sheet3!CF5:CF102;Sheet3!CG5:CG102;Sheet3!CH5:CH102;Sheet3!CI5:CI102;Sheet3!CJ5:CJ102;Sheet3!CK5:CK102;Sheet3!CL5:CL102;Sheet3!CM5:CM102;Sheet3!CN5:CN102;Sheet3!CO5:CO102;Sheet3!CP5:CP102;Sheet3!CQ5:CQ102;Sheet3!CR5:CR102;Sheet3!CS5:CS102;Sheet3!CT5:CT102;Sheet3!CU5:CU102;Sheet3!CV5:CV102;Sheet3!CW5:CW102;Sheet3!CX5:CX102;Sheet3!CY5:CY102;Sheet3!CZ5:CZ102;Sheet3!DA5:DA102;Sheet3!DB5:DB102;Sheet3!DC5:DC102;Sheet3!DD5:DD102;Sheet3!DE5:DE102;Sheet3!DF5:DF102;Sheet3!DG5:DG102})

This formula grabs all of the voted on posts.

Note: if anyone has a better way to do this formula please let me know!

=iferror(if(A1="",0,SUM(arrayformula(IF(A1=Sheet3!$B$5:$53,Sheet3!$B$2:$2,)))(1-COUNTIF(Sheet3!A:A,A1)))if(G$1="Followers",1, if(COUNTIF(Sheet1!B:B,F1)>0,0,1))*if(G$2="Replies",1,if(left(index(SPLIT(A1,"/"),2),2)="re",0,1)),0)

This formula gives us our article scores

Note: I also added a couple filters so that you set it to not show comments, only posts. Also you can hide any posts that are from people you are following.

Screenshot 2018-01-01 at 9.56.00 AM.png

Then, we simply put them in order from highest score to lowest score

=ArrayFormula(sort(A:A,H:H,0))

Screenshot 2018-01-01 at 9.57.28 AM.png

That gives us our new feed! I made another page that makes it a little easier to read and scroll through.

Screenshot 2018-01-01 at 9.37.00 AM.png

I also added an option where you can mark your posts as "seen" so that after you look at the posts, they won't show up on your feed again.

Hopefully that gives you a little idea of how this works. If you have any other suggestions/questions for me let me know in the comments or on steemit.chat. If you are interested in helping me with this project,

Conclusion

Like I said before, this has actually been a really fun way to discover new posts/people on steemit, I just wish it was a bit easier. I also think this would be really helpful for people to be discovered when they don't have as big of a following. It would also help everyone to find content that is more interesting to them.

I think this idea could be extended to also include things like looking at your favorite tags to calculate the article score, taking into account comments and resteems etc.

If you like this idea be sure to comment, resteem and upvote!

Thanks!

Sort:  

That's a good Idea, LJW. A bit like how we see certain things our friends like on facebook (actually, having said that, I don't recall seeing this lately on facebook; maybe they got rid of it). When I wake up some more I might have a think on how this could be done with the api and javascript. I'll let you know if I have any ideas.

Thanks! Yeah, it works that way on google plus as well. I think it really is a no-brainer. I look forward to seeing what you come up with!

Good thinking! Yes, you're addressing an important opportunity here. A related issue is this: mentions. At the moment, I don't even know how to track my mentions (whenever someone else mentions my Steemit account, i.e. @cabelindsay). By comparison, Facebook alerts me in the instant when I am mentioned, which gives me the advantage of replying right away, and returning the hugs and high-fives, for example.

Yeah, it is definitely a missed feature! I check https://mentions.steemdata.com every once in a while to see if anyone has mentioned me.

Brilliant work! Have you thought about submitting a #budget proposal to build a new access web-site that uses this logic instead of current Trending/Hot (or in addition to?)

I'm sure it would take massive traffic away from Steemit, forcing them to eventually adopt your approach to remain relevant.

I'm ready for some testers if you or anyone you know would be interested!
https://steemit.com/steeemdev/@littlejoeward/my-personalized-steem-feed-proof-of-concept-is-ready-for-testers

I don't know how to do that but I will have to look into it!

It really makes sense. After less than 2 months here I have a very predictive pattern of the things I like (upvote...). This article was the outgroup, but yes, there should be some kind of feed.

This gem of a post was discovered by the OCD Team!
Reply to this comment if you accept, and are willing to let us share your gem of a post! By accepting this, you have a chance to receive extra rewards and one of your photos in this article may be used in our compilation post!
You can follow @ocd – learn more about the project and see other Gems! We strive for transparency.
Let me know if you have any questions regarding the project or nomination. Hope to hear from you soon!

just noticed it was passed payout.. hrmm.. excellent work tho.. i think its a great idea... maybe you can talk to banfield about securing some funds to make a website for content discovery of steem...

I'm not sure who that is... That would be awesome! I just need someone who can do the coding... or at least help me a bit. I have taught myself a little but it will still be a while before I can tackle this on my own.

I'm sure you will see him in the trending... he runs this budgets to promote steem and the idea is that if you have a good proposal, something that can be used to improve steem you would get upvotes (big ones) towards doing so.

Look at trending.. you will see him

k, thanks! I haven't been on trending for a while!