Skip to content

Instantly share code, notes, and snippets.

View ryanbbrown's full-sized avatar

Ryan Brown ryanbbrown

View GitHub Profile
@ryanbbrown
ryanbbrown / README.md
Last active April 25, 2026 02:42
Charmstone-style app launcher for Hammerspoon (arrow-key combos)

hammerspoon-charmstone

A Charmstone-style app launcher built on Hammerspoon. Hold a modifier, tap one or two arrow keys, release to launch. Eight directions total (4 cardinals + 4 diagonals).

Install

  1. Install Hammerspoon: brew install --cask hammerspoon
  2. Copy hammerspoon-charmstone.lua to ~/.hammerspoon/init.lua
  3. Launch Hammerspoon and grant accessibility permissions
  4. Reload config (cmd+alt+r, or from the Hammerspoon menu)
@ryanbbrown
ryanbbrown / book_recommender.py
Created August 8, 2020 18:41
Hyperparameter Tuning
classifier = KNeighborsClassifier()
pipe = Pipeline([('cleaner', clean_transformer()),
('vectorizer', tfidf_vector),
('classifier', classifier)])
params = {'classifier__n_neighbors':[1,3,5,7,9,11],
'classifier__weights':['uniform','distance'],
'classifier__leaf_size':[10,30,50,100,200],
'classifier__p':[1,2]}
from sklearn.model_selection import GroupKFold, cross_val_score
from sklearn.linear_model import LogisticRegression, RidgeClassifier, SGDClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.svm import SVC
models = [LogisticRegression(solver='liblinear', max_iter=300),
SVC(C=1.0, kernel='linear', degree=3, gamma='auto'), MultinomialNB(),
KNeighborsClassifier(), RidgeClassifier(),
SGDClassifier(loss='hinge', penalty='l2', alpha=1e-3)]
from sklearn.preprocessing import LabelBinarizer
lb = LabelBinarizer()
X, y = df.text, df.label
y = lb.fit_transform(y).reshape(len(y),)
titles = df.title.tolist()
@ryanbbrown
ryanbbrown / book_recommender.py
Last active July 24, 2020 19:07
Custom Transformer
def clean_text(text):
return text.strip().lower()
class clean_transformer(TransformerMixin):
def transform(self, X, **transform_params):
return [clean_text(text) for text in X]
def fit(self, X, y=None, **fit_params):
return self
@ryanbbrown
ryanbbrown / book_recommender.py
Last active July 24, 2020 19:07
Vectorizers
bow_vector = CountVectorizer(tokenizer = spacy_tokenizer, ngram_range=(1,1))
tfidf_vector = TfidfVectorizer(tokenizer = spacy_tokenizer)
@ryanbbrown
ryanbbrown / book_recommender.py
Created July 24, 2020 19:01
spaCy Tokenizer
def spacy_tokenizer(sentence):
mytokens = parser(sentence)
mytokens = [ word.lemma_.lower().strip() if word.lemma_ != "-PRON-" else word.lower_ for word in mytokens ]
mytokens = [ word for word in mytokens if word not in stop_words and word not in punctuations ]
return mytokens
@ryanbbrown
ryanbbrown / book_recommender.py
Created July 24, 2020 19:00
Preprocessing Imports
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.base import TransformerMixin
from sklearn.pipeline import Pipeline
import spacy
from spacy.lang.en import English
parser = English()
from spacy.lang.en.stop_words import STOP_WORDS
stop_words = spacy.lang.en.stop_words.STOP_WORDS
import string
@ryanbbrown
ryanbbrown / book_recommender.py
Created July 24, 2020 18:58
Book Text Splitter
df1, df2, df3, df4, df5 = df.copy(), df.copy(), df.copy(), df.copy(), df.copy()
dflist = [df1, df2, df3, df4, df5]
ranges = [0,20000,40000,60000,80000,100000]
for df, i in zip(dflist, range(1,7)):
df['text'] = df['text'].apply(lambda x: x[ranges[i-1]:ranges[i]])
df = df1.append([df2, df3, df4, df5])
df.insert(4, 'section_number', [1]*40+[2]*40+[3]*40+[4]*40+[5]*40)
@ryanbbrown
ryanbbrown / book_recommender.py
Created July 24, 2020 18:57
Book Text Reader
import os
import codecs
files = sorted([i for i in os.listdir('book_text/')])
booklist = []
for file in files:
with codecs.open('book_text/'+file, 'r', encoding='utf8',) as book:
booklist.append(book.read()[0:100000])