<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>RealThinks</title>
	<atom:link href="http://realerthinks.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://realerthinks.com/</link>
	<description>Once you are Real you can&#039;t be ugly, except to people who don&#039;t understand. - The Velveteen Rabbit</description>
	<lastBuildDate>Sat, 09 Oct 2021 19:19:20 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>http://realerthinks.com/wordpress/wp-content/uploads/2016/12/cropped-RT-32x32.png</url>
	<title>RealThinks</title>
	<link>https://realerthinks.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Using Keras for Deep Learning</title>
		<link>http://realerthinks.com/using-keras-for-deep-learning/</link>
					<comments>http://realerthinks.com/using-keras-for-deep-learning/#respond</comments>
		
		<dc:creator><![CDATA[Addie]]></dc:creator>
		<pubDate>Mon, 28 May 2018 16:05:07 +0000</pubDate>
				<category><![CDATA[Data Analysis]]></category>
		<category><![CDATA[keras]]></category>
		<category><![CDATA[machine learning]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tensorflow]]></category>
		<guid isPermaLink="false">http://realerthinks.com/?p=1208</guid>

					<description><![CDATA[<p>Hi friends! I recently was introduced to Keras as a front-end for Tensorflow, and I gotta say&#8230; I&#8217;m really impressed. I thought I&#8217;d do a really quick tutorial just to show its versatility.  It&#8217;s been done before, and will be done again, but let&#8217;s make a predictor for the MNIST digit dataset. I&#8217;ll be using [&#8230;]</p>
<p>The post <a href="http://realerthinks.com/using-keras-for-deep-learning/">Using Keras for Deep Learning</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hi friends! I recently was introduced to <a href="https://keras.io/">Keras</a> as a front-end for <a href="https://www.tensorflow.org/">Tensorflow</a>, and I gotta say&#8230; I&#8217;m really impressed. I thought I&#8217;d do a really quick tutorial just to show its versatility.  It&#8217;s been done before, and will be done again, but let&#8217;s make a predictor for the <a href="https://en.wikipedia.org/wiki/MNIST_database">MNIST digit dataset</a>.</p>
<p>I&#8217;ll be using a <a href="http://cs231n.github.io/convolutional-networks/">2D convolution layer</a><span title='This page is really in-depth. Search for the section on &#8220;Convolution Demo&#8221; to see an animation that sums everything up nicely.' class='inline-footnote' style=''>1<span class='footnoteContent' style='display:none;'>This page is really in-depth. Search for the section on &#8220;Convolution Demo&#8221; to see an animation that sums everything up nicely.</span></span> and one <a href="http://realerthinks.com/neural-networks-tensorflow/">hidden layer</a> to create a model. Ready? Let&#8217;s dive in!</p>
<p>(P.S. This tutorial assumes you know <a href="http://realerthinks.com/neural-networks-tensorflow/">the basics about deep learning</a>)</p>
<h3>Imports and loading data</h3>
<p></p><pre class="crayon-plain-tag">from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Conv2D, Dense, Flatten
from keras.utils import to_categorical
from matplotlib import pyplot as plt
import numpy as np
import seaborn as sns
from sklearn.metrics import confusion_matrix

# Load (and encode) data
(X, Y_tags), (_x, _y) = mnist.load_data()
X = X[:, :, :, np.newaxis]
Y = to_categorical(Y_tags)
print(X.shape, Y.shape)</pre><p>Which outputs: <pre class="crayon-plain-tag">(60000, 28, 28, 1) (60000, 10)</pre> . So, that is to say: we have 60,000 training examples. <pre class="crayon-plain-tag">X</pre> is a 28x28x1 matrix of image data<span title='e.g. integers ranging from 0-255' class='inline-footnote' style=''>2<span class='footnoteContent' style='display:none;'>e.g. integers ranging from 0-255</span></span> and <pre class="crayon-plain-tag">Y</pre> is a <a href="https://en.wikipedia.org/wiki/One-hot">one hot matrix</a> with boolean values for each digit.</p>
<p>Let&#8217;s normalize X:</p><pre class="crayon-plain-tag">X = X/255</pre><p></p>
<h3>Making and running a model</h3>
<p></p><pre class="crayon-plain-tag"># Define model
model = Sequential()  # Most common way to initialize a model
# Add a convolution layer.
# The first layer is the only one which needs an input shape
#   specified; everything else is calculated automatically.
model.add(Conv2D(filters=16, kernel_size=3, activation='relu', padding='same',
          input_shape=X.shape[1:]))
model.add(Flatten())  # Flatten the convolution matrix into a vector.
# Add a hidden layer with 128 nodes.
# 'Dense' is the most common layer:
model.add(Dense(units=128, activation='relu'))
model.add(Dense(units=10, activation='softmax'))  # Our output!
# Define loss function, optimizer, and any metrics:
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])</pre><p>It really is that easy. We have built the entire model. Want to review it? Use <pre class="crayon-plain-tag">model.summary()</pre> .</p><pre class="crayon-plain-tag">_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 28, 28, 16)        160       
_________________________________________________________________
flatten_1 (Flatten)          (None, 12544)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 128)               1605760   
_________________________________________________________________
dense_2 (Dense)              (None, 10)                1290      
=================================================================
Total params: 1,607,210
Trainable params: 1,607,210
Non-trainable params: 0
_________________________________________________________________</pre><p>Want to run it? That&#8217;s easy too!</p><pre class="crayon-plain-tag">history = model.fit(X, Y, validation_split=0.15, epochs=20, batch_size=128)</pre><p>And wa-bam! We have run our model! Notice how Keras will automatically do a validation split for you? No need to pre-process there! It&#8217;s also really easy to tweak how batches and epochs are used. You shouldn&#8217;t need to write your own functions or for loops!</p>
<p>This gives us a giant output, each line of which looks something like:</p><pre class="crayon-plain-tag">Epoch 20/20
51000/51000 [==============================] - 42s 830us/step - loss: 3.4105e-05 - acc: 1.0000 - val_loss: 0.0790 - val_acc: 0.9873</pre><p></p>
<h3>Even simpler?</h3>
<p>Honestly, this model runs just as well without the hidden layer. We can go straight from the convolution to the output:</p><pre class="crayon-plain-tag">model = Sequential()
model.add(Conv2D(filters=16, kernel_size=3, activation='relu', padding='same',
          input_shape=X.shape[1:]))
model.add(Flatten())
model.add(Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
history = model.fit(X, Y, validation_split=0.15, epochs=20, batch_size=128)</pre><p>This runs much faster, too (~20 seconds per epoch instead of ~40):</p><pre class="crayon-plain-tag">Epoch 20/20
51000/51000 [==============================] - 19s 364us/step - loss: 0.0065 - acc: 0.9992 - val_loss: 0.0787 - val_acc: 0.9816</pre><p></p>
<h3>Doing stuff with the model!</h3>
<p>First up, let&#8217;s save it.</p><pre class="crayon-plain-tag">model.save('model.h5')  # You can load with keras.models.load_model()</pre><p>Then why not plot the loss and accuracy over time? Keras makes this quite easy:</p><pre class="crayon-plain-tag"># Plot accuracy over time
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'])
plt.show()</pre><p></p><pre class="crayon-plain-tag"># Plot loss over time
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'])
plt.show()</pre><p><a href="http://realerthinks.com/wordpress/wp-content/uploads/2018/05/accuracy.png"><img fetchpriority="high" decoding="async" id="longdesc-return-1211" class="aligncenter size-full wp-image-1211" tabindex="-1" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/05/accuracy.png" alt="A plot with &quot;Accuracy&quot; on the y-axis (ranging from 0.93 to 1.00) and &quot;Epoch&quot; on the x-axis (ranging from 0 to 20). A solid blue line represents the training data; it starts at 0.93 and rapidly converges to nearly 1.0. A dashed green line represents the test data; it starts at about 0.96 and rapidly converges to about 0.98." width="640" height="480" longdesc="http://realerthinks.com?longdesc=1211&amp;referrer=1208" srcset="http://realerthinks.com/wordpress/wp-content/uploads/2018/05/accuracy.png 640w, http://realerthinks.com/wordpress/wp-content/uploads/2018/05/accuracy-300x225.png 300w, http://realerthinks.com/wordpress/wp-content/uploads/2018/05/accuracy-375x281.png 375w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p><a href="http://realerthinks.com/wordpress/wp-content/uploads/2018/05/loss.png"><img decoding="async" id="longdesc-return-1212" class="aligncenter size-full wp-image-1212" tabindex="-1" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/05/loss.png" alt="A plot with &quot;Loss (cross-categorical entropy)&quot; on the y-axis (ranging from 0.00 to 0.35) and &quot;Epoch&quot; on the x-axis (ranging from 0 to 20). A solid blue line represents the training data; it starts at 0.35 and rapidly converges to nearly 0.00. A dashed green line represents the test data; it starts at about 0.15 and rapidly converges to about 0.10." width="640" height="480" longdesc="http://realerthinks.com?longdesc=1212&amp;referrer=1208" srcset="http://realerthinks.com/wordpress/wp-content/uploads/2018/05/loss.png 640w, http://realerthinks.com/wordpress/wp-content/uploads/2018/05/loss-300x225.png 300w, http://realerthinks.com/wordpress/wp-content/uploads/2018/05/loss-375x281.png 375w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p>Predict outcomes using the model? Still very easy:</p><pre class="crayon-plain-tag">Y_pred = model.predict(X)
Y_tags_pred = np.argmax(Y_pred, axis=1)</pre><p></p>
<h3>Where did the model mess up?</h3>
<p>We can easily see this with a confusion matrix.</p><pre class="crayon-plain-tag">cm = confusion_matrix(y_true=Y_tags, y_pred=Y_tags_pred)</pre><p>This model is very very accurate, so the diagonals (correct predictions)<span title='mean=5989' class='inline-footnote' style=''>3<span class='footnoteContent' style='display:none;'>mean=5989</span></span> are much, much higher than the off-diagonals (incorrect predictions)<span title='mean=1.4' class='inline-footnote' style=''>4<span class='footnoteContent' style='display:none;'>mean=1.4</span></span>. So to plot this, I&#8217;m setting the diagonals to zero.</p><pre class="crayon-plain-tag">np.fill_diagonal(cm, 0)
sns.heatmap(cm, cmap='BuGn', annot=True, fmt='g')
plt.show()</pre><p><a href="http://realerthinks.com/wordpress/wp-content/uploads/2018/05/cm.png"><img decoding="async" id="longdesc-return-1213" class="aligncenter size-full wp-image-1213" tabindex="-1" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/05/cm.png" alt="A table showing the confusion matrix. Integers from 0-9 are on the x- and y-axes. Values in the table are color-coded with a blue-green heatmap and range from 0-34. The highest values are 9--&gt;7 (34), 5--&gt;3 (16) and 2--&gt;7 (10)." width="640" height="480" longdesc="http://realerthinks.com?longdesc=1213&amp;referrer=1208" srcset="http://realerthinks.com/wordpress/wp-content/uploads/2018/05/cm.png 640w, http://realerthinks.com/wordpress/wp-content/uploads/2018/05/cm-300x225.png 300w, http://realerthinks.com/wordpress/wp-content/uploads/2018/05/cm-375x281.png 375w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p>As you can see, the majority of errors were converting reading as 7s, with 2 and 9 being especially confused. Also 16 5s were incorrectly read as 3s. Overall pretty good, considering there were ~6000 correct predictions per digit.</p>
<h3>Parting Thoughts on Keras</h3>
<p>Keras makes TensorFlow even easier. It does a lot of the tedious work for you, and feels a lot more like interacting with the theoretical framework of the model then poking at the nitty-gritty details. Sometimes you&#8217;ll need those nitty-gritty details,<span title='And Keras generally makes it pretty easy to get at them!' class='inline-footnote' style=''>5<span class='footnoteContent' style='display:none;'>And Keras generally makes it pretty easy to get at them!</span></span> but most of the time something straight-forward is exactly what we want. Consider me a convert!</p>
<p>The post <a href="http://realerthinks.com/using-keras-for-deep-learning/">Using Keras for Deep Learning</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://realerthinks.com/using-keras-for-deep-learning/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Visualizing Multi-Dimensional Data Sets</title>
		<link>http://realerthinks.com/visualizing-multi-dimensional-data-sets/</link>
					<comments>http://realerthinks.com/visualizing-multi-dimensional-data-sets/#respond</comments>
		
		<dc:creator><![CDATA[Addie]]></dc:creator>
		<pubDate>Tue, 15 May 2018 15:07:16 +0000</pubDate>
				<category><![CDATA[Data Analysis]]></category>
		<category><![CDATA[correlation]]></category>
		<category><![CDATA[numpy]]></category>
		<category><![CDATA[pandas]]></category>
		<category><![CDATA[poof]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[social justice]]></category>
		<category><![CDATA[URMs]]></category>
		<guid isPermaLink="false">http://realerthinks.com/?p=1181</guid>

					<description><![CDATA[<p>Why hello, friends! You may recall where we left off last week: having cleaned climate survey data so we can poke, prod, and display this multi-dimensional data in ways that make sense. I had two main goals doing this analysis: Determine if minorities were having a different experience in the department than their peers. Try to [&#8230;]</p>
<p>The post <a href="http://realerthinks.com/visualizing-multi-dimensional-data-sets/">Visualizing Multi-Dimensional Data Sets</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Why hello, friends! You may recall where we left off last week: <a href="http://realerthinks.com/social-data-messy/">having cleaned climate survey data</a> so we can poke, prod, and display this multi-dimensional data in ways that make sense. I had two main goals doing this analysis:</p>
<ol>
<li>Determine if minorities were having a different experience in the department than their peers.</li>
<li>Try to find any interesting correlations that could give us insight into making the department a better place.<span title='Which has all sorts of &#8220;correlation doesn&#8217;t equal causation&#8221; problems attached, so we need to be careful with any causal statements.' class='inline-footnote' style=''>6<span class='footnoteContent' style='display:none;'>Which has all sorts of &#8220;correlation doesn&#8217;t equal causation&#8221; problems attached, so we need to be careful with any causal statements.</span></span></li>
</ol>
<p>For the first goal, I found the best way to visualize the data was to use box and whisker plots. For the second, tables showing answer counts with a heat map behind them seemed to work the best. I tackled each of these methods very differently, so let&#8217;s cover them each one at a time.</p>
<h3>Box and Whisker Plots</h3>
<h4>But first: A refresher</h4>
<p>If you studied box and whisker plots in fourth grade and haven&#8217;t spared them a thought since, you are not alone. That seems to be true of the majority of people I encountered on this project. So! Let&#8217;s do a quick refresher! I made this handy-dandy graphic that should explain pretty much everything you want:<img loading="lazy" decoding="async" id="longdesc-return-1183" class="aligncenter wp-image-1183 size-full" tabindex="-1" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/boxplot_key.jpg" alt="Visual description of a box and whisker plot. The maximum and minimum are the &quot;whiskers&quot; of the plot. The other horizontal lines (1st quartile, median, 3rd quartile) divide the data into four parts. That is, 25% of the data occurs between the minimum and the 1st quartile, 25% occurs between the 1st quartile and the median, etc. The middle 50% of the data is the &quot;box.&quot; The mean is depicted with a red diamond. Occasionally, outliers will be present. These will be represented as single points outside of the box and whisker plot." width="216" height="432" longdesc="http://realerthinks.com?longdesc=1183&amp;referrer=1181" srcset="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/boxplot_key.jpg 216w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/boxplot_key-150x300.jpg 150w" sizes="auto, (max-width: 216px) 100vw, 216px" />Imports, imports, imports</p><pre class="crayon-plain-tag">import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
import numpy as np
import pandas as pd
import seaborn as sns</pre><p></p>
<h4>Defining colors and being generally picky</h4>
<p>When making graphics, I generally like to define my own colors. It is important to me that colors look good in a variety of circumstances, including:</p>
<ul>
<li>On a screen</li>
<li>In print</li>
<li>In print, but greyscale</li>
<li>To red-green colorblind folks</li>
<li>To blue-yellow colorblind folks</li>
</ul>
<p>That&#8217;s asking a lot!! Fortunately, one of my favorite web resources gives a lot of colors to choose from that meet these goals. <a href="https://personal.sron.nl/~pault/">Paul Tol&#8217;s colorblind color schemes</a> is a fantastic place to get color schemes. I generally use them as-is, but occasionally (like for this project) I modify them a little bit.</p><pre class="crayon-plain-tag">COLORS = {
    'blue': {'line_color': '#002255', 'face_color': '#4477AA'},
    'red': {'line_color': '#660011', 'face_color': '#CC6677'},

    'light_blue': {'line_color': '#227788', 'face_color': '#AAEEFF'},
    'med_blue': {'line_color': '#227788', 'face_color': '#88CCEE'},
    'light_turquoise': {'line_color': '#004433', 'face_color': '#66CCBB'},
    'med_turquoise': {'line_color': '#004433', 'face_color': '#44AA99'},
    'dark_turquoise': {'line_color': '#004433', 'face_color': '#228877'},
    'light_green': {'line_color': '#001100', 'face_color': '#339955'},
    'med_green': {'line_color': '#001100', 'face_color': '#117733'},
    'dark_green': {'line_color': '#001100', 'face_color': '#005511'},
    'yellow': {'line_color': '#776600', 'face_color': '#FFEE99'},
    'dark_yellow': {'line_color': '#776600', 'face_color': '#DDCC77'},
    'light_red': {'line_color': '#660011', 'face_color': '#EE8899'},
    'med_red': {'line_color': '#660011', 'face_color': '#CC6677'},
    'dark_red': {'line_color': '#660011', 'face_color': '#AA4455'},
    'light_magenta': {'line_color': '#440033', 'face_color': '#CC66BB'},
    'med_magenta': {'line_color': '#440033', 'face_color': '#AA4499'},
    'dark_magenta': {'line_color': '#440033', 'face_color': '#882277'},
    }</pre><p>The box and whisker plots look exactly the way I wanted: I custom-defined each line and face, from the whiskers to the caps to fliers (aka outliers). To make this work out nicely, I wrapped it all into a function to add a single box plot to the page we&#8217;re working on:</p><pre class="crayon-plain-tag">def add_boxplot(series, ax, position=1, width=0.6, color='red', **kwargs):
    """
    Plot ONE box and whisker plot on the provided graph.

    Arguments:
        series - the data to be plotted
        ax - the graph on which to plot the data

    Optional Arguments:
        position - the x position on which to center the box and
                   whisker plot (default 1)
        width - the width of the box and whisker plot (default 0.6)
        color - the color of the box and whisker plot (default 'red')
        **kwargs - any additional arguments to pass to ax.boxplot()
    """
    # Styles
    box_style = dict(linewidth=1.5, color=COLORS[color]['line_color'],
                     facecolor=COLORS[color]['face_color'])
    whisker_style = dict(linewidth=1, color=COLORS[color]['line_color'])
    median_style = dict(linewidth=2.5, color=COLORS[color]['line_color'])
    cap_style = dict(linewidth=1.5, color=COLORS[color]['line_color'])
    flier_style = dict(marker='o', markersize=6,
                       markerfacecolor=COLORS[color]['face_color'],
                       markeredgecolor=COLORS[color]['line_color'])
    mean_style = dict(marker='d', markersize=8,
                      markerfacecolor=COLORS['red']['face_color'],
                      markeredgecolor=COLORS['red']['line_color'])

    # Plot!
    data = [x for x in series if x == x]  # Filter out NaNs.
    ax.boxplot(
        data, positions=[position], widths=width, patch_artist=True,
        boxprops=box_style, medianprops=median_style, capprops=cap_style,
        whiskerprops=whisker_style, flierprops=flier_style,
        meanprops=mean_style, **kwargs
        )</pre><p>This might be a little high on the anal-retentive side of things, but beautiful graphics are important to me, and this is my blog so there.</p>
<h4>But wait, how do we even select the data in the first place?</h4>
<p>Well, first let&#8217;s load it.</p><pre class="crayon-plain-tag">df = pd.read_csv('dataframe_sanitized.csv')</pre><p>And then let&#8217;s say we want to compare and contrast heterosexual-identified folks with LGBA+-identified folks. Well, because we cleaned up the DataFrame for easy use last week, we can easily see in a column who is heterosexual-identified:</p><pre class="crayon-plain-tag">df['orientation_hete']</pre><p>Which gives us 100 values (because there were 100 respondents) of<br />
<pre class="crayon-plain-tag">True</pre><br />
,<br />
<pre class="crayon-plain-tag">False</pre><br />
, or<br />
<pre class="crayon-plain-tag">NaN</pre><br />
(the way pandas identifies blank values). We can select data from the DataFrame<span title='le gasp!' class='inline-footnote' style=''>2<span class='footnoteContent' style='display:none;'>le gasp!</span></span> simply by using the column we just viewed:</p><pre class="crayon-plain-tag">where_hete = df['orientation_hete']
data_hete = df[where_hete]</pre><p>And now we have a DataFrame with only answers from heterosexual folks! We can access each question as we did before, easy peasy:</p><pre class="crayon-plain-tag">data_hete['course_exams']</pre><p>gives us a column with 67<span title='the number of people who self-identified as heterosexual on the survey' class='inline-footnote' style=''>3<span class='footnoteContent' style='display:none;'>the number of people who self-identified as heterosexual on the survey</span></span> integer values from 1-5.<span title='the responses for the question' class='inline-footnote' style=''>4<span class='footnoteContent' style='display:none;'>the responses for the question</span></span> We can easily ship this data to the<br />
<pre class="crayon-plain-tag">add_boxplot</pre><br />
function described above!</p>
<h4>Results!</h4>
<p>I needed to project this multi-dimensional data down into 2- or 3-dimensions so the results are easily interpretable. What I wound up doing was making a pdf page for each question, and then printing the box plots from each individual group on the page, so you could compare and contrast answers from different demographics, like so:</p>
<p><a href="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig.png"><img loading="lazy" decoding="async" id="longdesc-return-1191" class="aligncenter size-large wp-image-1191" tabindex="-1" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig-1024x384.png" alt="A series of box plots for the question &quot;I am required to work during the evening.&quot; Answers are on a 1-5 scale. Most answers have a median of 2 and a mean of approximately 2.5. Racial minorities and religious minorities are the exception. Their means are 3, and the middle 50% of their answers score much higher than other categories." width="1024" height="384" longdesc="http://realerthinks.com?longdesc=1191&amp;referrer=1181" srcset="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig-1024x384.png 1024w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig-300x113.png 300w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig-768x288.png 768w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig-1200x450.png 1200w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig-375x141.png 375w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig-760x285.png 760w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></p>
<p>Ruh roh! Looks like racial minorities and religious minorities are experiencing different expectations for when they are required to work. I&#8217;m not going to even begin to speculate on what might be causing this effect,<span title='That&#8217;s well above my pay grade' class='inline-footnote' style=''>5<span class='footnoteContent' style='display:none;'>That&#8217;s well above my pay grade</span></span> but we <em>can</em> see if it has anything to do sub-discipline (or other departmental identifiers):</p>
<p><a href="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig2.png"><img loading="lazy" decoding="async" id="longdesc-return-1193" class="aligncenter size-large wp-image-1193" tabindex="-1" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig2-1024x384.png" alt="A series of box plots for the question &quot;I am required to work during the evening.&quot; Answers are on a 1-5 scale. All answers have a median of 2 or 3 and a mean between 1.5 and 3. There don't appear to be statistically significant differences based on students' start year, nor whether their advisor is tenured or un-tenured. Sub-disciplines show a broad range of boxes, but most have whiskers from 1-4." width="1024" height="384" longdesc="http://realerthinks.com?longdesc=1193&amp;referrer=1181" srcset="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig2-1024x384.png 1024w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig2-300x113.png 300w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig2-768x288.png 768w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig2-1200x450.png 1200w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig2-375x141.png 375w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig2-760x285.png 760w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig2.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></p>
<p>There appear to be definite cultural differences by sub-discipline, but nothing that strikes me as, well, alarming. Tenured vs. un-tenured doesn&#8217;t seem to have much of an impact on being required to work in the evening, and the start-year of the student all seem to be within statistical significance of each other.<span title='It&#8217;s possible the &#8220;older&#8221; students are more often required to work in the evening, but I&#8217;m not comfortable eyeballing the significance of that trend.' class='inline-footnote' style=''>6<span class='footnoteContent' style='display:none;'>It&#8217;s possible the &#8220;older&#8221; students are more often required to work in the evening, but I&#8217;m not comfortable eyeballing the significance of that trend.</span></span></p>
<h4>Combining Groups</h4>
<p>You can note that I combined some values for &#8220;start year&#8221; on that last plot. There were too few students who had started in 2010 and 2017. I didn&#8217;t want to mess up the survey&#8217;s anonymity, so I grouped each with the nearest year. You can do that with the cunning use of<br />
<pre class="crayon-plain-tag">|</pre><br />
(the pandas &#8220;or&#8221; operator).</p><pre class="crayon-plain-tag">df['start_year_2016_17'] = df['start_year_2016'] | df['start_year_2017']</pre><p></p>
<h3>Cross-counts and Correlation</h3>
<p>We&#8217;re in the home stretch! All that&#8217;s left to do<span title='aside from generate social change, of course!' class='inline-footnote' style=''>7<span class='footnoteContent' style='display:none;'>aside from generate social change, of course!</span></span> is see if any questions correlate with one another to any degree of significance.</p>
<h4>Kendall&#8217;s Correlation Coefficient</h4>
<p>I chose to use <a href="https://en.wikipedia.org/wiki/Kendall_rank_correlation_coefficient">Kendall&#8217;s correlation coefficient</a> to rank the correlation between different questions. This helps capture several important aspects of the data:</p>
<ul>
<li>Outright examples, e.g. &#8220;I feel safe&#8221; vs &#8220;I have been harassed&#8221;<span title='not actual wording of questions from the survey' class='inline-footnote' style=''>8<span class='footnoteContent' style='display:none;'>not actual wording of questions from the survey</span></span> where a 5 is good in one case and very bad in the other.</li>
<li>Subtle examples, e.g. an individual feels strongly about one question (1s and 5s being very extreme) and meh about another (1s and 5s being more middling).</li>
<li>&#8220;Yes&#8221;/&#8221;No&#8221;/&#8221;Unsure&#8221;.  We ranked these as 1, 0, and 0.5 respectively. Is &#8220;Unsure&#8221; <em>exactly</em> halfway between &#8220;Yes&#8221; and &#8220;No?&#8221;</li>
</ul>
<p>A 5 from one question doesn&#8217;t necessarily equal a 5 from another. How do you compare 1-5 scales to &#8220;Yes&#8221;/&#8221;No&#8221; scales? Does a 5 = &#8220;Yes&#8221;? With Kendall, it doesn&#8217;t matter. All that matters is the <em>relative</em> rank. So as long as we&#8217;re sure that a 5 is greater than a 4 (for the same question) and a &#8220;Yes&#8221; is greater than an &#8220;Unsure,&#8221; we&#8217;re good to go!</p>
<h4>Making a Correlation Matrix</h4>
<p>First I made a list of all of the quantitative questions we had asked, and saved it in the variable<br />
<pre class="crayon-plain-tag">QUANT_QS</pre><br />
. Making the correlation matrix is as easy as pie:</p><pre class="crayon-plain-tag">corr_mat = df[QUANT_QS].corr(method='kendall')</pre><p>Poof! We have an NxN Dataframe with each entry being Kendall&#8217;s correlation coefficient. For instance, if I want to see the correlation between &#8220;I feel that it is expected of me to work during the evening,&#8221; and &#8220;I feel that it is expected of me to work during the weekend,&#8221; all we need to do is</p><pre class="crayon-plain-tag">j = 'work_expect_evening'
k = 'work_expect_weekend'
corr_mat[j][k]</pre><p>and plop! Out pops 0.64. But what does that correlation look like? Can we show this in a more visual way?</p>
<h4>Printing Pretty Cross-Counts</h4>
<p></p><pre class="crayon-plain-tag">tmp = pd.crosstab(df[j], df[k])
ax = sns.heatmap(tmp, cmap='BuGn', square=True, annot=True)
plt.show()</pre><p><a href="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig3.png"><img loading="lazy" decoding="async" id="longdesc-return-1195" class="aligncenter size-full wp-image-1195" tabindex="-1" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig3.png" alt="A 5x5 chart with &quot;It is expected of me to work during the evening&quot; on the y-axis and &quot;I feel that it is expected of me to work during the weekend&quot; on the x-axis. The ranges of both axes span from 1-5. Higher values are depicted in dark green, lower values in light green or white. There is a clear diagonal trend, with most answers being in (1, 1) (2, 2) (4, ) or (5, 5)." width="624" height="541" longdesc="http://realerthinks.com?longdesc=1195&amp;referrer=1181" srcset="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig3.png 624w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig3-300x260.png 300w, http://realerthinks.com/wordpress/wp-content/uploads/2018/04/example_fig3-375x325.png 375w" sizes="auto, (max-width: 624px) 100vw, 624px" /></a></p>
<p>I did a little bit of my own finagling to label the axes and plot title, but it&#8217;s nothing you can&#8217;t figure out for yourself with a little Google magic. I wound up creating a .pdf file that showed all of the cross-correlation tables for anything that had a correlation higher than 0.5.<span title='or lower than -0.5' class='inline-footnote' style=''>9<span class='footnoteContent' style='display:none;'>or lower than -0.5</span></span> There weren&#8217;t really any unexpected results here. Generally people who liked their advisors liked them across the board. People who worked a lot worked a lot. But it was very good to see those correlations pop up so noticeably! I&#8217;d be worried if they hadn&#8217;t!</p>
<p>Anyway! That&#8217;s all for now folks! I&#8217;ll see you in a couple of weeks for my next project&#8230; it&#8217;s super top secret! You&#8217;ll have to come back to find out!<span title='Why yes, this is indeed code for &#8220;I haven&#8217;t decided myself yet.&#8221; But it will be fun, I promise!' class='inline-footnote' style=''>10<span class='footnoteContent' style='display:none;'>Why yes, this is indeed code for &#8220;I haven&#8217;t decided myself yet.&#8221; But it will be fun, I promise!</span></span></p>
<p>The post <a href="http://realerthinks.com/visualizing-multi-dimensional-data-sets/">Visualizing Multi-Dimensional Data Sets</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://realerthinks.com/visualizing-multi-dimensional-data-sets/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Finding Trends in Social Data: Messy, Frustrating, Important</title>
		<link>http://realerthinks.com/social-data-messy/</link>
					<comments>http://realerthinks.com/social-data-messy/#respond</comments>
		
		<dc:creator><![CDATA[Addie]]></dc:creator>
		<pubDate>Tue, 08 May 2018 16:11:04 +0000</pubDate>
				<category><![CDATA[Data Analysis]]></category>
		<category><![CDATA[numpy]]></category>
		<category><![CDATA[pandas]]></category>
		<category><![CDATA[poof]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[social justice]]></category>
		<category><![CDATA[statistics]]></category>
		<category><![CDATA[URMs]]></category>
		<guid isPermaLink="false">http://realerthinks.com/?p=1176</guid>

					<description><![CDATA[<p>Last September, my (former) department created a &#8220;Climate Survey&#8221; to try and understand how the graduate students and postdoctoral researchers felt about, well, the climate of the department. There were a lot of questions, and they were asked in several different ways. 100 people responded to the survey. There was a lot of data. Social data. And [&#8230;]</p>
<p>The post <a href="http://realerthinks.com/social-data-messy/">Finding Trends in Social Data: Messy, Frustrating, Important</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Last September, my (former) department created a &#8220;Climate Survey&#8221; to try and understand how the graduate students and postdoctoral researchers felt about, well, the climate of the department. There were <em>a lot</em> of questions, and they were asked in several different ways. 100 people responded to the survey. There was <em>a lot</em> of data. Social data. And they needed someone to analyse it. That someone&#8230; was me.<span title='dunDun NahNaaaa' class='inline-footnote' style=''>11<span class='footnoteContent' style='display:none;'>dunDun NahNaaaa</span></span></p>
<p>Trying to process all of the data into meaningful and easily-interpreted results while at the same time finishing a PhD thesis, applying for jobs, and dealing with all of the other life whirlwinds made this a very challenging project. Mostly because I didn&#8217;t quite have the time to commit to it. Once I successfully graduated, though,<span title='yaaaay!' class='inline-footnote' style=''>2<span class='footnoteContent' style='display:none;'>yaaaay!</span></span> I was able to finish this sucker up and make it look good at the same time.</p>
<p>Ultimately I wanted to show if different categories of people in the department (e.g. people of color, but also e.g. organic chemists) were having different experiences than their peers. We can use this data to re-shape Department policy, show areas of improvement to help retain populations vulnerable to discrimination, and get some actual statistics on department composition.</p>
<p>While I can&#8217;t share the data with you (privacy concerns!) I <em>can</em> show you what-all I did, which should be very illustrative on its own.</p>
<h3>Social Data in the Raw</h3>
<p>The data format coming in was a download from Google Forms, which comes as a .csv. The first line of the file has the exact text of the questions asked (separated by commas), and each subsequent line is a single person&#8217;s answers. There are numbers mixed in with strings. There are unanswered questions. There are options like &#8220;Prefer not to answer,&#8221; &#8220;Unsure,&#8221; and &#8220;Not applicable.&#8221; Some of the questions people could select multiple options (like: &#8220;With which race(s) do you identify?&#8221;).</p>
<p>TLDR: social data is <strong>messy</strong>.</p>
<p>This sounds like a job for&#8230; <a href="https://pandas.pydata.org/">pandas</a>!</p>
<h3>Cleaning up dat Data</h3>
<p>I identified several goals that needed to happen in order to have a workable data frame:</p>
<ol>
<li>Convert the column headers to short and pithy labels, rather than using the full text of the question asked. This makes reading and processing the code much more human-friendly.</li>
<li>Convert each multiple choice question into a series of Boolean values. So if someone answers <pre class="crayon-plain-tag">'Asian;White'</pre> , then their values for the <pre class="crayon-plain-tag">race_asian</pre>  and <pre class="crayon-plain-tag">race_white</pre>  columns should be <pre class="crayon-plain-tag">True</pre> , but their value for, e.g. <pre class="crayon-plain-tag">race_black</pre> would be <pre class="crayon-plain-tag">False</pre> .<span title='It&#8217;s important to note that the demographic questions that our survey asked had much more descriptive selections for race (e.g. &#8216;Black or African American&#8217;) but I am abbreviating them for clarity&#8217;s sake.' class='inline-footnote' style=''>3<span class='footnoteContent' style='display:none;'>It&#8217;s important to note that the demographic questions that our survey asked had much more descriptive selections for race (e.g. &#8216;Black or African American&#8217;) but I am abbreviating them for clarity&#8217;s sake.</span></span></li>
<li>Change questions with &#8216;Yes,&#8217; &#8216;No,&#8217; and &#8216;Unsure&#8217; into numerical values. There is an obvious ranking here that we can show using numbers.<span title='NOTE: There isn&#8217;t an obvious mapping to numbers. We can&#8217;t for sure say that &#8216;Unsure&#8217; is exactly half of &#8216;Yes&#8217;, for instance. But we CAN rank them. &#8216;Yes&#8217; is obviously more certain than &#8216;Unsure&#8217; which is obviously more certain than &#8216;No&#8217;. This idea of relative rank will come up later on.' class='inline-footnote' style=''>4<span class='footnoteContent' style='display:none;'>NOTE: There isn&#8217;t an obvious mapping to numbers. We can&#8217;t for sure say that &#8216;Unsure&#8217; is exactly half of &#8216;Yes&#8217;, for instance. But we CAN rank them. &#8216;Yes&#8217; is obviously more certain than &#8216;Unsure&#8217; which is obviously more certain than &#8216;No&#8217;. This idea of relative rank will come up later on.</span></span></li>
<li>Identify minorities, and label them so that their answers can be pooled and compared against the majority (to see if, for instance, men, women, and trans folks have similar or dissimilar experiences across different measures).</li>
</ol>
<p>Let&#8217;s go over the code for each goal, and show the final outcome!</p>
<h4>Import the data and re-label the columns</h4>
<p></p><pre class="crayon-plain-tag">import numpy as np
import pandas as pd

INFILE = 'SurveyData.csv'
df = pd.read_csv(INFILE)</pre><p>Gosh, I love pandas. The data is there. POOF!<span title='*fairy glitter sparkles*' class='inline-footnote' style=''>5<span class='footnoteContent' style='display:none;'>*fairy glitter sparkles*</span></span></p>
<p>Renaming the columns is just as easy. First, I define a (rather large) dictionary, with each key being a question asked in the survey, and each value being the short name I wanted the column to have.</p><pre class="crayon-plain-tag">column_names = {
    'Timestamp': 'timestamp',
    'I am required to work during the evening': 'work_req_evening',
    ...
    }</pre><p>Then I simply ask pandas to do the renaming:</p><pre class="crayon-plain-tag">df.rename(columns=column_names, inplace=True)</pre><p>As a bonus, we can turn the timestamps into pandas datetime objects, so we could do time-math on them if we so choose:</p><pre class="crayon-plain-tag">df.timestamp = pd.to_datetime(df.timestamp)</pre><p>Moving right along&#8230;</p>
<h4>Practical Parsing of Multiple Choice Answers</h4>
<p>The first thing I did was define a function to label the multiple-choice columns in an automatic way. I didn&#8217;t want to re-label all of those by hand!</p><pre class="crayon-plain-tag">def label_maker(x, c):
    """
    Create succinct naming conventions for multiple choice options.

    If the multiple choice option has multiple words, then return an
    acroynm. Else, use the first four letters of the option. The final
    label will have the category and truncated option together.
    e.g.
        option = 'female', category = 'gender'
            --&gt;
        label = 'gender_fema'

        option = 'Asian or Asian American', category = 'race'
            --&gt;
        label = 'race_aoaa'

    Arguments:
        x - (string) multiple choice option to be truncated
        c - (string) category, to be prepended to label

    Returns:
        label - (string) the final, succinct column label
    """
    if len(x.split()) &gt; 1:
        # If multiple words, then use acronym
        y = ''.join([w[0].lower() for w in x.split()])
        if y == 'p(':
            y = 'phys_%s' % x.split()[1][1:4].lower()
    else:
        y = x[:4].lower()
    return '%s_%s' % (c, y)</pre><p>Note the prominent docstring. I commented the bajeezus out of this code, because I knew I&#8217;d be passing it along to someone else next year. This hypothetical next-year person might not know much about code, and it was important to me that everything I wrote be veeeeerrrrry readable.</p>
<p>Next I defined which questions were multiple choice questions:</p><pre class="crayon-plain-tag">mul_choice = [
    'adv_tenure',
    'gender',
    'start_year',
    ...
    ]</pre><p>Now, for each question, we need to:</p>
<ol>
<li>Remove &#8216;Prefer not to answer&#8217; answers.</li>
<li>Turn each entry into a list, rather than a string.</li>
<li>Make new columns for each possible entry (labeled with our label_maker function above).</li>
<li>Do some clean-up.</li>
</ol>
<h5>Removing &#8216;Prefer not to answer&#8217;</h5>
<p></p><pre class="crayon-plain-tag">for c in mul_choice:
    df.loc[df[c].isin(['Prefer not to answer']), c] = ''
    tmp = df[c].fillna('')</pre><p>For each column, we turn blank results and &#8216;Prefer not to answer&#8217; results into an empty string. We&#8217;re saving everything into a temporary <pre class="crayon-plain-tag">pd.Series</pre>  object, <pre class="crayon-plain-tag">tmp</pre> .</p>
<h5>Lists, not strings</h5>
<p>This is also an easy fix!</p><pre class="crayon-plain-tag">tmp = tmp.str.split(';')</pre><p></p>
<h5>New columns for each possible entry</h5>
<p>This gets into some tricky python-ing, but basically we&#8217;re making a new column for each multiple choice option which has a Boolean value if that option was selected by each survey participant.</p><pre class="crayon-plain-tag">tmp = tmp.apply(lambda x: pd.Series(1, index=x)).fillna(0).astype(bool)</pre><p>Now we need to rename the columns using our <pre class="crayon-plain-tag">label_maker</pre> function. First we generate the names, and then we replace them in-place like we did with the big dataframe before:</p><pre class="crayon-plain-tag">new_columns = [label_maker(x, c) for x in tmp.columns]
    tmp.rename(columns=dict(zip(tmp.columns, new_columns)), inplace=True)</pre><p></p>
<h5>Appending and clean up</h5>
<p>Let&#8217;s add our <pre class="crayon-plain-tag">tmp</pre>  back in to the main DataFrame!</p><pre class="crayon-plain-tag">df = pd.concat([df, tmp], axis=1)</pre><p>That&#8217;s going to loop over all multiple choice questions and get them nice and organized. There is one last thing that we need to do, though. When we generated a new column for each multiple choice item, one of the &#8220;items&#8221; it looked at was the empty string &#8221;. This translated to <pre class="crayon-plain-tag">[Nan]</pre>  when we asked to turn it into a list, and so <pre class="crayon-plain-tag">NaN</pre> was considered one of the &#8220;list elements.&#8221; That means we have some columns with effectively useless data. The good news is that their labels all end with &#8216;_&#8217; because of the way we defined <pre class="crayon-plain-tag">label_maker</pre> . A quick list comprehension can delete these no problem:</p><pre class="crayon-plain-tag">df = df[[c for c in df.columns if not c.endswith('_')]]</pre><p>Multiple choice questions: sorted!</p>
<h4>Yes, No, Maybe So</h4>
<p>First, let&#8217;s define a list of all of our yes/no questions:</p><pre class="crayon-plain-tag">yes_no = [
    'adv_switched',
    'harassment_observed',
    ...
]</pre><p>and we&#8217;ll also make a quick dictionary that will translate words into values. Not quantitative values, mind you, but ranked values. We can&#8217;t say exactly how much &#8216;Unsure&#8217; is like &#8216;Yes&#8217; or like &#8216;No,&#8217; but we CAN say that it&#8217;s in-between them. So the values we&#8217;re giving them are relative <strong>ranks</strong> and not absolute, got it?</p><pre class="crayon-plain-tag">yes_no_dict = {
    '': np.nan,
    'N/A': np.nan,
    'Not applicable': np.nan,
    'Prefer not to answer': np.nan,
    'No': 0,
    'Unsure': 0.5,
    'Yes': 1
    }</pre><p>Also, anything that was a non-answer, we&#8217;re changing to be blank in the DataFrame. There&#8217;s just one last step, and that&#8217;s implementing the dictionary:</p><pre class="crayon-plain-tag">for c in yes_no:
    df = df.replace({c: yes_no_dict})</pre><p></p>
<h4>Aggregating minorities</h4>
<p>For purposes of determining whether minorities have a different experience in the department than the majority, we need to be able to have a column identifying whether someone is a minority or not. Let&#8217;s use sexual orientation as the example.</p>
<p>First, let&#8217;s identify the options that will count as an orientation minority. In this case, it will be any answer that wasn&#8217;t &#8220;heterosexual.&#8221;</p><pre class="crayon-plain-tag">orientation_mino = [x for x in df.columns
                    if x.startswith('orientation_')
                    and x != 'orientation_hete']</pre><p>Let&#8217;s turn that into a usable DataFrame:</p><pre class="crayon-plain-tag">tmp = df[orientation_mino]</pre><p>In this case, my temporary DataFrame, <pre class="crayon-plain-tag">tmp</pre>, has six columns, one for each option in the sexual orientation question (excluding &#8220;heterosexual&#8221;). We can sum along this DataFrame horizontally:</p><pre class="crayon-plain-tag">tmp = tmp.sum(axis=1)</pre><p>which gives us a single column that has a number in it. The number is the number of checkboxes each individual selected, other than &#8220;heterosexual.&#8221; How many options did people tend to choose?</p><pre class="crayon-plain-tag">In : tmp.unique()
Out: array([1, 0, 2])</pre><p>People selected either 0, 1, or 2 check boxes from the six non-heterosexual options. Let&#8217;s turn this into a Boolean array and append it to the main DataFrame, shall we?</p><pre class="crayon-plain-tag">df['orientation_mino'] = tmp.astype(bool)</pre><p>I needed to separate out each demographic differently, so if you&#8217;re doing something similar, you&#8217;ll likely want to do the same. For instance, when asking about disabled identities, so many people answered that they had mental illness that I found it important to present that demographic separately from folks with other, physical disabilities.</p>
<h3>What&#8217;s up next?</h3>
<p>I&#8217;m glad you asked! Next week I&#8217;m going to dive into <em>processing</em> this now-clean data and presenting it in a beautiful way that&#8217;s easy to parse.<span title='Technically, I&#8217;ve already written it and you just have to wait a week to read it, because having a buffer is important for my sanity.' class='inline-footnote' style=''>6<span class='footnoteContent' style='display:none;'>Technically, I&#8217;ve already written it and you just have to wait a week to read it, because having a buffer is important for my sanity.</span></span></p>
<p>The post <a href="http://realerthinks.com/social-data-messy/">Finding Trends in Social Data: Messy, Frustrating, Important</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://realerthinks.com/social-data-messy/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A Searchable Teeline Dictionary</title>
		<link>http://realerthinks.com/a-searchable-teeline-dictionary/</link>
					<comments>http://realerthinks.com/a-searchable-teeline-dictionary/#comments</comments>
		
		<dc:creator><![CDATA[Addie]]></dc:creator>
		<pubDate>Tue, 24 Apr 2018 16:43:14 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[teeline]]></category>
		<guid isPermaLink="false">http://realerthinks.com/?p=452</guid>

					<description><![CDATA[<p>Hi everybody! A while ago, I did a post on learning Teeline, which was really fun to write. Since then, I&#8217;ve learned a lot more, and wanted to share with you in the best way I know how: by curating my own Teeline dictionary! It was important to me to create a dictionary that was [&#8230;]</p>
<p>The post <a href="http://realerthinks.com/a-searchable-teeline-dictionary/">A Searchable Teeline Dictionary</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Hi everybody! A while ago, I did a post on <a href="http://realerthinks.com/teeline-for-the-curious-a-story-of-learning-things-because-i-can/">learning Teeline</a>, which was really fun to write. Since then, I&#8217;ve learned a lot more, and wanted to share with you in the best way I know how: by curating my own Teeline dictionary!</p>



<p>It was important to me to create a dictionary that was easily searchable, because so much out there is image-only, and you have to manually scour resources. I want this to be a resource that is easy and available!</p>



<p>So far the dictionary contains 674 words. I have done my best to show multiple ways of expressing words (specifically with the upward/downward &#8216;L&#8217;), but keep in mind that there might be a different way to write any given word that&#8217;s equally valid.</p>



<p>If you have any requests, suggestions, corrections, or general comments, please let me know! I would be happy to include them in the dictionary. I intend this to be a living project, and I want it to grow and evolve to be the best (and most useful) it can be.</p>



<h3 class="wp-block-heading">A Searchable Teeline Dictionary</h3>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<div class="dict-cols">
<div class="dict-item">A: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_a.png" alt="The Teeline word A"></figure></div>
<div class="dict-item">Able: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_able.png" alt="The Teeline word Able"></figure></div>
<div class="dict-item">About: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_about.png" alt="The Teeline word About"></figure></div>
<div class="dict-item">Above: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_above.png" alt="The Teeline word Above"></figure></div>
<div class="dict-item">Accident: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_accident.png" alt="The Teeline word Accident"></figure></div>
<div class="dict-item">Act: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_act.png" alt="The Teeline word Act"></figure></div>
<div class="dict-item">After: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_after.png" alt="The Teeline word After"></figure></div>
<div class="dict-item">Aftermath: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_aftermath.png" alt="The Teeline word Aftermath"></figure></div>
<div class="dict-item">Afternoon: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_afternoon.png" alt="The Teeline word Afternoon"></figure></div>
<div class="dict-item">Again: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_again.png" alt="The Teeline word Again"></figure></div>
<div class="dict-item">Against: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_against.png" alt="The Teeline word Against"></figure></div>
<div class="dict-item">Age: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_age.png" alt="The Teeline word Age"></figure></div>
<div class="dict-item">Ago: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_ago.png" alt="The Teeline word Ago"></figure></div>
<div class="dict-item">Air: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_air.png" alt="The Teeline word Air"></figure></div>
<div class="dict-item">All: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_all.png" alt="The Teeline word All"></figure></div>
<div class="dict-item">Also: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_also.png" alt="The Teeline word Also"></figure></div>
<div class="dict-item">Always: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_always.png" alt="The Teeline word Always"></figure></div>
<div class="dict-item">Am: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_am.png" alt="The Teeline word Am"></figure></div>
<div class="dict-item">Among: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_among.png" alt="The Teeline word Among"></figure></div>
<div class="dict-item">Amount: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_amount.png" alt="The Teeline word Amount"></figure></div>
<div class="dict-item">An: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_an.png" alt="The Teeline word An"></figure></div>
<div class="dict-item">And: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_and.png" alt="The Teeline word And"></figure></div>
<div class="dict-item">Animal: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_animal1.png" alt="The Teeline word Animal (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_animal2.png" alt="The Teeline word Animal (version 2)"></figure></div>
<div class="dict-item">Announce: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/announce.png" alt="The Teeline word Announce"></figure></div>
<div class="dict-item">Announced: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/announced.png" alt="The Teeline word Announced"></figure></div>
<div class="dict-item">Answer: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_answer.png" alt="The Teeline word Answer"></figure></div>
<div class="dict-item">Any: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_any.png" alt="The Teeline word Any"></figure></div>
<div class="dict-item">Anything: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_anything.png" alt="The Teeline word Anything"></figure></div>
<div class="dict-item">Appear: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_appear.png" alt="The Teeline word Appear"></figure></div>
<div class="dict-item">April: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_april.png" alt="The Teeline word April"></figure></div>
<div class="dict-item">Are: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_are.png" alt="The Teeline word Are"></figure></div>
<div class="dict-item">Area: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_area.png" alt="The Teeline word Area"></figure></div>
<div class="dict-item">As: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_as.png" alt="The Teeline word As"></figure></div>
<div class="dict-item">Ask: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_ask.png" alt="The Teeline word Ask"></figure></div>
<div class="dict-item">Astronomy: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_astronomy.png" alt="The Teeline word Astronomy"></figure></div>
<div class="dict-item">At: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_at.png" alt="The Teeline word At"></figure></div>
<div class="dict-item">Atom: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_atom.png" alt="The Teeline word Atom"></figure></div>
<div class="dict-item">Attention: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_attention.png" alt="The Teeline word Attention"></figure></div>
<div class="dict-item">August: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_august.png" alt="The Teeline word August"></figure></div>
<div class="dict-item">Automatic: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_automatic.png" alt="The Teeline word Automatic"></figure></div>
<div class="dict-item">Avoid: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/avoid.png" alt="The Teeline word Avoid"></figure></div>
<div class="dict-item">Back: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_back.png" alt="The Teeline word Back"></figure></div>
<div class="dict-item">Base: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_base.png" alt="The Teeline word Base"></figure></div>
<div class="dict-item">Be: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_be.png" alt="The Teeline word Be"></figure></div>
<div class="dict-item">Beaker: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_beaker.png" alt="The Teeline word Beaker"></figure></div>
<div class="dict-item">Beauty: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_beauty.png" alt="The Teeline word Beauty"></figure></div>
<div class="dict-item">Bed: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_bed.png" alt="The Teeline word Bed"></figure></div>
<div class="dict-item">Been: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_be.png" alt="The Teeline word Been (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_been2.png" alt="The Teeline word Been (version 2)"></figure></div>
<div class="dict-item">Before: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_before.png" alt="The Teeline word Before"></figure></div>
<div class="dict-item">Began: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_began.png" alt="The Teeline word Began"></figure></div>
<div class="dict-item">Begin: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_began.png" alt="The Teeline word Begin"></figure></div>
<div class="dict-item">Behind: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_behind.png" alt="The Teeline word Behind"></figure></div>
<div class="dict-item">Best: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_best.png" alt="The Teeline word Best"></figure></div>
<div class="dict-item">Better: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_better.png" alt="The Teeline word Better"></figure></div>
<div class="dict-item">Between: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_between.png" alt="The Teeline word Between"></figure></div>
<div class="dict-item">Big: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_big.png" alt="The Teeline word Big"></figure></div>
<div class="dict-item">Biochemistry: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_biochemistry.png" alt="The Teeline word Biochemistry"></figure></div>
<div class="dict-item">Biology: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_biology.png" alt="The Teeline word Biology"></figure></div>
<div class="dict-item">Bird: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_bird.png" alt="The Teeline word Bird"></figure></div>
<div class="dict-item">Black: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_black.png" alt="The Teeline word Black"></figure></div>
<div class="dict-item">Blue: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_blue.png" alt="The Teeline word Blue"></figure></div>
<div class="dict-item">Boat: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_boat.png" alt="The Teeline word Boat"></figure></div>
<div class="dict-item">Body: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_body.png" alt="The Teeline word Body"></figure></div>
<div class="dict-item">Book: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_book.png" alt="The Teeline word Book"></figure></div>
<div class="dict-item">Both: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_both.png" alt="The Teeline word Both"></figure></div>
<div class="dict-item">Box: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_box.png" alt="The Teeline word Box"></figure></div>
<div class="dict-item">Boy: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_boy.png" alt="The Teeline word Boy"></figure></div>
<div class="dict-item">Bread: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_bread.png" alt="The Teeline word Bread"></figure></div>
<div class="dict-item">Bring: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_bring.png" alt="The Teeline word Bring"></figure></div>
<div class="dict-item">Brought: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_brought.png" alt="The Teeline word Brought"></figure></div>
<div class="dict-item">Build: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_build.png" alt="The Teeline word Build"></figure></div>
<div class="dict-item">Bursting: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/bursting.png" alt="The Teeline word Bursting"></figure></div>
<div class="dict-item">Business: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_business.png" alt="The Teeline word Business"></figure></div>
<div class="dict-item">Busy: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_busy.png" alt="The Teeline word Busy"></figure></div>
<div class="dict-item">But: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_but.png" alt="The Teeline word But"></figure></div>
<div class="dict-item">Buy: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_by.png" alt="The Teeline word Buy"></figure></div>
<div class="dict-item">By: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_by.png" alt="The Teeline word By"></figure></div>
<div class="dict-item">Call: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_call.png" alt="The Teeline word Call"></figure></div>
<div class="dict-item">Came: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_came.png" alt="The Teeline word Came"></figure></div>
<div class="dict-item">Campaign: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/campaign.png" alt="The Teeline word Campaign"></figure></div>
<div class="dict-item">Can: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_can.png" alt="The Teeline word Can"></figure></div>
<div class="dict-item">Car: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_car.png" alt="The Teeline word Car"></figure></div>
<div class="dict-item">Care: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_car.png" alt="The Teeline word Care"></figure></div>
<div class="dict-item">Carry: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_carry.png" alt="The Teeline word Carry"></figure></div>
<div class="dict-item">Cat: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_cut.png" alt="The Teeline word Cat"></figure></div>
<div class="dict-item">Cause: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_cause.png" alt="The Teeline word Cause"></figure></div>
<div class="dict-item">Cell: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_call.png" alt="The Teeline word Cell"></figure></div>
<div class="dict-item">Center: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_center.png" alt="The Teeline word Center"></figure></div>
<div class="dict-item">Centimeter: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_centimeter.png" alt="The Teeline word Centimeter"></figure></div>
<div class="dict-item">Certain: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_certain.png" alt="The Teeline word Certain"></figure></div>
<div class="dict-item">Change: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_change.png" alt="The Teeline word Change"></figure></div>
<div class="dict-item">Chapter: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/chapter.png" alt="The Teeline word Chapter"></figure></div>
<div class="dict-item">Check: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_check.png" alt="The Teeline word Check"></figure></div>
<div class="dict-item">Chemical: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_chemical.png" alt="The Teeline word Chemical"></figure></div>
<div class="dict-item">Chemistry: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_chemistry.png" alt="The Teeline word Chemistry"></figure></div>
<div class="dict-item">Children: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_children.png" alt="The Teeline word Children"></figure></div>
<div class="dict-item">City: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_city.png" alt="The Teeline word City"></figure></div>
<div class="dict-item">Class: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_class.png" alt="The Teeline word Class"></figure></div>
<div class="dict-item">Clear: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_clear.png" alt="The Teeline word Clear"></figure></div>
<div class="dict-item">Climate: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_climate.png" alt="The Teeline word Climate"></figure></div>
<div class="dict-item">Close: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_class.png" alt="The Teeline word Close"></figure></div>
<div class="dict-item">Cold: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_cold.png" alt="The Teeline word Cold"></figure></div>
<div class="dict-item">Come: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_come.png" alt="The Teeline word Come"></figure></div>
<div class="dict-item">Common: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_common.png" alt="The Teeline word Common"></figure></div>
<div class="dict-item">Communication: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_communication.png" alt="The Teeline word Communication"></figure></div>
<div class="dict-item">Complete: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_complete.png" alt="The Teeline word Complete"></figure></div>
<div class="dict-item">Contain: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_contain.png" alt="The Teeline word Contain"></figure></div>
<div class="dict-item">Control: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_control.png" alt="The Teeline word Control"></figure></div>
<div class="dict-item">Convenient: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_convenient.png" alt="The Teeline word Convenient"></figure></div>
<div class="dict-item">Convenience: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_convenience.png" alt="The Teeline word Convenience"></figure></div>
<div class="dict-item">Correct: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_correct.png" alt="The Teeline word Correct"></figure></div>
<div class="dict-item">Could: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_could.png" alt="The Teeline word Could"></figure></div>
<div class="dict-item">Country: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_country.png" alt="The Teeline word Country"></figure></div>
<div class="dict-item">Course: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_course.png" alt="The Teeline word Course"></figure></div>
<div class="dict-item">Cover: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_cover.png" alt="The Teeline word Cover"></figure></div>
<div class="dict-item">Criticism: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/criticism.png" alt="The Teeline word Criticism"></figure></div>
<div class="dict-item">Cross: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_course.png" alt="The Teeline word Cross"></figure></div>
<div class="dict-item">Cry: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_cry.png" alt="The Teeline word Cry"></figure></div>
<div class="dict-item">Cut: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_cut.png" alt="The Teeline word Cut"></figure></div>
<div class="dict-item">Dark: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_dark.png" alt="The Teeline word Dark"></figure></div>
<div class="dict-item">Data: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_data.png" alt="The Teeline word Data"></figure></div>
<div class="dict-item">Datum: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_datum.png" alt="The Teeline word Datum"></figure></div>
<div class="dict-item">Day: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_day1.png" alt="The Teeline word Day (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_day2.png" alt="The Teeline word Day (version 2)"></figure></div>
<div class="dict-item">December: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_december.png" alt="The Teeline word December"></figure></div>
<div class="dict-item">Decide: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_decide.png" alt="The Teeline word Decide"></figure></div>
<div class="dict-item">Deep: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_deep.png" alt="The Teeline word Deep"></figure></div>
<div class="dict-item">Deserve: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/deserve.png" alt="The Teeline word Deserve"></figure></div>
<div class="dict-item">Develop: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_develop.png" alt="The Teeline word Develop"></figure></div>
<div class="dict-item">Determined: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/determined.png" alt="The Teeline word Determined"></figure></div>
<div class="dict-item">Did: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_did.png" alt="The Teeline word Did"></figure></div>
<div class="dict-item">Differ: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_differ.png" alt="The Teeline word Differ"></figure></div>
<div class="dict-item">Difference: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_difference.png" alt="The Teeline word Difference"></figure></div>
<div class="dict-item">Different: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_different.png" alt="The Teeline word Different"></figure></div>
<div class="dict-item">Direct: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_direct.png" alt="The Teeline word Direct"></figure></div>
<div class="dict-item">Diversified: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/09/diversified.png" alt="The Teeline word Diversified"></figure></div>
<div class="dict-item">Do: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_day1.png" alt="The Teeline word Do"></figure></div>
<div class="dict-item">Does: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_does.png" alt="The Teeline word Does"></figure></div>
<div class="dict-item">Dog: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_dog.png" alt="The Teeline word Dog"></figure></div>
<div class="dict-item">Don&#8217;t: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_dont.png" alt="The Teeline word Don't"></figure></div>
<div class="dict-item">Done: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_done.png" alt="The Teeline word Done"></figure></div>
<div class="dict-item">Door: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_door.png" alt="The Teeline word Door"></figure></div>
<div class="dict-item">Down: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_down.png" alt="The Teeline word Down"></figure></div>
<div class="dict-item">Draw: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_draw.png" alt="The Teeline word Draw"></figure></div>
<div class="dict-item">Drive: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_drive.png" alt="The Teeline word Drive"></figure></div>
<div class="dict-item">Dry: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_dry.png" alt="The Teeline word Dry"></figure></div>
<div class="dict-item">During: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_during.png" alt="The Teeline word During"></figure></div>
<div class="dict-item">Each: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_each.png" alt="The Teeline word Each"></figure></div>
<div class="dict-item">Early: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_early.png" alt="The Teeline word Early"></figure></div>
<div class="dict-item">Earth: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_earth.png" alt="The Teeline word Earth"></figure></div>
<div class="dict-item">Ease: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_ease.png" alt="The Teeline word Ease"></figure></div>
<div class="dict-item">East: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_east.png" alt="The Teeline word East"></figure></div>
<div class="dict-item">Easy: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_easy.png" alt="The Teeline word Easy"></figure></div>
<div class="dict-item">Eat: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_eat.png" alt="The Teeline word Eat"></figure></div>
<div class="dict-item">Eight: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_eight.png" alt="The Teeline word Eight"></figure></div>
<div class="dict-item">Electricity: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_electricity.png" alt="The Teeline word Electricity"></figure></div>
<div class="dict-item">Electronic: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_electronic.png" alt="The Teeline word Electronic"></figure></div>
<div class="dict-item">Element: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_element.png" alt="The Teeline word Element"></figure></div>
<div class="dict-item">E-mail: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/e-mail.png" alt="The Teeline word e-Mail"></figure></div>
<div class="dict-item">End: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_end.png" alt="The Teeline word End"></figure></div>
<div class="dict-item">Energy: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_energy.png" alt="The Teeline word Energy"></figure></div>
<div class="dict-item">Engagement: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_engagement.png" alt="The Teeline word Engagement"></figure></div>
<div class="dict-item">Enough: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_enough.png" alt="The Teeline word Enough"></figure></div>
<div class="dict-item">Equal: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_equal.png" alt="The Teeline word Equal"></figure></div>
<div class="dict-item">Even: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_even.png" alt="The Teeline word Even"></figure></div>
<div class="dict-item">Ever: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/10/ever.png" alt="The Teeline word Ever"></figure></div>
<div class="dict-item">Every: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/10/every.png" alt="The Teeline word Every"></figure></div>
<div class="dict-item">Everyone: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/10/everyone.png" alt="The Teeline word Everyone"></figure></div>
<div class="dict-item">Everything: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/10/everything.png" alt="The Teeline word Everything"></figure></div>
<div class="dict-item">Evolution: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_evolution.png" alt="The Teeline word Evolution"></figure></div>
<div class="dict-item">Examination: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_examination.png" alt="The Teeline word Examination"></figure></div>
<div class="dict-item">Example: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_example.png" alt="The Teeline word Example"></figure></div>
<div class="dict-item">Experiment: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_experiment.png" alt="The Teeline word Experiment"></figure></div>
<div class="dict-item">Eye: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_i.png" alt="The Teeline word Eye"></figure></div>
<div class="dict-item">Face: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_face.png" alt="The Teeline word Face"></figure></div>
<div class="dict-item">Fact: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_fact.png" alt="The Teeline word Fact"></figure></div>
<div class="dict-item">Fall: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_fall.png" alt="The Teeline word Fall"></figure></div>
<div class="dict-item">Family: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_family1.png" alt="The Teeline word Family (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_family2.png" alt="The Teeline word Family (version 2)"></figure></div>
<div class="dict-item">Far: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_for.png" alt="The Teeline word Far"></figure></div>
<div class="dict-item">Farm: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_farm.png" alt="The Teeline word Farm"></figure></div>
<div class="dict-item">Farther: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_farther.png" alt="The Teeline word Farther"></figure></div>
<div class="dict-item">Fast: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_fast.png" alt="The Teeline word Fast"></figure></div>
<div class="dict-item">Fat: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_foot.png" alt="The Teeline word Fat"></figure></div>
<div class="dict-item">Father: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_father.png" alt="The Teeline word Father"></figure></div>
<div class="dict-item">February: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_february.png" alt="The Teeline word February"></figure></div>
<div class="dict-item">Feel: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_fall.png" alt="The Teeline word Feel"></figure></div>
<div class="dict-item">Feet: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_foot.png" alt="The Teeline word Feet"></figure></div>
<div class="dict-item">Few: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_few.png" alt="The Teeline word Few"></figure></div>
<div class="dict-item">Field: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_field.png" alt="The Teeline word Field"></figure></div>
<div class="dict-item">Figure: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_figure.png" alt="The Teeline word Figure"></figure></div>
<div class="dict-item">Fill: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_fall.png" alt="The Teeline word Fill"></figure></div>
<div class="dict-item">Final: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_final1.png" alt="The Teeline word Final (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_final2.png" alt="The Teeline word Final (version 2)"></figure></div>
<div class="dict-item">Find: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_find.png" alt="The Teeline word Find"></figure></div>
<div class="dict-item">Fine: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_fine.png" alt="The Teeline word Fine"></figure></div>
<div class="dict-item">Fire: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_fire.png" alt="The Teeline word Fire"></figure></div>
<div class="dict-item">Firm: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_firm.png" alt="The Teeline word Firm"></figure></div>
<div class="dict-item">First: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_first.png" alt="The Teeline word First"></figure></div>
<div class="dict-item">Fish: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_fish.png" alt="The Teeline word Fish"></figure></div>
<div class="dict-item">Five: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_five.png" alt="The Teeline word Five"></figure></div>
<div class="dict-item">Flask: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_flask.png" alt="The Teeline word Flask"></figure></div>
<div class="dict-item">Fly: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_fly.png" alt="The Teeline word Fly"></figure></div>
<div class="dict-item">Follow: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_follow.png" alt="The Teeline word Follow"></figure></div>
<div class="dict-item">Food: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_food.png" alt="The Teeline word Food"></figure></div>
<div class="dict-item">Foot: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_foot.png" alt="The Teeline word Foot"></figure></div>
<div class="dict-item">For: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_for.png" alt="The Teeline word For"></figure></div>
<div class="dict-item">Force: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_force.png" alt="The Teeline word Force"></figure></div>
<div class="dict-item">Form: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_form.png" alt="The Teeline word Form"></figure></div>
<div class="dict-item">Found: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_find.png" alt="The Teeline word Found"></figure></div>
<div class="dict-item">Four: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_four.png" alt="The Teeline word Four"></figure></div>
<div class="dict-item">Free: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_free.png" alt="The Teeline word Free"></figure></div>
<div class="dict-item">Friday: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_friday.png" alt="The Teeline word Friday"></figure></div>
<div class="dict-item">Friend: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_friend.png" alt="The Teeline word Friend"></figure></div>
<div class="dict-item">From: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_from.png" alt="The Teeline word From"></figure></div>
<div class="dict-item">Front: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_friend.png" alt="The Teeline word Front"></figure></div>
<div class="dict-item">Full: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_fall.png" alt="The Teeline word Full"></figure></div>
<div class="dict-item">Funnel: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_funnel1.png" alt="The Teeline word Funnel (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_funnel2.png" alt="The Teeline word Funnel (version 2)"></figure></div>
<div class="dict-item">Further: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_further.png" alt="The Teeline word Further"></figure></div>
<div class="dict-item">Game: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_game.png" alt="The Teeline word Game"></figure></div>
<div class="dict-item">Gave: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_give.png" alt="The Teeline word Gave"></figure></div>
<div class="dict-item">General: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_general.png" alt="The Teeline word General"></figure></div>
<div class="dict-item">Genetics: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_genetics.png" alt="The Teeline word Genetics"></figure></div>
<div class="dict-item">Geology: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_geology.png" alt="The Teeline word Geology"></figure></div>
<div class="dict-item">Get: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_get.png" alt="The Teeline word Get"></figure></div>
<div class="dict-item">Girl: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_girl.png" alt="The Teeline word Girl"></figure></div>
<div class="dict-item">Give: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_give.png" alt="The Teeline word Give"></figure></div>
<div class="dict-item">Go: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_go.png" alt="The Teeline word Go"></figure></div>
<div class="dict-item">Gold: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_gold.png" alt="The Teeline word Gold"></figure></div>
<div class="dict-item">Good: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_get.png" alt="The Teeline word Good"></figure></div>
<div class="dict-item">Got: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_get.png" alt="The Teeline word Got"></figure></div>
<div class="dict-item">Govern: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_govern.png" alt="The Teeline word Govern"></figure></div>
<div class="dict-item">Government: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_government.png" alt="The Teeline word Government"></figure></div>
<div class="dict-item">Gram: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_go.png" alt="The Teeline word Gram"></figure></div>
<div class="dict-item">Graph: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_graph.png" alt="The Teeline word Graph"></figure></div>
<div class="dict-item">Gravity: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_gravity.png" alt="The Teeline word Gravity"></figure></div>
<div class="dict-item">Great: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_great.png" alt="The Teeline word Great"></figure></div>
<div class="dict-item">Green: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_green.png" alt="The Teeline word Green"></figure></div>
<div class="dict-item">Grew: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_grow.png" alt="The Teeline word Grew"></figure></div>
<div class="dict-item">Grid: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_grid.png" alt="The Teeline word Grid"></figure></div>
<div class="dict-item">Grind: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_ground.png" alt="The Teeline word Grind"></figure></div>
<div class="dict-item">Ground: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_ground.png" alt="The Teeline word Ground"></figure></div>
<div class="dict-item">Group: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_group.png" alt="The Teeline word Group"></figure></div>
<div class="dict-item">Grow: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_grow.png" alt="The Teeline word Grow"></figure></div>
<div class="dict-item">Had: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_had1.png" alt="The Teeline word Had (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_had2.png" alt="The Teeline word Had (version 2)"></figure></div>
<div class="dict-item">Half: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_half.png" alt="The Teeline word Half"></figure></div>
<div class="dict-item">Hand: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_hand.png" alt="The Teeline word Hand"></figure></div>
<div class="dict-item">Happen: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_happen.png" alt="The Teeline word Happen"></figure></div>
<div class="dict-item">Hard: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_hard.png" alt="The Teeline word Hard"></figure></div>
<div class="dict-item">Has: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_has.png" alt="The Teeline word Has"></figure></div>
<div class="dict-item">Have: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_have.png" alt="The Teeline word Have"></figure></div>
<div class="dict-item">He: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_he.png" alt="The Teeline word He"></figure></div>
<div class="dict-item">Head: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_had1.png" alt="The Teeline word Head"></figure></div>
<div class="dict-item">Health: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_health.png" alt="The Teeline word Health"></figure></div>
<div class="dict-item">Hear: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_here.png" alt="The Teeline word Hear"></figure></div>
<div class="dict-item">Heard: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_heard.png" alt="The Teeline word Heard"></figure></div>
<div class="dict-item">Heat: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_had1.png" alt="The Teeline word Heat"></figure></div>
<div class="dict-item">Held: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_hold.png" alt="The Teeline word Held"></figure></div>
<div class="dict-item">Help: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_help.png" alt="The Teeline word Help"></figure></div>
<div class="dict-item">Her: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_here.png" alt="The Teeline word Her"></figure></div>
<div class="dict-item">Here: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_here.png" alt="The Teeline word Here"></figure></div>
<div class="dict-item">Hers: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_hers.png" alt="The Teeline word Hers"></figure></div>
<div class="dict-item">Herself: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_herself.png" alt="The Teeline word Herself"></figure></div>
<div class="dict-item">Hi: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_high.png" alt="The Teeline word Hi"></figure></div>
<div class="dict-item">High: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_high.png" alt="The Teeline word High"></figure></div>
<div class="dict-item">Him: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_him.png" alt="The Teeline word Him"></figure></div>
<div class="dict-item">Himself: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_himself.png" alt="The Teeline word Himself"></figure></div>
<div class="dict-item">His: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_his.png" alt="The Teeline word His"></figure></div>
<div class="dict-item">Hold: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_hold.png" alt="The Teeline word Hold"></figure></div>
<div class="dict-item">Hole: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_whole.png" alt="The Teeline word Hole"></figure></div>
<div class="dict-item">Home: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_him.png" alt="The Teeline word Home"></figure></div>
<div class="dict-item">Horse: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_hers.png" alt="The Teeline word Horse"></figure></div>
<div class="dict-item">Hot: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_had1.png" alt="The Teeline word Hot"></figure></div>
<div class="dict-item">Hour: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_here.png" alt="The Teeline word Hour"></figure></div>
<div class="dict-item">Hundred: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_hundred1.png" alt="The Teeline word Hundred (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_hundred2.png" alt="The Teeline word Hundred (version 2)"></figure></div>
<div class="dict-item">Hypothesis: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_hypothesis.png" alt="The Teeline word Hypothesis"></figure></div>
<div class="dict-item">I: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_i.png" alt="The Teeline word I"></figure></div>
<div class="dict-item">Idea: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_idea.png" alt="The Teeline word Idea"></figure></div>
<div class="dict-item">If: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_if.png" alt="The Teeline word If"></figure></div>
<div class="dict-item">Immediate: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_immediate.png" alt="The Teeline word Immediate"></figure></div>
<div class="dict-item">Implementation: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_implementation.png" alt="The Teeline word Implementation"></figure></div>
<div class="dict-item">Important: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_important.png" alt="The Teeline word Important"></figure></div>
<div class="dict-item">Improving: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/improving.png" alt="The Teeline word Improving"></figure></div>
<div class="dict-item">In: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_in.png" alt="The Teeline word In"></figure></div>
<div class="dict-item">Inch: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_inch.png" alt="The Teeline word Inch"></figure></div>
<div class="dict-item">Inconvenient: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_inconvenient.png" alt="The Teeline word Inconvenient"></figure></div>
<div class="dict-item">Individual: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_individual.png" alt="The Teeline word Individual"></figure></div>
<div class="dict-item">Interest: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_interest.png" alt="The Teeline word Interest"></figure></div>
<div class="dict-item">Is: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_is.png" alt="The Teeline word Is"></figure></div>
<div class="dict-item">Island: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_island.png" alt="The Teeline word Island"></figure></div>
<div class="dict-item">It: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_it.png" alt="The Teeline word It"></figure></div>
<div class="dict-item">January: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_january1.png" alt="The Teeline word January (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_january2.png" alt="The Teeline word January (version 2)"></figure></div>
<div class="dict-item">Jesus: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/jesus.png" alt="The Teeline word Jesus"></figure></div>
<div class="dict-item">July: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_july.png" alt="The Teeline word July"></figure></div>
<div class="dict-item">June: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_june.png" alt="The Teeline word June"></figure></div>
<div class="dict-item">Just: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_just.png" alt="The Teeline word Just"></figure></div>
<div class="dict-item">Keep: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_keep.png" alt="The Teeline word Keep"></figure></div>
<div class="dict-item">Kilogram: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_kilogram.png" alt="The Teeline word Kilogram"></figure></div>
<div class="dict-item">Kilometer: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_kilometer.png" alt="The Teeline word Kilometer"></figure></div>
<div class="dict-item">Kind: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_kind.png" alt="The Teeline word Kind"></figure></div>
<div class="dict-item">King: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_king.png" alt="The Teeline word King"></figure></div>
<div class="dict-item">Knew: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_knew.png" alt="The Teeline word Knew"></figure></div>
<div class="dict-item">Know: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_know.png" alt="The Teeline word Know"></figure></div>
<div class="dict-item">Lab: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_lab.png" alt="The Teeline word Lab"></figure></div>
<div class="dict-item">Land: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_land.png" alt="The Teeline word Land"></figure></div>
<div class="dict-item">Language: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_language.png" alt="The Teeline word Language"></figure></div>
<div class="dict-item">Large: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_large.png" alt="The Teeline word Large"></figure></div>
<div class="dict-item">Last: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_last.png" alt="The Teeline word Last"></figure></div>
<div class="dict-item">Late: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_late.png" alt="The Teeline word Late"></figure></div>
<div class="dict-item">Laugh: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_laugh.png" alt="The Teeline word Laugh"></figure></div>
<div class="dict-item">Law: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_low.png" alt="The Teeline word Law"></figure></div>
<div class="dict-item">Lay: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_lay.png" alt="The Teeline word Lay"></figure></div>
<div class="dict-item">Lead: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_late.png" alt="The Teeline word Lead"></figure></div>
<div class="dict-item">Learn: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_learn.png" alt="The Teeline word Learn"></figure></div>
<div class="dict-item">Leave: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_leave.png" alt="The Teeline word Leave"></figure></div>
<div class="dict-item">Left: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_left.png" alt="The Teeline word Left"></figure></div>
<div class="dict-item">Less: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_less.png" alt="The Teeline word Less"></figure></div>
<div class="dict-item">Let: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_late.png" alt="The Teeline word Let"></figure></div>
<div class="dict-item">Letter: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_letter.png" alt="The Teeline word Letter"></figure></div>
<div class="dict-item">Lie: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_lie.png" alt="The Teeline word Lie"></figure></div>
<div class="dict-item">Life: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_laugh.png" alt="The Teeline word Life"></figure></div>
<div class="dict-item">Light: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_late.png" alt="The Teeline word Light"></figure></div>
<div class="dict-item">Like: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_like.png" alt="The Teeline word Like"></figure></div>
<div class="dict-item">Line: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_line.png" alt="The Teeline word Line"></figure></div>
<div class="dict-item">List: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_last.png" alt="The Teeline word List"></figure></div>
<div class="dict-item">Listen: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_listen.png" alt="The Teeline word Listen"></figure></div>
<div class="dict-item">Liter: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_liter.png" alt="The Teeline word Liter"></figure></div>
<div class="dict-item">Little: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_little.png" alt="The Teeline word Little"></figure></div>
<div class="dict-item">Live: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_love.png" alt="The Teeline word Live"></figure></div>
<div class="dict-item">Long: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_long.png" alt="The Teeline word Long"></figure></div>
<div class="dict-item">Look: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_like.png" alt="The Teeline word Look"></figure></div>
<div class="dict-item">Lost: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_last.png" alt="The Teeline word Lost"></figure></div>
<div class="dict-item">Lot: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_late.png" alt="The Teeline word Lot"></figure></div>
<div class="dict-item">Love: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_love.png" alt="The Teeline word Love"></figure></div>
<div class="dict-item">Low: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_low.png" alt="The Teeline word Low"></figure></div>
<div class="dict-item">Machine: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_machine.png" alt="The Teeline word Machine"></figure></div>
<div class="dict-item">Made: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_made.png" alt="The Teeline word Made"></figure></div>
<div class="dict-item">Main: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_main.png" alt="The Teeline word Main"></figure></div>
<div class="dict-item">Make: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_make.png" alt="The Teeline word Make"></figure></div>
<div class="dict-item">Man: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_main.png" alt="The Teeline word Man"></figure></div>
<div class="dict-item">Many: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_money.png" alt="The Teeline word Many"></figure></div>
<div class="dict-item">Map: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_map.png" alt="The Teeline word Map"></figure></div>
<div class="dict-item">March: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_march.png" alt="The Teeline word March"></figure></div>
<div class="dict-item">Mark: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_mark.png" alt="The Teeline word Mark"></figure></div>
<div class="dict-item">Mass: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_miss.png" alt="The Teeline word Mass"></figure></div>
<div class="dict-item">Matter: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_matter.png" alt="The Teeline word Matter"></figure></div>
<div class="dict-item">Maximum: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_maximum.png" alt="The Teeline word Maximum"></figure></div>
<div class="dict-item">May: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_may.png" alt="The Teeline word May"></figure></div>
<div class="dict-item">Me: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_me.png" alt="The Teeline word Me"></figure></div>
<div class="dict-item">Mean: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_main.png" alt="The Teeline word Mean"></figure></div>
<div class="dict-item">Measure: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_measure.png" alt="The Teeline word Measure"></figure></div>
<div class="dict-item">Media: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_media.png" alt="The Teeline word Media"></figure></div>
<div class="dict-item">Member: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_member.png" alt="The Teeline word Member"></figure></div>
<div class="dict-item">Men: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_men.png" alt="The Teeline word Men"></figure></div>
<div class="dict-item">Met: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_might.png" alt="The Teeline word Met"></figure></div>
<div class="dict-item">Meter: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_meter.png" alt="The Teeline word Meter"></figure></div>
<div class="dict-item">Microscope: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_microscope.png" alt="The Teeline word Microscope"></figure></div>
<div class="dict-item">Might: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_might.png" alt="The Teeline word Might"></figure></div>
<div class="dict-item">Mile: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_mile1.png" alt="The Teeline word Mile (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_mile2.png" alt="The Teeline word Mile (version 2)"></figure></div>
<div class="dict-item">Milliliter: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_milliliter.png" alt="The Teeline word Milliliter"></figure></div>
<div class="dict-item">Millimeter: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_millimeter.png" alt="The Teeline word Millimeter"></figure></div>
<div class="dict-item">Million: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_million1.png" alt="The Teeline word Million (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_million2.png" alt="The Teeline word Million (version 2)"></figure></div>
<div class="dict-item">Mind: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_mind.png" alt="The Teeline word Mind"></figure></div>
<div class="dict-item">Mineral: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_mineral.png" alt="The Teeline word Mineral"></figure></div>
<div class="dict-item">Minimum: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_minimum.png" alt="The Teeline word Minimum"></figure></div>
<div class="dict-item">Minute: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_mind.png" alt="The Teeline word Minute"></figure></div>
<div class="dict-item">Miss: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_miss.png" alt="The Teeline word Miss"></figure></div>
<div class="dict-item">Molecule: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_molecule1.png" alt="The Teeline word Molecule (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_molecule2.png" alt="The Teeline word Molecule (version 2)"></figure></div>
<div class="dict-item">Monday: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_monday.png" alt="The Teeline word Monday"></figure></div>
<div class="dict-item">Money: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_money.png" alt="The Teeline word Money"></figure></div>
<div class="dict-item">Moon: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_main.png" alt="The Teeline word Moon"></figure></div>
<div class="dict-item">More: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_more.png" alt="The Teeline word More"></figure></div>
<div class="dict-item">Morning: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_morning.png" alt="The Teeline word Morning"></figure></div>
<div class="dict-item">Most: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_must.png" alt="The Teeline word Most"></figure></div>
<div class="dict-item">Mother: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_mother.png" alt="The Teeline word Mother"></figure></div>
<div class="dict-item">Motion: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_motion.png" alt="The Teeline word Motion"></figure></div>
<div class="dict-item">Mountain: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_mountain.png" alt="The Teeline word Mountain"></figure></div>
<div class="dict-item">Move: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_move.png" alt="The Teeline word Move"></figure></div>
<div class="dict-item">Much: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_much.png" alt="The Teeline word Much"></figure></div>
<div class="dict-item">Multiply: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_multiply.png" alt="The Teeline word Multiply"></figure></div>
<div class="dict-item">Multitude: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_multitude.png" alt="The Teeline word Multitude"></figure></div>
<div class="dict-item">Music: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_music.png" alt="The Teeline word Music"></figure></div>
<div class="dict-item">Must: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_must.png" alt="The Teeline word Must"></figure></div>
<div class="dict-item">My: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_my.png" alt="The Teeline word My"></figure></div>
<div class="dict-item">Myself: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_myself.png" alt="The Teeline word Myself"></figure></div>
<div class="dict-item">Name: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_name.png" alt="The Teeline word Name"></figure></div>
<div class="dict-item">Nation: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_nation.png" alt="The Teeline word Nation"></figure></div>
<div class="dict-item">National: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_national.png" alt="The Teeline word National"></figure></div>
<div class="dict-item">Near: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_near.png" alt="The Teeline word Near"></figure></div>
<div class="dict-item">Necessary: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_necessary.png" alt="The Teeline word Necessary"></figure></div>
<div class="dict-item">Need: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_need.png" alt="The Teeline word Need"></figure></div>
<div class="dict-item">Never: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_never.png" alt="The Teeline word Never"></figure></div>
<div class="dict-item">New: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_knew.png" alt="The Teeline word New"></figure></div>
<div class="dict-item">Next: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_next.png" alt="The Teeline word Next"></figure></div>
<div class="dict-item">Night: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_note.png" alt="The Teeline word Night"></figure></div>
<div class="dict-item">Nine: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_nine.png" alt="The Teeline word Nine"></figure></div>
<div class="dict-item">No: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_number.png" alt="The Teeline word No"></figure></div>
<div class="dict-item">North: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_north.png" alt="The Teeline word North"></figure></div>
<div class="dict-item">Not: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_note.png" alt="The Teeline word Not"></figure></div>
<div class="dict-item">Note: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_note.png" alt="The Teeline word Note"></figure></div>
<div class="dict-item">Nothing: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_nothing.png" alt="The Teeline word Nothing"></figure></div>
<div class="dict-item">Notice: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_notice.png" alt="The Teeline word Notice"></figure></div>
<div class="dict-item">Noun: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_noun.png" alt="The Teeline word Noun"></figure></div>
<div class="dict-item">November: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_november.png" alt="The Teeline word November"></figure></div>
<div class="dict-item">Now: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_now.png" alt="The Teeline word Now"></figure></div>
<div class="dict-item">Number: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_number.png" alt="The Teeline word Number"></figure></div>
<div class="dict-item">Numeral: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_numeral1.png" alt="The Teeline word Numeral (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_numeral2.png" alt="The Teeline word Numeral (version 2)"></figure></div>
<div class="dict-item">Object: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_object.png" alt="The Teeline word Object"></figure></div>
<div class="dict-item">Observe: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_observe.png" alt="The Teeline word Observe"></figure></div>
<div class="dict-item">October: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_october.png" alt="The Teeline word October"></figure></div>
<div class="dict-item">Of: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_of.png" alt="The Teeline word Of"></figure></div>
<div class="dict-item">Off: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_off.png" alt="The Teeline word Off"></figure></div>
<div class="dict-item">Often: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_often.png" alt="The Teeline word Often"></figure></div>
<div class="dict-item">Oh: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_oh.png" alt="The Teeline word Oh"></figure></div>
<div class="dict-item">Old: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_old.png" alt="The Teeline word Old"></figure></div>
<div class="dict-item">On: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_on.png" alt="The Teeline word On"></figure></div>
<div class="dict-item">Once: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_once.png" alt="The Teeline word Once"></figure></div>
<div class="dict-item">One: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_one.png" alt="The Teeline number One (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_number_one2.png" alt="The Teeline number One (version 2)"></figure></div>
<div class="dict-item">Only: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_only.png" alt="The Teeline word Only"></figure></div>
<div class="dict-item">Open: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_open.png" alt="The Teeline word Open"></figure></div>
<div class="dict-item">Or: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_or.png" alt="The Teeline word Or"></figure></div>
<div class="dict-item">Order: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_order.png" alt="The Teeline word Order"></figure></div>
<div class="dict-item">Organism: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_organism.png" alt="The Teeline word Organism"></figure></div>
<div class="dict-item">Other: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_other.png" alt="The Teeline word Other"></figure></div>
<div class="dict-item">Our: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_our.png" alt="The Teeline word Our"></figure></div>
<div class="dict-item">Ourselves: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_ourselves.png" alt="The Teeline word Ourselves"></figure></div>
<div class="dict-item">Out: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_out.png" alt="The Teeline word Out"></figure></div>
<div class="dict-item">Over: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_over.png" alt="The Teeline word Over"></figure></div>
<div class="dict-item">Overdue: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_overdue.png" alt="The Teeline word Overdue"></figure></div>
<div class="dict-item">Overlook: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_overlook.png" alt="The Teeline word Overlook"></figure></div>
<div class="dict-item">Own: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_own.png" alt="The Teeline word Own"></figure></div>
<div class="dict-item">Page: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_page.png" alt="The Teeline word Page"></figure></div>
<div class="dict-item">Paid: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_put.png" alt="The Teeline word Paid"></figure></div>
<div class="dict-item">Paleontology: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_paleontology.png" alt="The Teeline word Paleontology"></figure></div>
<div class="dict-item">Paper: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_paper.png" alt="The Teeline word Paper"></figure></div>
<div class="dict-item">Part: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_part.png" alt="The Teeline word Part"></figure></div>
<div class="dict-item">Particle: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_particle.png" alt="The Teeline word Particle"></figure></div>
<div class="dict-item">Pass: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_pass.png" alt="The Teeline word Pass"></figure></div>
<div class="dict-item">Pattern: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_pattern.png" alt="The Teeline word Pattern"></figure></div>
<div class="dict-item">People: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_people.png" alt="The Teeline word People"></figure></div>
<div class="dict-item">Percent: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_percent.png" alt="The Teeline word Percent"></figure></div>
<div class="dict-item">Perhaps: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_purpose.png" alt="The Teeline word Perhaps"></figure></div>
<div class="dict-item">Person: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_person.png" alt="The Teeline word Person"></figure></div>
<div class="dict-item">Phase: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_phase.png" alt="The Teeline word Phase"></figure></div>
<div class="dict-item">Physics: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_physics.png" alt="The Teeline word Physics"></figure></div>
<div class="dict-item">Picture: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_picture.png" alt="The Teeline word Picture"></figure></div>
<div class="dict-item">Piece: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_piece.png" alt="The Teeline word Piece"></figure></div>
<div class="dict-item">Place: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_place.png" alt="The Teeline word Place"></figure></div>
<div class="dict-item">Plain: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_plain.png" alt="The Teeline word Plain"></figure></div>
<div class="dict-item">Plan: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_plain.png" alt="The Teeline word Plan"></figure></div>
<div class="dict-item">Plane: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_plain.png" alt="The Teeline word Plane"></figure></div>
<div class="dict-item">Plant: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_plant.png" alt="The Teeline word Plant"></figure></div>
<div class="dict-item">Play: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_play.png" alt="The Teeline word Play"></figure></div>
<div class="dict-item">Point: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_point.png" alt="The Teeline word Point"></figure></div>
<div class="dict-item">Pond: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_point.png" alt="The Teeline word Pond"></figure></div>
<div class="dict-item">Port: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_part.png" alt="The Teeline word Port"></figure></div>
<div class="dict-item">Pose: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_pass.png" alt="The Teeline word Pose"></figure></div>
<div class="dict-item">Possible: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_possible.png" alt="The Teeline word Possible"></figure></div>
<div class="dict-item">Pound: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_point.png" alt="The Teeline word Pound"></figure></div>
<div class="dict-item">Power: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_power.png" alt="The Teeline word Power"></figure></div>
<div class="dict-item">Preparation: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_preparation.png" alt="The Teeline word Preparation"></figure></div>
<div class="dict-item">Prepare: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_prepare.png" alt="The Teeline word Prepare"></figure></div>
<div class="dict-item">Press: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_press.png" alt="The Teeline word Press"></figure></div>
<div class="dict-item">Problem: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_problem.png" alt="The Teeline word Problem"></figure></div>
<div class="dict-item">Produce: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_produce.png" alt="The Teeline word Produce"></figure></div>
<div class="dict-item">Product: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_product.png" alt="The Teeline word Product"></figure></div>
<div class="dict-item">Public: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_public.png" alt="The Teeline word Public"></figure></div>
<div class="dict-item">Pull: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_pull.png" alt="The Teeline word Pull"></figure></div>
<div class="dict-item">Purple: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_purple.png" alt="The Teeline word Purple"></figure></div>
<div class="dict-item">Purpose: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_purpose.png" alt="The Teeline word Purpose"></figure></div>
<div class="dict-item">Put: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_put.png" alt="The Teeline word Put"></figure></div>
<div class="dict-item">Question: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_question.png" alt="The Teeline word Question"></figure></div>
<div class="dict-item">Quick: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_quick.png" alt="The Teeline word Quick"></figure></div>
<div class="dict-item">Rain: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_rain.png" alt="The Teeline word Rain"></figure></div>
<div class="dict-item">Ran: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_rain.png" alt="The Teeline word Ran"></figure></div>
<div class="dict-item">Rank: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_rank.png" alt="The Teeline word Rank"></figure></div>
<div class="dict-item">Reach: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_reach.png" alt="The Teeline word Reach"></figure></div>
<div class="dict-item">Read: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_read.png" alt="The Teeline word Read"></figure></div>
<div class="dict-item">Ready: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_ready.png" alt="The Teeline word Ready"></figure></div>
<div class="dict-item">Real: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_rule.png" alt="The Teeline word Real"></figure></div>
<div class="dict-item">Recently: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_recently.png" alt="The Teeline word Recently"></figure></div>
<div class="dict-item">Record: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_record.png" alt="The Teeline word Record"></figure></div>
<div class="dict-item">Red: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_read.png" alt="The Teeline word Red"></figure></div>
<div class="dict-item">Reference: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_reference.png" alt="The Teeline word Reference"></figure></div>
<div class="dict-item">Remember: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_remember.png" alt="The Teeline word Remember"></figure></div>
<div class="dict-item">Requirement: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_requirement.png" alt="The Teeline word Requirement"></figure></div>
<div class="dict-item">Research: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_research.png" alt="The Teeline word Research"></figure></div>
<div class="dict-item">Rest: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_rest.png" alt="The Teeline word Rest"></figure></div>
<div class="dict-item">Retort: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_retort.png" alt="The Teeline word Retort"></figure></div>
<div class="dict-item">Right: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_right.png" alt="The Teeline word Right"></figure></div>
<div class="dict-item">River: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_river.png" alt="The Teeline word River"></figure></div>
<div class="dict-item">Road: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_read.png" alt="The Teeline word Road"></figure></div>
<div class="dict-item">Rock: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_reach.png" alt="The Teeline word Rock"></figure></div>
<div class="dict-item">Room: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_room.png" alt="The Teeline word Room"></figure></div>
<div class="dict-item">Round: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_round.png" alt="The Teeline word Round"></figure></div>
<div class="dict-item">Rule: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_rule.png" alt="The Teeline word Rule"></figure></div>
<div class="dict-item">Run: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_rain.png" alt="The Teeline word Run"></figure></div>
<div class="dict-item">Run: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_rain.png" alt="The Teeline word Run"></figure></div>
<div class="dict-item">Said: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_said.png" alt="The Teeline word Said"></figure></div>
<div class="dict-item">Same: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_same.png" alt="The Teeline word Same"></figure></div>
<div class="dict-item">Saturday: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_saturday.png" alt="The Teeline word Saturday"></figure></div>
<div class="dict-item">Saw: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_saw.png" alt="The Teeline word Saw"></figure></div>
<div class="dict-item">Say: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_say.png" alt="The Teeline word Say"></figure></div>
<div class="dict-item">Scale: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_scale.png" alt="The Teeline word Scale"></figure></div>
<div class="dict-item">School: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_school.png" alt="The Teeline word School"></figure></div>
<div class="dict-item">Science: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_since.png" alt="The Teeline word Science"></figure></div>
<div class="dict-item">Scientist: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_scientist.png" alt="The Teeline word Scientist"></figure></div>
<div class="dict-item">Sea: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_see.png" alt="The Teeline word Sea"></figure></div>
<div class="dict-item">Second: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_second.png" alt="The Teeline word Second"></figure></div>
<div class="dict-item">See: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_see.png" alt="The Teeline word See"></figure></div>
<div class="dict-item">Seem: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_seem.png" alt="The Teeline word Seem"></figure></div>
<div class="dict-item">Self: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_self.png" alt="The Teeline word Self"></figure></div>
<div class="dict-item">Semicircle: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_semicircle.png" alt="The Teeline word Semicircle"></figure></div>
<div class="dict-item">Semiconductor: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_semiconductor.png" alt="The Teeline word Semiconductor"></figure></div>
<div class="dict-item">Send: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_sound.png" alt="The Teeline word Send"></figure></div>
<div class="dict-item">Sent: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_sent.png" alt="The Teeline word Sent"></figure></div>
<div class="dict-item">Sentence: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_sentence.png" alt="The Teeline word Sentence"></figure></div>
<div class="dict-item">September: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_september.png" alt="The Teeline word September"></figure></div>
<div class="dict-item">Serve: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_serve.png" alt="The Teeline word Serve"></figure></div>
<div class="dict-item">Set: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_set.png" alt="The Teeline word Set"></figure></div>
<div class="dict-item">Seven: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_seven.png" alt="The Teeline word Seven"></figure></div>
<div class="dict-item">Several: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_several.png" alt="The Teeline word Several"></figure></div>
<div class="dict-item">Shall: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_shall.png" alt="The Teeline word Shall"></figure></div>
<div class="dict-item">Shape: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_shape.png" alt="The Teeline word Shape"></figure></div>
<div class="dict-item">She: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_she.png" alt="The Teeline word She"></figure></div>
<div class="dict-item">Ship: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_shape.png" alt="The Teeline word Ship"></figure></div>
<div class="dict-item">Short: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_short.png" alt="The Teeline word Short"></figure></div>
<div class="dict-item">Should: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_should.png" alt="The Teeline word Should"></figure></div>
<div class="dict-item">Show: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_show.png" alt="The Teeline word Show"></figure></div>
<div class="dict-item">Side: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_side.png" alt="The Teeline word Side"></figure></div>
<div class="dict-item">Simple: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_simple.png" alt="The Teeline word Simple"></figure></div>
<div class="dict-item">Since: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_since.png" alt="The Teeline word Since"></figure></div>
<div class="dict-item">Sing: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_sing.png" alt="The Teeline word Sing"></figure></div>
<div class="dict-item">Sir: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_sure.png" alt="The Teeline word Sir"></figure></div>
<div class="dict-item">Sit: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_set.png" alt="The Teeline word Sit"></figure></div>
<div class="dict-item">Six: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_six.png" alt="The Teeline word Six"></figure></div>
<div class="dict-item">Size: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_size.png" alt="The Teeline word Size"></figure></div>
<div class="dict-item">Sleep: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_sleep.png" alt="The Teeline word Sleep"></figure></div>
<div class="dict-item">Slow: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_slow.png" alt="The Teeline word Slow"></figure></div>
<div class="dict-item">Small: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_small1.png" alt="The Teeline word Small (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_small2.png" alt="The Teeline word Small (version 2)"></figure></div>
<div class="dict-item">Snow: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_snow.png" alt="The Teeline word Snow"></figure></div>
<div class="dict-item">So: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_so.png" alt="The Teeline word So"></figure></div>
<div class="dict-item">Social: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_social.png" alt="The Teeline word Social"></figure></div>
<div class="dict-item">Some: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_same.png" alt="The Teeline word Some"></figure></div>
<div class="dict-item">Something: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_something.png" alt="The Teeline word Something"></figure></div>
<div class="dict-item">Song: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_song.png" alt="The Teeline word Song"></figure></div>
<div class="dict-item">Soon: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_soon.png" alt="The Teeline word Soon"></figure></div>
<div class="dict-item">Sound: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_sound.png" alt="The Teeline word Sound"></figure></div>
<div class="dict-item">South: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_south.png" alt="The Teeline word South"></figure></div>
<div class="dict-item">Special: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_special.png" alt="The Teeline word Special"></figure></div>
<div class="dict-item">Spell: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_spell.png" alt="The Teeline word Spell"></figure></div>
<div class="dict-item">Stand: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_stand.png" alt="The Teeline word Stand"></figure></div>
<div class="dict-item">Star: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_star.png" alt="The Teeline word Star"></figure></div>
<div class="dict-item">Start: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_start.png" alt="The Teeline word Start"></figure></div>
<div class="dict-item">State: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_state.png" alt="The Teeline word State"></figure></div>
<div class="dict-item">Stay: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_stay.png" alt="The Teeline word Stay"></figure></div>
<div class="dict-item">Steep: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_step.png" alt="The Teeline word Steep"></figure></div>
<div class="dict-item">Step: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_step.png" alt="The Teeline word Step"></figure></div>
<div class="dict-item">Still: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_still.png" alt="The Teeline word Still"></figure></div>
<div class="dict-item">Stood: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_stood.png" alt="The Teeline word Stood"></figure></div>
<div class="dict-item">Stop: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_step.png" alt="The Teeline word Stop"></figure></div>
<div class="dict-item">Story: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_story.png" alt="The Teeline word Story"></figure></div>
<div class="dict-item">Street: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_start.png" alt="The Teeline word Street"></figure></div>
<div class="dict-item">Strong: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_strong.png" alt="The Teeline word Strong"></figure></div>
<div class="dict-item">Study: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_study.png" alt="The Teeline word Study"></figure></div>
<div class="dict-item">Subconscious: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/subconscious.png" alt="The Teeline word Subconscious"></figure></div>
<div class="dict-item">Success: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_success.png" alt="The Teeline word Success"></figure></div>
<div class="dict-item">Such: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_such.png" alt="The Teeline word Such"></figure></div>
<div class="dict-item">Sun: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_sun.png" alt="The Teeline word Sun"></figure></div>
<div class="dict-item">Sunday: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_sunday.png" alt="The Teeline word Sunday"></figure></div>
<div class="dict-item">Super: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_super.png" alt="The Teeline word Super"></figure></div>
<div class="dict-item">Supermarket: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_supermarket.png" alt="The Teeline word Supermarket"></figure></div>
<div class="dict-item">Supervise: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_supervise.png" alt="The Teeline word Supervise"></figure></div>
<div class="dict-item">Sure: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_sure.png" alt="The Teeline word Sure"></figure></div>
<div class="dict-item">Surface: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_surface1.png" alt="The Teeline word Surface (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_surface2.png" alt="The Teeline word Surface (version 2)"></figure></div>
<div class="dict-item">Survival: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/survival.png" alt="The Teeline word Survival"></figure></div>
<div class="dict-item">Suspicious: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/suspicious.png" alt="The Teeline word Suspicious"></figure></div>
<div class="dict-item">Table: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_table.png" alt="The Teeline word Table"></figure></div>
<div class="dict-item">Tail: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_tail.png" alt="The Teeline word Tail"></figure></div>
<div class="dict-item">Take: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_take.png" alt="The Teeline word Take"></figure></div>
<div class="dict-item">Talk: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_talk.png" alt="The Teeline word Talk"></figure></div>
<div class="dict-item">Tall: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_tail.png" alt="The Teeline word Tall"></figure></div>
<div class="dict-item">Teach: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_teach.png" alt="The Teeline word Teach"></figure></div>
<div class="dict-item">Teeline: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_teeline.png" alt="The Teeline word Teeline"></figure></div>
<div class="dict-item">Telephone: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_telephone.png" alt="The Teeline word Telephone"></figure></div>
<div class="dict-item">Telescope: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_telescope.png" alt="The Teeline word Telescope"></figure></div>
<div class="dict-item">Tell: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_tail.png" alt="The Teeline word Tell"></figure></div>
<div class="dict-item">Temperature: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_temperature.png" alt="The Teeline word Temperature"></figure></div>
<div class="dict-item">Test: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_test.png" alt="The Teeline word Test"></figure></div>
<div class="dict-item">Than: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_than.png" alt="The Teeline word Than"></figure></div>
<div class="dict-item">Thank: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_thank.png" alt="The Teeline word Thank"></figure></div>
<div class="dict-item">That: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_that.png" alt="The Teeline word That"></figure></div>
<div class="dict-item">The: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_the.png" alt="The Teeline word The"></figure></div>
<div class="dict-item">Their: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_their.png" alt="The Teeline word Their"></figure></div>
<div class="dict-item">Them: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_them.png" alt="The Teeline word Them"></figure></div>
<div class="dict-item">Then: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_than.png" alt="The Teeline word Then"></figure></div>
<div class="dict-item">Theory: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_theory.png" alt="The Teeline word Theory"></figure></div>
<div class="dict-item">There: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_their.png" alt="The Teeline word There"></figure></div>
<div class="dict-item">Therefore: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_therefore.png" alt="The Teeline word Therefore"></figure></div>
<div class="dict-item">Thermometer: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_thermometer.png" alt="The Teeline word Thermometer"></figure></div>
<div class="dict-item">These: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_these.png" alt="The Teeline word These"></figure></div>
<div class="dict-item">They: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_they.png" alt="The Teeline word They"></figure></div>
<div class="dict-item">Thing: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_thing.png" alt="The Teeline word Thing"></figure></div>
<div class="dict-item">Think: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_think.png" alt="The Teeline word Think"></figure></div>
<div class="dict-item">Thirty: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/thirty.png" alt="The Teeline word Thirty"></figure></div>
<div class="dict-item">This: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_this.png" alt="The Teeline word This"></figure></div>
<div class="dict-item">Those: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_those.png" alt="The Teeline word Those"></figure></div>
<div class="dict-item">Though: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_though.png" alt="The Teeline word Though"></figure></div>
<div class="dict-item">Thought: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_thought.png" alt="The Teeline word Thought"></figure></div>
<div class="dict-item">Thousand: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_thousand1.png" alt="The Teeline word Thousand (version 1)"></figure><br>or <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_thousand2.png" alt="The Teeline word Thousand (version 2)"></figure></div>
<div class="dict-item">Three: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_three.png" alt="The Teeline word Three"></figure></div>
<div class="dict-item">Through: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_through.png" alt="The Teeline word Through"></figure></div>
<div class="dict-item">Thursday: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_thursday.png" alt="The Teeline word Thursday"></figure></div>
<div class="dict-item">Time: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_time.png" alt="The Teeline word Time"></figure></div>
<div class="dict-item">Tip: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_top.png" alt="The Teeline word Tip"></figure></div>
<div class="dict-item">Tissue: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_tissue.png" alt="The Teeline word Tissue"></figure></div>
<div class="dict-item">To: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_to.png" alt="The Teeline word To"></figure></div>
<div class="dict-item">Together: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_together.png" alt="The Teeline word Together"></figure></div>
<div class="dict-item">Told: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_told.png" alt="The Teeline word Told"></figure></div>
<div class="dict-item">Tomorrow: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_tomorrow.png" alt="The Teeline word Tomorrow"></figure></div>
<div class="dict-item">Too: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_too.png" alt="The Teeline word Too"></figure></div>
<div class="dict-item">Took: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_take.png" alt="The Teeline word Took"></figure></div>
<div class="dict-item">Top: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_top.png" alt="The Teeline word Top"></figure></div>
<div class="dict-item">Toward: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_toward.png" alt="The Teeline word Toward"></figure></div>
<div class="dict-item">Town: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_town.png" alt="The Teeline word Town"></figure></div>
<div class="dict-item">Transport: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_transport.png" alt="The Teeline word Transport"></figure></div>
<div class="dict-item">Travel: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_travel.png" alt="The Teeline word Travel"></figure></div>
<div class="dict-item">Tree: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_tree.png" alt="The Teeline word Tree"></figure></div>
<div class="dict-item">True: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_true.png" alt="The Teeline word True"></figure></div>
<div class="dict-item">Try: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_try.png" alt="The Teeline word Try"></figure></div>
<div class="dict-item">Tuesday: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_tuesday.png" alt="The Teeline word Tuesday"></figure></div>
<div class="dict-item">Turn: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_turn.png" alt="The Teeline word Turn"></figure></div>
<div class="dict-item">Uncertainty: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2021/06/uncertainty.png" alt="The Teeline word Uncertainty"></figure></div>
<div class="dict-item">Two: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_number_two.png" alt="The Teeline word Two"></figure></div>
<div class="dict-item">Under: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_under.png" alt="The Teeline word Under"></figure></div>
<div class="dict-item">Unit: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_unit.png" alt="The Teeline word Unit"></figure></div>
<div class="dict-item">Until: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_until.png" alt="The Teeline word Until"></figure></div>
<div class="dict-item">Up: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_up.png" alt="The Teeline word Up"></figure></div>
<div class="dict-item">Us: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_us.png" alt="The Teeline word Us"></figure></div>
<div class="dict-item">Use: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_us.png" alt="The Teeline word Use"></figure></div>
<div class="dict-item">Usual: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_usual.png" alt="The Teeline word Usual"></figure></div>
<div class="dict-item">Variable: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_variable.png" alt="The Teeline word Variable"></figure></div>
<div class="dict-item">Very: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_very.png" alt="The Teeline word Very"></figure></div>
<div class="dict-item">Voice: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_voice.png" alt="The Teeline word Voice"></figure></div>
<div class="dict-item">Volume: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_volume.png" alt="The Teeline word Volume"></figure></div>
<div class="dict-item">Vowel: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_vowel.png" alt="The Teeline word Vowel"></figure></div>
<div class="dict-item">Wait: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_wait.png" alt="The Teeline word Wait"></figure></div>
<div class="dict-item">Walk: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_walk.png" alt="The Teeline word Walk"></figure></div>
<div class="dict-item">Want: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2020/05/want.png" alt="The Teeline word Want"></figure></div>
<div class="dict-item">Wanted: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2020/05/wanted.png" alt="The Teeline word Wanted"></figure></div>
<div class="dict-item">War: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_our.png" alt="The Teeline word War"></figure></div>
<div class="dict-item">Warm: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_warm.png" alt="The Teeline word Warm"></figure></div>
<div class="dict-item">Was: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_was.png" alt="The Teeline word Was"></figure></div>
<div class="dict-item">Watch: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_watch.png" alt="The Teeline word Watch"></figure></div>
<div class="dict-item">Water: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_water.png" alt="The Teeline word Water"></figure></div>
<div class="dict-item">Way: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_way.png" alt="The Teeline word Way"></figure></div>
<div class="dict-item">We: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_we.png" alt="The Teeline word We"></figure></div>
<div class="dict-item">Weather: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_weather.png" alt="The Teeline word Weather"></figure></div>
<div class="dict-item">Wednesday: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_wednesday.png" alt="The Teeline word Wednesday"></figure></div>
<div class="dict-item">Week: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_week.png" alt="The Teeline word Week"></figure></div>
<div class="dict-item">Weight: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_wait.png" alt="The Teeline word Weight"></figure></div>
<div class="dict-item">Well: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_well.png" alt="The Teeline word Well"></figure></div>
<div class="dict-item">Went: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2020/05/want.png" alt="The Teeline word Went"></figure></div>
<div class="dict-item">Were: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_our.png" alt="The Teeline word Were"></figure></div>
<div class="dict-item">West: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_west.png" alt="The Teeline word West"></figure></div>
<div class="dict-item">What: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_wait.png" alt="The Teeline word What"></figure></div>
<div class="dict-item">Wheel: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_wheel.png" alt="The Teeline word Wheel"></figure></div>
<div class="dict-item">When: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_when.png" alt="The Teeline word When"></figure></div>
<div class="dict-item">Where: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_where.png" alt="The Teeline word Where"></figure></div>
<div class="dict-item">Whether: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_weather.png" alt="The Teeline word Whether"></figure></div>
<div class="dict-item">Which: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_watch.png" alt="The Teeline word Which"></figure></div>
<div class="dict-item">While: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_wheel.png" alt="The Teeline word While"></figure></div>
<div class="dict-item">White: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_white.png" alt="The Teeline word White"></figure></div>
<div class="dict-item">Who: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_who.png" alt="The Teeline word Who"></figure></div>
<div class="dict-item">Whole: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_whole.png" alt="The Teeline word Whole"></figure></div>
<div class="dict-item">Why: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_why.png" alt="The Teeline word Why"></figure></div>
<div class="dict-item">Will: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_will.png" alt="The Teeline word Will"></figure></div>
<div class="dict-item">Wind: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_wind.png" alt="The Teeline word Wind"></figure></div>
<div class="dict-item">Wise: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_was.png" alt="The Teeline word Wise"></figure></div>
<div class="dict-item">With: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_with.png" alt="The Teeline word With"></figure></div>
<div class="dict-item">Within: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_within.png" alt="The Teeline word Within"></figure></div>
<div class="dict-item">Without: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_without.png" alt="The Teeline word Without"></figure></div>
<div class="dict-item">Wonder: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_wonder.png" alt="The Teeline word Wonder"></figure></div>
<div class="dict-item">Wood: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_wood.png" alt="The Teeline word Wood"></figure></div>
<div class="dict-item">Word: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_word.png" alt="The Teeline word Word"></figure></div>
<div class="dict-item">Work: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_work.png" alt="The Teeline word Work"></figure></div>
<div class="dict-item">World: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_world.png" alt="The Teeline word World"></figure></div>
<div class="dict-item">Would: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_wood.png" alt="The Teeline word Would"></figure></div>
<div class="dict-item">Write: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_right.png" alt="The Teeline word Write"></figure></div>
<div class="dict-item">Year: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_year.png" alt="The Teeline word Year"></figure></div>
<div class="dict-item">Yes: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_yes.png" alt="The Teeline word Yes"></figure></div>
<div class="dict-item">Yesterday: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2019/12/teeline_word_yesterday.png" alt="The Teeline word Yesterday"></figure></div>
<div class="dict-item">Yet: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_yet.png" alt="The Teeline word Yet"></figure></div>
<div class="dict-item">You: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_you.png" alt="The Teeline word You"></figure></div>
<div class="dict-item">Young: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_young.png" alt="The Teeline word Young"></figure></div>
<div class="dict-item">Your: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_your.png" alt="The Teeline word Your"></figure></div>
<div class="dict-item">Yourself: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_yourself.png" alt="The Teeline word Yourself"></figure></div>
<div class="dict-item">Zoology: <figure><img decoding="async" style="height: 40px;" src="http://realerthinks.com/wordpress/wp-content/uploads/2018/04/teeline_word_zoology.png" alt="The Teeline word Zoology"></figure></div>
</div>
</div></div>
<p>The post <a href="http://realerthinks.com/a-searchable-teeline-dictionary/">A Searchable Teeline Dictionary</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://realerthinks.com/a-searchable-teeline-dictionary/feed/</wfw:commentRss>
			<slash:comments>50</slash:comments>
		
		
			</item>
		<item>
		<title>Programming a grammar and style editor</title>
		<link>http://realerthinks.com/programming-grammar-style-editor/</link>
					<comments>http://realerthinks.com/programming-grammar-style-editor/#respond</comments>
		
		<dc:creator><![CDATA[Addie]]></dc:creator>
		<pubDate>Mon, 25 Sep 2017 22:53:03 +0000</pubDate>
				<category><![CDATA[Data Analysis]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[life hacks]]></category>
		<category><![CDATA[nltk]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[python classes]]></category>
		<category><![CDATA[stemming]]></category>
		<category><![CDATA[technical]]></category>
		<category><![CDATA[wordnet]]></category>
		<guid isPermaLink="false">http://realerthinks.com/?p=419</guid>

					<description><![CDATA[<p>Greetings friends! Over the years I&#8217;ve developed a bit of a process for editing text. I have about five different websites I use to check spelling, grammar, homonyms, nominalizations&#8230; a bunch of stuff. One day it occurred to me I can aggregate most of this into its own script&#8230; where I can execute it all [&#8230;]</p>
<p>The post <a href="http://realerthinks.com/programming-grammar-style-editor/">Programming a grammar and style editor</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Greetings friends!</p>
<p>Over the years I&#8217;ve developed a bit of a process for editing text. I have about five different websites I use to check spelling, grammar, homonyms, nominalizations&#8230; a bunch of stuff. One day it occurred to me I can aggregate most of this into its own script&#8230; where I can execute it all at once! I&#8217;m building my own grammar editor!</p>
<p>I&#8217;ve succeed with it (more or less), and I want to share my results with you. Some things need work, but I like where it&#8217;s headed.</p>
<h3>Oh boy imports</h3>
<p>This list is a doozy. We&#8217;ll explain it as we go, but it&#8217;s good practice to keep your imports at the top of a script.</p><pre class="crayon-plain-tag"># Python packages
from math import ceil
from string import punctuation

# Fun extras
import enchant  # Spell Check
import language_check  # Grammar Check
import lxml  # Needed for thesaurus
import nltk
from nltk.corpus import stopwords
from nltk.corpus import wordnet as wn
from py_thesaurus import WordAnalyzer  # Thesaurus

# Files which I define later
from cliches import cliches
from colors import Color
from filler_words import filler_words
from homophone_list import homophone_list
from nominalizations import denominalize
from weak_words import weak_adjs, weak_nouns, weak_verbs</pre><p>&nbsp;</p>
<h3>Creating the user interface</h3>
<p>I&#8217;m not aiming for any fancy GUIs, but I do want a fairly interactive program. I need to define a few functions to make it pretty.</p>
<p>First up, every time I proceed to a new section (spelling/grammar/etc), I want it to tell me in no certain terms we&#8217;re changing gears:</p><pre class="crayon-plain-tag">def now_checking_banner(word):
    '''Print a pretty banner on the output.'''
    mystr = '---  Now Checking %s!  ---' % word.title()
    dashstr = '-' * len(mystr)
    print('\n\n')
    print(dashstr)
    print(mystr)
    print(dashstr)</pre><p>Nothing too fancy.<span title='Except you may note that my print statements now have parenthesis. I&#8217;ve finally moved my curmudgeonly butt into Python3.' class='inline-footnote' style=''>7<span class='footnoteContent' style='display:none;'>Except you may note that my print statements now have parenthesis. I&#8217;ve finally moved my curmudgeonly butt into Python3.</span></span> Next, I want a function I can feed a list of words, and it will print the list out nicely into 3 (or whatever) columns. I&#8217;m also picky in that I like my columns to read down the column, and not across the row; I do a little jiggery-pokery with lists to accomplish that.</p><pre class="crayon-plain-tag">def print_rows(lis, max_rows=21, cols=3, item_width=18):
    '''
    Given a list of items, print them, numbered, in columns and rows.
    '''
    if len(lis) == 1 and lis[0] == '':
        print(' (1) &lt;delete&gt;')
        return

    max_items = max_rows * cols
    if len(lis) &gt; max_items:
        lis = lis[:max_items]
    if len(lis) &lt; 2*cols:
        cols = 1

    # Make a string template holding each column.
    mystr = '{: &gt;4} {: &lt;%s}' % (item_width) * cols
    nrows = ceil(len(lis)/cols)
    rows = [[]] * nrows
    r = 0
    # Order stuff to read down each column.
    # (rather than across each row).
    for i, j in enumerate(lis):
        rows[r] = rows[r] + ['(%s)' % (i+1), j]
        r = (r+1) % nrows
    while r != 0:
        rows[r] = rows[r] + ['', '']
        r = (r+1) % nrows
    for row in rows:
        print(mystr.format(*row))</pre><p>Next, I wanted a built-in thesaurus for my program. Later on in the program, I check for weak words; I specifically don&#8217;t want my thesaurus to recommend those. Accomplished easily enough:</p><pre class="crayon-plain-tag">def thesaurus(word):
    '''Provide a list of synonyms that are not weak words.'''
    return [w for w in WordAnalyzer(word).get_synonym()
            if w not in filler_words
            and w not in weak_adjs
            and w not in weak_nouns
            and w not in weak_verbs]</pre><p>Finally, putting these elements together, I want an input/output function. That is, I want it to print the sentence where the program catches an error (or a suggestion) with that error (or suggestion) underlined, print a list of possible replacements, and give the user a chance to input corrections.</p>
<p>Since I&#8217;m not using a GUI,<span title='yet!' class='inline-footnote' style=''>2<span class='footnoteContent' style='display:none;'>yet!</span></span> I want to make this process as streamlined as possible. If there&#8217;s a word that needs changing, I want it to be straightforward to change that word. If I want to pick something not in the suggestions list, I should be able to do that. If I want to re-write the sentence, that should be an option too. Ultimately what I developed is a little clunky, but it gets the job done. Once I get the back-end (actual style suggestions) functioning better, I can tweak this to be a bit nicer.</p><pre class="crayon-plain-tag">def suggest(word, suggestions, sentence, underline=None,
            can_replace_sent=False):
    '''
    Ask the user to provide input on errors or style suggestions.

    Arguments:
    word - the word or phrase to be replaced
    suggestions - a list of possible suggestions
    sentence - the context surrounding the word

    Optional arguments:
    underline - a 2-element list with the start and end
        points for underlining
    can_replace_sent - should the user have the option of
        replacing the entire sentence?
    '''
    
    # Print the sentence with the underlined section underlined.
    if underline is None:
        print('\n%s' % sentence)
    else:
        Color.print('\n%s' % sentence, underline[0], underline[1])
    print('Possible suggestions for "%s":' % word)

    # Print list of suggestions, as well as custom options.
    if len(suggestions) == 0:
        suggestions += ['']  # Play nicely with print_rows.
    print_rows(suggestions)
    print(' (0) Leave be.')
    if can_replace_sent is True:
        print('(ss) Edit entire sentence.')
    print(' (?) Input your own.')

    # Get user input.
    # If a number, return listed suggestion.
    # If 0, return sentence as-is.
    # If 'ss', ask user to replace entire sentence.
    # Else: return user-input.
    ss = False  # Replace entire sentence.
    user_input = input('Your choice: ')
    try:
        n = int(user_input)
        if n == 0:
            return word, ss
        # Note: will throw an error if number doesn't exist in list
        return suggestions[n-1], ss
    except ValueError:
        if can_replace_sent is True and user_input == 'ss':
            ss = True
            sent = input('Replace entire sentence: ')
            return sent, ss
        return user_input, ss</pre><p>&nbsp;</p>
<h3>Starting the &#8220;Text&#8221; class for our grammar editor</h3>
<p>Everything from here on out I&#8217;m going to do within a class. I want an object to hold each set of text I&#8217;m working on, represent it in different ways (string, tokens, list of words, parts of speech, etc.). I want to be able to edit the text both by calling methods (e.g. <pre class="crayon-plain-tag">spelling</pre> ) and by editing it in place. (i.e. I can change a word in the list of words and the whole thing will update.) Sound complicated? I mean, it is, but it&#8217;s not as bad as you&#8217;d think. Or at least not as bad as I expected when I started in on this project.</p><pre class="crayon-plain-tag">class Text(object):
    """
    A fancy text object which can provide style suggestions.

    Instance variables:
    string - a string of the entire text
    sentences - a list of sententces within the text
    tokens - a list of tokens
    words - a list of words
    tags - a list of words and their parts of speech tags

    Methods:
    save - save the text to a file
    spelling - check spelling
    grammar - check grammar
    homophone_check - highlight homophones
    cliches - point out overused phrases
    passive_voice - check for passive voice
    nominalizations - point out nominalizations
    weak_words - highlight weak words
    filler_words - point out words that may be unneccesary
    adverbs - highlight adverbs
    frequent_words - list the most-used words
    visualize_length - provide visual cues for sentence length
    polish - run all checks in order
    """

    def __init__(self, string, lang='en_US'):
        """
        Initialize a Text object.

        Arguments:
        string - the text string to be parsed

        Optional arguments:
        lang - the language to be used (not fully implemented)
        """
        self._string = string
        self._sentences = self._gen_sent(string)
        self._clean()
        self.lang = lang

    def save(self, filename):
        """Save the object to file."""
        with open(filename, 'w') as myfile:
            myfile.write(self._string)</pre><p>&nbsp;</p>
<h3>Defining Properties</h3>
<p>I&#8217;m going to be using properties to allow the in-place-type editing of sentences, words, etc. I was talking about beforehand. I&#8217;ll define the &#8220;actual&#8221; variable with a private<span title='i.e. starting with &#8220;_&#8221;' class='inline-footnote' style=''>3<span class='footnoteContent' style='display:none;'>i.e. starting with &#8220;_&#8221;</span></span> variable and the public &#8220;variable&#8221; as a property. Properties are similar to variables, except they allow function/method calls when they are assigned or called. I like using the decorator (or &#8220;@&#8221;) to define properties.</p><pre class="crayon-plain-tag">@property
    def string(self):
        return self._string

    @string.setter
    def string(self, string):
        self._string = string
        self._sentences = self._gen_sent(self._string)
        self._tokens = self._gen_tokens(self._string)
        self._words = self._gen_words(tokens=self._tokens)
        self._tags = self._gen_tags(words=self._words)

    @property
    def sentences(self):
        return self._sentences

    @sentences.setter
    def sentences(self, sents):
        self._string = ' '.join(sents)
        self._sentences = sents
        self._tokens = self._gen_tokens(self._string)
        self._words = self._gen_words(tokens=self._tokens)
        self._tags = self._gen_tags(words=self._words)

    @property
    def tokens(self):
        return self._tokens

    @tokens.setter
    def tokens(self, toks):
        self._string = ''.join(toks)
        self._sentences = self._gen_sent(self._string)
        self._tokens = toks
        self._words = self._gen_words(tokens=self._tokens)
        self._tags = self._gen_tags(words=self._words)

    @property
    def words(self):
        return self._words

    @property
    def tags(self):
        return self._tags</pre><p>&nbsp;</p>
<h3>Defining basic cleanup</h3>
<p>Don&#8217;t you love how I&#8217;m building a lot of foundation and we haven&#8217;t gotten into the meat and potatoes? Right now I&#8217;m showing you my &#8220;clean&#8221; method as well as the &#8220;_gen_BLAH&#8221; methods I was calling earlier. These generate<span title='GASP!' class='inline-footnote' style=''>4<span class='footnoteContent' style='display:none;'>GASP!</span></span> the lists of things (words, tokens, and tags) I referred to earlier.</p>
<p>Here I use a LOT of tools from <a href="http://www.nltk.org/">NLTK, the Natural Language Toolkit</a>. It easily breaks sentences with no effort on my part. I use its regular expression parser to generate tokens (like a list of words, but including punctuation and spaces). I also use it to tag the parts of speech in the text. After that, I needed a bit of clean-up (treating newlines as sentence breaks, treating contractions as ONE token/word).</p><pre class="crayon-plain-tag">def _clean(self):
        """Remove unneccesary whitespace."""
        sents = [s.strip() for s in self._sentences]
        for i in ',:;.?! ':
            sents = [s.replace(' %s' % i, i) for s in sents]

        self._string = ' '.join(sents)
        self._sentences = sents
        self._tokens = self._gen_tokens(self._string)
        self._words = self._gen_words(tokens=self._tokens)
        self._tags = self._gen_tags(words=self._words)

    def _gen_sent(self, string):
        """Generate a list of sentences."""
        sentences = nltk.tokenize.sent_tokenize(string)
        # Treat newlines as sentence breaks
        # Remove leading/trailing whitespace
        return [s.strip() for p in sentences for s in p.split('\n') if s != '']

    def _fix_contractions(self, tokens):
        """Treat contractions as one token, not three."""
        cont_list = ['d', 'll', 'm', 're', 's', 't', 've']
        conts = [i for i, tok in enumerate(tokens)
                 if tok == "'"
                 and i &gt; 0 and i+1 &lt; len(tokens)
                 and tokens[i+1] in cont_list]
        for c in conts:
            tokens = tokens[:c-1] + [''.join(tokens[c-1:c+2])] + tokens[c+2:]
        return tokens

    def _gen_tokens(self, string):
        """Generate a list of tokens."""
        tokens = nltk.tokenize.regexp_tokenize(string, '\w+|[^\w\s]|\s')
        return self._fix_contractions(tokens)

    def _gen_words(self, tokens=None, sent=None):
        """Generate a list of words."""
        if sent is not None:
            tokens = self._gen_tokens(sent)
        if tokens is not None:
            return [
                tok for tok in tokens if tok != ' ' and tok not in punctuation]
        raise NameError('_gen_words must be passed either tokens or sent.')

    def _gen_tags(self, words=None, sent=None):
        """Generate a list of parts of speech tags."""
        if words is not None:
            return nltk.pos_tag(words)
        if sent is not None:
            return nltk.pos_tag(self._gen_words(sent=sent))
        raise NameError('_gen_tags must be passed either words or sent.')</pre><p>One more piece of business: For some of my methods, I use <a href="https://wordnet.princeton.edu/" class="broken_link" rel="nofollow">WordNet</a> to <a href="https://en.wikipedia.org/wiki/Lemmatisation">lemmatize</a> my words. It uses different parts of speech (POS) tags than does NLTK. I threw in a short method to convert from NLTK&#8217;s Penn POS tags to WordNet&#8217;s:</p><pre class="crayon-plain-tag">def _penn2morphy(self, penntag):
        """Quick 'translation' between Penn and Morphy POS tags."""
        morphy_tag = {'NN': wn.NOUN,
                      'JJ': wn.ADJ,
                      'VB': wn.VERB,
                      'RB': wn.ADV}
        try:
            return morphy_tag[penntag[:2]]
        except KeyError:
            return None</pre><p>Morphy has fewer tags; if it doesn&#8217;t have a tag, the method returns <pre class="crayon-plain-tag">None</pre>  instead.</p>
<p>&nbsp;</p>
<h3>Two more behind-the-scenes methods.</h3>
<p>I found my <pre class="crayon-plain-tag">suggest</pre> function didn&#8217;t do the heavy lifting I needed; I threw together two more methods to ease things along. If I get more time on this project<span title='i.e. if I don&#8217;t burn out on it' class='inline-footnote' style=''>5<span class='footnoteContent' style='display:none;'>i.e. if I don&#8217;t burn out on it</span></span> I&#8217;ll need to clean these a bit more (or maybe incorporate them into &#8220;suggest&#8221;).</p><pre class="crayon-plain-tag">def _replace_one_word(self, tokens, index, suggestions,
                          can_replace_sent=False):
        """
        Given tokens, an index, and suggestions:
            Determine what the replaced word should be.
            Determine where it is highlighted in the sentence.
            Ask user for input on what corrections to make.
            If they modified the entire sentence, return those tokens.
            Else replace the one token and return updated list.
        """
        tok = tokens[index]
        u_start = len(''.join(tokens[:index]))
        u_end = u_start + len(tok)
        r, ss = suggest(tok, suggestions, ''.join(tokens), (u_start, u_end),
                        can_replace_sent)
        if ss is True:  # Replace entire sentence
            tokens = self._gen_tokens(r)
        elif ss is False:
            tokens[index] = r
        return tokens

    def _replace_phrase(self, sent, phrase, suggestions,
                        can_replace_sent=True, underline=None):
        """
        Given a sentence, phrase, and suggestions:
            Determine where underline should be, if none given.
            Ask user for input on what corrections to make.
            Return sentence with corrections.
        """
        # NOTE: only highlights first instance
        if underline is None:
            u_start = sent.find(phrase)
            if u_start != -1:
                u_end = u_start + len(phrase)
                underline = (u_start, u_end)
            else:
                underline = None
        r, ss = suggest(phrase, suggestions, sent, underline, can_replace_sent)
        if ss is True:
            sent = r
        elif ss is False:
            if underline is not None:
                sent = sent[:underline[0]] + r + sent[underline[1]:]
            else:
                sent = sent.replace(phrase, r)
        return sent</pre><p>Like I said, these functions are a wee bit clunky. High on my cringe list is <pre class="crayon-plain-tag">_replace_phrase</pre>: if the sentence contains the phrase twice, it will only ever highlight the first instance.</p>
<h3>The actual substance of the thing</h3>
<p>Are you ready to actually start a grammar/style check!?!?!? Now that I&#8217;ve gotten the bones defined, we can get deep into it.</p>
<h4>Spell check</h4>
<p>What would a style checker be without a good ol&#8217; spell check? I wanted my spell-checker to do two things: to check spelling, and to leave scientific words alone. Any of you who write science a lot understand my struggle. Spell checkers always pick the common lingo words and it&#8217;s frustrating. I found an <a href="http://www.jpetrie.net/scientific-word-list-for-spell-checkersspelling-dictionaries/">online list of scientific words for spell-checkers</a> and downloaded it into a text file called <pre class="crayon-plain-tag">scientific_word_list.txt</pre> . I added a few of my own words (e.g. authors I cite a lot). Even without that, this list is GOLD.</p>
<p>For this method, I load the enchant spell check, feed it my custom DICTIONARY OF SCIENCE, and run through each token. If the token has an error, <pre class="crayon-plain-tag">spelling</pre>  will suggest you fix it.</p><pre class="crayon-plain-tag">def spelling(self):
        """Run a spell check on the text!"""
        string = ''
        d = enchant.DictWithPWL(self.lang, 'scientific_word_list.txt')
        for sent in self._sentences:
            tokens = self._gen_tokens(sent)
            for i, tok in enumerate(tokens):
                if tok == ' ' or tok == '\n' or tok in punctuation:
                    continue
                if d.check(tok) is False:
                    tokens = self._replace_one_word(tokens, i, d.suggest(tok))
            string += ''.join(tokens) + ' '
        self.string = string.strip()</pre><p></p>
<h4>Grammar check</h4>
<p>Why reinvent the wheel? I wanted to start with a good, basic grammar check to get this party started. I settled on <pre class="crayon-plain-tag">language_check</pre>  for a few reasons. Firstly, its corrections were the best out there. It performs to satisfaction. Secondly, and I can&#8217;t stress this enough, it had the option to NOT CHECK SPELLING. I didn&#8217;t want to waste my hard work with the custom spelling dictionary just to have my grammar checker catch every science word all over again.</p><pre class="crayon-plain-tag">def grammar(self):
        """Run a grammar check on the text!"""
        string = ''
        d = language_check.LanguageTool(self.lang)
        d.disable_spellchecking()
        for sent in self._sentences:
            errors = d.check(sent)
            while len(errors) &gt; 0:
                err = errors[0]
                if err.fromx &lt; 0 or err.tox &lt; 0:
                    errors = errors[1:]
                    continue
                sent_new = self._replace_phrase(
                    sent, sent[err.fromx:err.tox], err.replacements,
                    can_replace_sent=True, underline=[err.fromx, err.tox])
                if sent_new == sent:
                    errors = errors[1:]
                else:
                    errors = d.check(sent_new)
                sent = sent_new
            string += sent + ' '
        self.string = string.strip()</pre><p></p>
<h4>Homophone check</h4>
<p>To be honest, I&#8217;m generally pretty good at homophones. I&#8217;m also PARANOID I&#8217;ll mix them up and look horribly uneducated and something something overreacting. I wanted something that would highlight every. single. homophone. Just to make sure. This is super overkill for some people. It&#8217;s fabulously useful for others.</p><pre class="crayon-plain-tag">def homophone_check(self):
        """Point out every single homophone, for good measure."""
        string = ''
        for sent in self._sentences:
            tokens = self._gen_tokens(sent)
            for i, tok in enumerate(tokens):
                for homophones in homophone_list:
                    for h in homophones:
                        if h == tok.lower():
                            tokens = self._replace_one_word(
                                tokens, i, homophones)
            string += ''.join(tokens) + ' '
        self.string = string.strip()</pre><p>There is probably a way to do this without so many nested <pre class="crayon-plain-tag">for</pre>  loops. I haven&#8217;t found it yet. I&#8217;ll attach <pre class="crayon-plain-tag">homophone_list</pre>  to the end of this post.</p>
<h4>Cliches!</h4>
<p>Do you think I was born yesterday? I&#8217;m a big wig! You can&#8217;t hold a candle to me. I want to avoid cliches more than life itself! But I want it to be a no-brainer.</p>
<p>Barf. It pained me to write that paragraph. Let&#8217;s never talk of this again. To check for cliches, I needed to lemmatize my phrases so that my program will still catch slight variations. Never fear! NLTK is here!</p><pre class="crayon-plain-tag">def cliches(self):
        """Highlight cliches and offer suggestions."""
        string = ''
        lemmatizer = nltk.stem.WordNetLemmatizer()
        for sent in self._sentences:
            tokens = self._gen_tokens(sent)
            lem = ''.join([lemmatizer.lemmatize(t) for t in tokens]).lower()
            for k in cliches.keys():
                if k in lem:
                    sent = self._replace_phrase(sent, k, cliches[k])
                    tokens = self._gen_tokens(sent)
                    lem = ''.join([
                        lemmatizer.lemmatize(t) for t in tokens]).lower()
            string += sent + ' '
        self.string = string.strip()
        self._clean()</pre><p>I compiled a huge list of cliches (and occasionally suggestions for replacing them) from the internet and saved it into a dictionary called <pre class="crayon-plain-tag">cliches</pre> . It&#8217;s attached at the end of this post.</p>
<h4>Passive voice</h4>
<p>Ah the bane of my existence. I use passive voice much more than I&#8217;d like to admit. It&#8217;s also VERY difficult to check for. I searched the Interwebz for a passive voice finder, but didn&#8217;t find anything satisfactory. So I wrote my own. It works. Mostly.</p>
<p>The trick is finding verbs in the past-participle form (&#8220;VBN&#8221; in Penn tags) and finding other verbs that appear before them. Right now this will catch phrases like &#8220;was included&#8221; and &#8220;were substituted.&#8221; I still need to allow for an extra word (or two?) between the verbs, because it&#8217;s not catching phrases like &#8220;was not included&#8221; and &#8220;were randomly substituted.&#8221;<span title='The good news is that almost all of these get caught later in weak_verbs, so there&#8217;s that at least.' class='inline-footnote' style=''>6<span class='footnoteContent' style='display:none;'>The good news is that almost all of these get caught later in weak_verbs, so there&#8217;s that at least.</span></span> Also if there are multiple instances of passive voice in a sentence, this method does some weird things. That being said, it works on <em>a lot</em> of sentences with passive voice:</p><pre class="crayon-plain-tag">def passive_voice(self):
        """Point out (many) instances of passive voice."""
        string = ''
        for sent in self._sentences:
            words = self._gen_words(sent=sent)
            tags = self._gen_tags(words=words)
            vbns = [w[0] for w in tags if w[1] == 'VBN']
            if len(vbns) &gt; 0:
                for vbn in vbns:
                    i = words.index(vbn)
                    if tags[i-1][1].startswith('V'):
                        phrase = ' '.join([words[i-1], words[i]])
                        sent = self._replace_phrase(sent, phrase, [])
            string += sent + ' '
        self.string = string.strip()</pre><p></p>
<h4>Nominalizations</h4>
<p>It took me a long time to wrap my head around the idea of nominalizations. Once I heard the phrase &#8220;zombie nouns&#8221; it made sense, though! A nominalization is a noun hiding a verb (sometimes an adjective) in it. Good writing 101 states strong verbs are the cornerstone of strong writing. You should use them as much as possible.</p>
<p>Examples:<br />
&#8220;The study was a failure.&#8221; ==&gt; &#8220;The study failed.&#8221;<br />
&#8220;Movement occurred in the bushes.&#8221; ==&gt; &#8220;The bushes moved.&#8221;</p>
<p>I originally planned on making a list of nominalizations like I did with cliches and homonyms, but I quickly realized that was a herculean task. I changed tack. Nominalizations often possess one of several endings:</p><pre class="crayon-plain-tag">nominalization_endings = [
    'ance',
    'cy',
    'ence'
    'ing',
    'ion',
    'ment',
    'ness',
    'nt',
    'ology',
    'ry',
    'sis',
    'ty',
    'ure',
    ]</pre><p>That, coupled with a short list of nominalizations without those endings (<pre class="crayon-plain-tag">random_nominalizations = ['belief', 'sale', 'success']</pre>) lets me both check for nominalizations, and suggest verbs that might be better-suited to the task.</p><pre class="crayon-plain-tag">def denominalize(noun):
    """Return verb forms of noun, if it is a nominalization."""
    # Clean noun for processing.
    noun = wn.morphy(noun, wn.NOUN)
    if noun is None:
        return []

    # Determine if we should check the noun.
    should_check = False
    for ending in nominalization_endings:
        if noun.endswith(ending):
            should_check = True

    if noun in random_nominalizations:
        should_check = True

    if should_check is False:
        return []

    # Get sets of synonyms.
    synsets = wn.synsets(noun, wn.NOUN)

    # Lemmatize (get base word) of each synset.
    lemmas = []
    for syn in synsets:
        lemmas += syn.lemmas()

    # Get derivations from each lemma.
    derivs = []
    for lem in lemmas:
        derivs += lem.derivationally_related_forms()
    # Filter to only have verbs.
    derivs = [d.name() for d in derivs if d.synset().pos() == 'v']

    # Return words (no duplicates)
    return list(set(derivs))</pre><p>WordNet is the powerhouse of this function. The ability to get words <em>related</em> to an input word is FANTASTIC. This means when asking it to denominalize &#8220;success,&#8221; you&#8217;ll see &#8220;succeed,&#8221; but you&#8217;ll also see &#8220;win&#8221; and &#8220;achieve,&#8221; which are etymologically similar. Neat!</p>
<p>(For those keeping track, <pre class="crayon-plain-tag">nominalization_endings</pre> , <pre class="crayon-plain-tag">random_nominalizations</pre> , and <pre class="crayon-plain-tag">denominalize</pre>  are defined in <pre class="crayon-plain-tag">nominalizations.py</pre> and are imported at the top of my script.)</p>
<p>Back to the <pre class="crayon-plain-tag">Text</pre> class, all I need is a <pre class="crayon-plain-tag">nominalizations</pre> method:</p><pre class="crayon-plain-tag">def nominalizations(self):
        """Find many nominalizations and suggest stronger verbs."""
        string = ''
        for sent in self._sentences:
            tokens = self._gen_tokens(sent)
            nouns = [w[0] for w in self._gen_tags(sent=sent)
                     if w[1].startswith('NN')]
            for noun in nouns:
                denoms = denominalize(noun)
                if len(denoms) &gt; 0 and noun in tokens:
                    tokens = self._replace_one_word(
                        tokens, tokens.index(noun), denoms, True)
            string += ''.join(tokens) + ' '
        self.string = string.strip()</pre><p>Bonus: did anyone catch that &#8220;nominalization&#8221; is a nominalization? Thanks, English!</p>
<h4>Weak words</h4>
<p>There are words which are so bland you shouldn&#8217;t use them. &#8220;Beautiful&#8221;? &#8220;Amazing&#8221;? How about &#8220;radiant!&#8221; &#8220;Move&#8221;? Try &#8220;scurry&#8221; or &#8220;hustle!&#8221; Well-crafted words (especially verbs!!) can make a reading experience that much more intriguing. Again, I&#8217;m lemmatizing the words to increase the number of matches (&#8220;was&#8221; and &#8220;are&#8221; are both versions of &#8220;be&#8221; of course). I let the thesaurus do the work.</p><pre class="crayon-plain-tag">def weak_words(self):
        """Find weak words and suggest stronger ones."""
        string = ''
        lemmatizer = nltk.stem.WordNetLemmatizer()
        for sent in self._sentences:
            tokens = self._gen_tokens(sent)
            tags = self._gen_tags(sent=sent)
            for w in tags:
                pos = self._penn2morphy(w[1])
                if pos is not None:
                    lemma = lemmatizer.lemmatize(w[0], pos)
                    if (lemma in weak_verbs \
                            or lemma in weak_adjs \
                            or lemma in weak_nouns) \
                            and w[0] in tokens:
                        tokens = self._replace_one_word(
                            tokens, tokens.index(w[0]), thesaurus(w[0]), True)
            string += ''.join(tokens) + ' '
        self.string = string.strip()</pre><p><pre class="crayon-plain-tag">weak_verbs</pre>, <pre class="crayon-plain-tag">weak_adjs</pre>, and <pre class="crayon-plain-tag">weak_nouns</pre> are defined in <pre class="crayon-plain-tag">weak_words.py</pre> (included at the end of this post).</p>
<h4>Filler words</h4>
<p>Some words don&#8217;t need to be in your text at all. Personally, &#8220;that&#8221; is a pet peeve of mine which shows up everywhere! It slows your reader for no reason. This method takes a list of filler words and suggests the user delete each one.</p><pre class="crayon-plain-tag">def filler_words(self):
        """Point out filler words and offer to delete them."""
        string = ''
        for sent in self._sentences:
            tokens = self._gen_tokens(sent)
            for i, tok in enumerate(tokens):
                if tok.lower() in filler_words:
                    tokens = self._replace_one_word(tokens, i, [], True)
            string += ''.join(tokens) + ' '
        self.string = string.strip()
        self._clean()</pre><p></p>
<h4>Adverbs</h4>
<p>Adverbs are words (usually ending in &#8220;ly&#8221;) which modify verbs. They are almost always unnecessary. Finding a better (stronger) synonym for the verb will make your writing pop.</p>
<p>This is one of those methods where I was taking a DIY approach. It does catch adverbs! It, unfortunately, catches a lot of other things too (like the perfect tense). I use NLTK&#8217;s tags to find adverbs, find the verb they modify, and offer thesaurus suggestions on that verb.</p><pre class="crayon-plain-tag">def adverbs(self):
        """Find adverbs and verbs, offer better verbs."""
        string = ''
        for sent in self._sentences:
            tokens = self._gen_tokens(sent)
            words = [w for w in tokens
                     if w != ' ' and w not in punctuation]
            adverbs = [w[0] for w in self._gen_tags(words=words)
                       if w[1].startswith('RB')]
            if len(adverbs) &gt; 0:
                verbs = [w[0] for w in self._gen_tags(words=words)
                         if w[1].startswith('V')]
                for adv in adverbs:
                    adv_i = words.index(adv)
                    v_is = [words.index(v) for v in verbs]
                    v_i = [i for i in v_is
                           if i+1 == adv_i or i-1 == adv_i]
                    if len(v_i) != 1:
                        break
                    v_i = v_i[0]
                    indices = [adv_i, v_i]
                    indices.sort()
                    phrase = ' '.join([words[i] for i in indices])
                    sent = self._replace_phrase(
                        sent, phrase, thesaurus(words[v_i]))
            string += sent + ' '
        self.string = string.strip()</pre><p></p>
<h4>Frequent words</h4>
<p>Have you ever read something and realized they used the word &#8220;communication&#8221; like five times in one paragraph? That&#8217;s confusing, slows your reader, and is bad practice. Ideally I&#8217;d like to have this method point out not only your most frequently used words, especially those which are in proximity to another. Right now it only pulls the frequency.</p><pre class="crayon-plain-tag">def frequent_words(self, n=10):
        """Print a list of the most commonly used words."""
        lemmatizer = nltk.stem.WordNetLemmatizer()
        stopwords = nltk.corpus.stopwords.words('english')
        morphy_tags = [(x, self._penn2morphy(pos)) for x, pos in self._tags]
        lemmas = [
            lemmatizer.lemmatize(x.lower(), pos) for x, pos in morphy_tags
            if pos is not None
            and x not in stopwords
            and x != '\n']
        distr = [(k, v) for k, v in nltk.FreqDist(lemmas).items() if v &gt; 1]
        distr.sort(key=lambda x: x[1], reverse=True)
        for i in distr[:n]:
            perc = i[1] / len(self._words) * 100
            print('{: &gt;14}: {:}, {:}%'.format(i[0], i[1], perc))</pre><p>For more on stop words, see <a href="http://realerthinks.com/2016/12/?p=70" class="broken_link" rel="nofollow">one of my early posts on this blog</a>.</p>
<h4>Visualizing sentence length</h4>
<p>We&#8217;re almost in the home stretch! We&#8217;re almost finished explaining all the code!! This last<span title='second-to-last; it&#8217;s the last one which analyzes the text' class='inline-footnote' style=''>7<span class='footnoteContent' style='display:none;'>second-to-last; it&#8217;s the last one which analyzes the text</span></span> method simply visualizes each sentence by its length. Variation in sentence length is critical. The picture it prints out should be interesting, not a massive rectangle. Ultimately I&#8217;d like to opt to edit individual sentences from here; I haven&#8217;t coded that bit yet.</p><pre class="crayon-plain-tag">def visualize_length(self, char='X'):
        """Produce a visualization of sentence length."""
        for i, sent in enumerate(self._sentences):
            n = len([x for x in sent if x != ' ' and x not in punctuation])
            print('{: &gt;6}'.format('(%s)' % (i+1)), char*n)</pre><p></p>
<h4>Tidying up</h4>
<p>The last-last method offers the user an easy way to run through all style methods at once:</p><pre class="crayon-plain-tag">def polish(self):
        now_checking_banner('spelling')
        self.spelling()

        now_checking_banner('grammar')
        self.grammar()

        now_checking_banner('homophones')
        self.homophone_check()

        now_checking_banner('clichés')
        self.cliches()

        now_checking_banner('passive voice')
        self.passive_voice()

        now_checking_banner('nominalizations')
        self.nominalizations()

        now_checking_banner('weak words')
        self.weak_words()

        now_checking_banner('filler words')
        self.filler_words()

        now_checking_banner('adverbs')
        self.adverbs()

        now_checking_banner('frequent words')
        self.frequent_words()

        now_checking_banner('variation in sentence length')
        self.visualize_length()</pre><p></p>
<h3>A working example</h3>
<p>I started with some crap text:</p>
<blockquote><p>this is an example of some porely ritten text. it was ritten in a hury. i&#8217;d like too fix it up. can you help me? can you find all of the mistakes? i really want to no how to write good more then life itself. I want to insure Ive did my best work in order to feel good. Im going tward my goal to. good writers are my inspiration. They were showed to me by my mother.</p></blockquote>
<p>And ran it through my little program. It ended with:</p>
<blockquote><p>This remains an example of drafted text. I rushed while I wrote it. I&#8217;d relish in fixing it. Can you assist me? Can you catch the mistakes? I yearn to comprehend how to communicate. I hunger to ensure I&#8217;ve wrought my best efforts to feel worthy. I&#8217;m progressing toward my goal too. Good writers inspire me. My mother introduced them to me.</p></blockquote>
<p>As you can see, it definitely polishes the writing. It can&#8217;t do anything for substance, though. If you start with horrible substance, this script can&#8217;t help you. A gilded turd is still a turd.</p>
<h3>Errors and areas for improvement</h3>
<p>Places I want to improve I didn&#8217;t explicitly mention:</p>
<ul>
<li>In the banner text, I want the script to explain what e.g. nominalizations are. That way the script can stand alone and not have folks scratching their head going &#8220;why in the world is this suggesting verbs where I clearly have a noun?&#8221;</li>
<li>The <pre class="crayon-plain-tag">_clean</pre>  method should strip smart quotes. Curse you, smart quotes!</li>
<li>Sometimes in e.g. the <pre class="crayon-plain-tag">grammar</pre>  method, the script will give you the same prompt twice if A) you decide not to change it and B) have a second grammar error in the sentence. This can lead to infinite loops.</li>
<li>In the homophone checker, I want real-time working examples of each homophone, to aid in context.</li>
<li>Add a pronoun-checker; sometimes if you use too many pronouns, it can confuddle the reader. (I don&#8217;t personally struggle with this; I haven&#8217;t included it yet.)</li>
<li>The program gobbles newline characters. I hope you like your text in one BIG paragraph.</li>
<li>The program should save as it goes. Right now one error, bug, or crash and the whole work is toast. (eek!)</li>
<li>Be able to read from a LaTeX document. Right now I&#8217;m doing pretty well with the program <a href="https://github.com/pkubowicz/opendetex">opendetex</a> and manual editing. It would be extra cool if I could figure out how to work this into the Python process.</li>
</ul>
<h3>Sub-scripts</h3>
<p>Here are all the promised scripts. Please note that they are actually &#8220;.txt&#8221; files, so if you want to run them yourself please manually change the file extension.<br />
<a href="http://realerthinks.com/wordpress/wp-content/uploads/2017/09/cliches.txt">cliches</a>, <a href="http://realerthinks.com/wordpress/wp-content/uploads/2017/09/colors.txt">colors</a>, <a href="http://realerthinks.com/wordpress/wp-content/uploads/2017/09/filler_words.txt">filler_words</a>, <a href="http://realerthinks.com/wordpress/wp-content/uploads/2017/09/homophone_list.txt">homophone_list</a>, <a href="http://realerthinks.com/wordpress/wp-content/uploads/2017/09/nominalizations.txt">nominalizations</a>, <a href="http://realerthinks.com/wordpress/wp-content/uploads/2017/09/weak_words.txt">weak_words</a></p>
<p>The post <a href="http://realerthinks.com/programming-grammar-style-editor/">Programming a grammar and style editor</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://realerthinks.com/programming-grammar-style-editor/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Explore Statistical Mechanics: An Interactive Tutorial</title>
		<link>http://realerthinks.com/explore-statistical-mechanics-interactive-tutorial/</link>
					<comments>http://realerthinks.com/explore-statistical-mechanics-interactive-tutorial/#respond</comments>
		
		<dc:creator><![CDATA[Addie]]></dc:creator>
		<pubDate>Thu, 07 Sep 2017 16:31:06 +0000</pubDate>
				<category><![CDATA[Data Analysis]]></category>
		<category><![CDATA[chemistry]]></category>
		<category><![CDATA[numpy]]></category>
		<category><![CDATA[personal research]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[statistical mechanics]]></category>
		<category><![CDATA[statistics]]></category>
		<guid isPermaLink="false">http://realerthinks.com/?p=416</guid>

					<description><![CDATA[<p>Update (18-07-19): Most unfortunately, my PhD advisor no longer works at the University of Washington, and so this site is no longer available. I didn&#8217;t get a mirror up in time. At least I learned a lot about AWS, Docker, and webhosting? Those are all coming in quite handy at my current job. Greetings! I&#8217;ve [&#8230;]</p>
<p>The post <a href="http://realerthinks.com/explore-statistical-mechanics-interactive-tutorial/">Explore Statistical Mechanics: An Interactive Tutorial</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Update (18-07-19): Most unfortunately, my PhD advisor no longer works at the University of Washington, and so this site is no longer available. I didn&#8217;t get a mirror up in time. At least I learned a lot about AWS, Docker, and webhosting? Those are all coming in quite handy at my current job.</p>


<p>Greetings!</p>
<p>I&#8217;ve been working on a super top secret project for several months now and it&#8217;s finally been published, so I can share it with you!</p>
<p>My friends, may I introduce to you <del><a href="http://depts.washington.edu/mbmgrp/explorestatmech">Explore Stat Mech</a></del>! It&#8217;s a website where you can (interactively) explore concepts directly related to statistical mechanics (and by proxy, my personal research). Go poke around! You can make <strong><em>movies</em></strong> where atoms will collide. You can change parameters around and see how they affect things in real time.</p>
<p>I&#8217;m going to be adding more content over the next few months; hopefully we&#8217;ll get some cool stuff about real-world applications of these simulations, the <a href="https://en.wikipedia.org/wiki/Ising_model">Ising Model</a>, and using linear algebra to make everything much more efficient. Tell your friends! This should turn out to be an excellent resource for learning about this fantastic branch of chemistry!</p><p>The post <a href="http://realerthinks.com/explore-statistical-mechanics-interactive-tutorial/">Explore Statistical Mechanics: An Interactive Tutorial</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://realerthinks.com/explore-statistical-mechanics-interactive-tutorial/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Creating an Othello Tutor: Step 4, Applying a Neural Network</title>
		<link>http://realerthinks.com/creating-othello-tutor-step-4-applying-neural-network/</link>
					<comments>http://realerthinks.com/creating-othello-tutor-step-4-applying-neural-network/#respond</comments>
		
		<dc:creator><![CDATA[Addie]]></dc:creator>
		<pubDate>Thu, 31 Aug 2017 21:10:29 +0000</pubDate>
				<category><![CDATA[Data Analysis]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[machine learning]]></category>
		<category><![CDATA[numpy]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[reinforcement learning]]></category>
		<category><![CDATA[technical]]></category>
		<category><![CDATA[tensorflow]]></category>
		<guid isPermaLink="false">http://realerthinks.com/?p=410</guid>

					<description><![CDATA[<p>Why hello there! I&#8217;ve doing a series on creating an Othello AI that will not just play Othello with you, but will teach you how to become a better player. So far I&#8217;ve covered: The rules of the game, and my motivation for this project Exploring basic artificial intelligence Reinforcement learning basics I was planning on doing [&#8230;]</p>
<p>The post <a href="http://realerthinks.com/creating-othello-tutor-step-4-applying-neural-network/">Creating an Othello Tutor: Step 4, Applying a Neural Network</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Why hello there!</p>
<p>I&#8217;ve doing a series on creating an Othello AI that will not just play Othello with you, but will <em>teach</em> you how to become a better player.</p>
<p>So far I&#8217;ve covered:</p>
<ul>
<li><a href="http://realerthinks.com/?p=377" class="broken_link" rel="nofollow">The rules of the game, and my motivation for this project</a></li>
<li><a href="https://realerthinks.com/?p=384" class="broken_link" rel="nofollow">Exploring basic artificial intelligence</a></li>
<li><a href="http://realerthinks.com/?p=387" class="broken_link" rel="nofollow">Reinforcement learning basics</a></li>
</ul>
<p>I was planning on doing a lot more with this project, but I&#8217;ve found that I&#8217;ve really started hating it (hence the severe lack of updates). Rather than continuously put it off and let my blog wither and die, I&#8217;m going to dump all of my code and instead pick up a different project.</p>
<p>This is supposed to be a fun thing for me!</p>
<h3>Quick Background (and/or Pontificating)</h3>
<p>This code is based on my previous work with Othello (see the previous links) and on the great tutorial by <a href="https://medium.com/@awjuliani" class="broken_link" rel="nofollow">Arthur Juliani</a> about <a href="https://medium.com/@awjuliani/simple-reinforcement-learning-with-tensorflow-part-4-deep-q-networks-and-beyond-8438a3e2b8df" class="broken_link" rel="nofollow">Reinforcement Learning with Tensorflow</a>. Arthur&#8217;s stuff is great, but I found some of the naming conventions a little hard to understand. I&#8217;ve adapted my own names to a system that makes sense for me. I recommend comparing and contrasting the two bits of code to find something that works for you.</p>
<p>A couple of notes before I code-dump:</p>
<ul>
<li>The code works insomuch as it will teach the AI to play Othello. It doesn&#8217;t, however, teach it to play <strong>well</strong>. The AI learns that every move is exactly the same value (which is not true). To improve that, I would need to implement some look-ahead in the code, which is about where I gave up on this project. A great example of getting this to work is OmegaOthello by khaotik.</li>
<li>I have not spent time documenting this code. Normally I&#8217;d like a lot more comments, docstrings, or at least explanations of what the crap I&#8217;m doing. If you are at all confused about what&#8217;s going on, I&#8217;ll point you again to <a href="https://medium.com/@awjuliani/simple-reinforcement-learning-with-tensorflow-part-4-deep-q-networks-and-beyond-8438a3e2b8df" class="broken_link" rel="nofollow">Arthur Juliani&#8217;s Reinforcement Learning tutorial</a>. Arthur does a fantastic job explaining all of the concepts that I&#8217;ve implemented.</li>
</ul>
<h3>More Code than You Ever Needed in a Single Block</h3>
<p></p><pre class="crayon-plain-tag">import numpy as np
import os
import random
import tensorflow as tf
import tensorflow.contrib.slim as slim

from board import Board  # from part 1 of this series

BATCH_SIZE = 32
UPDATE_FREQ = 4
TAU = 1E-3  # Rate to update target network toward primary network.
Y = 0.99 
LOAD_MODEL = False  # Load a saved model?
PATH = './dqn'  # Path to save model.
BUFFER_SIZE = 5E4  # Num. moves to keep in buffer.
H_SIZE = 64  # Num. filters on final convolution layer.
NUM_GAMES = int(1E4)
SAVE_GAMES = int(1E3)


class QNetwork(object):
    def __init__(self, h_size=H_SIZE):
        self.current_player = 0

        self.scalar_input = tf.placeholder(shape=[None, 64], dtype=tf.int32)
        self._n_scalars = tf.shape(self.scalar_input)[0]
        self.move_mask = tf.placeholder(shape=[None, 64], dtype=tf.float32)

        self.board_onehot = tf.one_hot(self.scalar_input, 3, dtype=tf.float32)
        self._X = tf.split(self.board_onehot, 3, 2)
        self._Y = tf.transpose(
            tf.stack([
                tf.ones([self._n_scalars, 64, 1]),
                self._X[self.current_player],
                self._X[1-self.current_player],
                ])
            )
        self.pre_pad = tf.reshape(self._Y, (-1, 8, 8, 3))
        self._pads = tf.constant([[0, 0], [1, 1], [1, 1], [0, 0]])
        self.board_state = tf.pad(self.pre_pad, self._pads, 'CONSTANT')

        # Convolution layers decreasing board size each step
        self._conv1 = tf.tanh(slim.conv2d(
            inputs=self.board_state, num_outputs=16, kernel_size=[3, 3],
            stride=[1, 1], padding='VALID', biases_initializer=None))
        self._conv2 = tf.tanh(slim.conv2d(
            inputs=self._conv1, num_outputs=32, kernel_size=[2, 2],
            stride=[1, 1], padding='VALID', biases_initializer=None))
        self._conv3 = tf.tanh(slim.conv2d(
            inputs=self._conv2, num_outputs=32, kernel_size=[2, 2],
            stride=[1, 1], padding='VALID', biases_initializer=None))
        self._conv4 = tf.tanh(slim.conv2d(
            inputs=self._conv3, num_outputs=32, kernel_size=[2, 2],
            stride=[1, 1], padding='VALID', biases_initializer=None))
        self._conv5 = tf.tanh(slim.conv2d(
            inputs=self._conv4, num_outputs=32, kernel_size=[2, 2],
            stride=[1, 1], padding='VALID', biases_initializer=None))
        self._conv6 = tf.tanh(slim.conv2d(
            inputs=self._conv5, num_outputs=32, kernel_size=[2, 2],
            stride=[1, 1], padding='VALID', biases_initializer=None))
        self._conv7 = tf.tanh(slim.conv2d(
            inputs=self._conv6, num_outputs=32, kernel_size=[2, 2],
            stride=[1, 1], padding='VALID', biases_initializer=None))
        self._conv8 = slim.flatten(tf.tanh(slim.conv2d(
            inputs=self._conv7, num_outputs=h_size, kernel_size=[2, 2],
            stride=[1, 1], padding='VALID', biases_initializer=None)))

        # Break apart for Dueling DQN
        self._streamA, self._streamV = tf.split(self._conv8, 2, 1)
        xavier_init = tf.contrib.layers.xavier_initializer()
        self.AW = tf.Variable(xavier_init([h_size/2, 64]))
        self.VW = tf.Variable(xavier_init([h_size/2, 1]))
        self.advantage = tf.matmul(self._streamA, self.AW)
        self.value = tf.matmul(self._streamV, self.VW)

        # Combine together to get final Q-values.
        self._Q_all = self.value + tf.subtract(
            self.advantage,
            tf.reduce_mean(self.advantage, axis=1, keep_dims=True))
        self.Q_out = tf.multiply(tf.exp(self._Q_all), self.move_mask)
        self.predict = tf.multinomial(tf.log(self.Q_out), 1)[0][0]

        # Obtain loss function by taking the sum-of-squares difference
        # between the target and prediction Q-values.
        self.Q_target = tf.placeholder(shape=[None], dtype=tf.float32)
        self.actions = tf.placeholder(shape=[None], dtype=tf.int32)
        self._actions_onehot = tf.one_hot(self.actions, 64, dtype=tf.float32)

        self._Q = tf.reduce_sum(tf.multiply(
            self.Q_out, self._actions_onehot), axis=1)
        self._td_error = tf.square(self.Q_target - self._Q)
        self._loss = tf.reduce_mean(self._td_error)
        self._trainer = tf.train.AdamOptimizer(learning_rate=0.0001)
        self.update_model = self._trainer.minimize(self._loss)


class ExperienceBuffer():
    def __init__(self, buffer_size=BUFFER_SIZE):
        self.buffer = []
        self.buffer_size = buffer_size

    def add(self, experience):
        tot_len = len(self.buffer) + len(experience)
        if tot_len &gt;= self.buffer_size:
            self.buffer = self.buffer[int(tot_len - self.buffer_size):]
        self.buffer.extend(experience)

    def sample(self, size):
        return np.reshape(
            np.array(random.sample(self.buffer, size)), [size, 6])


def move_index_to_coord(idx):
    coord_move = np.zeros(64)
    coord_move[idx] = 1
    return tuple(np.argwhere(coord_move.reshape(8, 8))[0])


def update_target_graph(tf_vars, tau=TAU):
    """
    Update parameters of target network.

    target = tau*primary + (1-tau)*target"""
    total_vars = len(tf_vars)
    op_holder = []
    for idx, var in enumerate(tf_vars[:total_vars/2]):
        op_holder.append(tf_vars[idx+total_vars/2].assign(
            (var.value()*tau) + (
                (1 - tau) * tf_vars[idx+total_vars//2].value()
                )))
    return op_holder


def update_target(op_holder, sess):
    for op in op_holder:
        sess.run(op)


tf.reset_default_graph()
main_QN = QNetwork()
Q_targetN = QNetwork()

init = tf.global_variables_initializer()
saver = tf.train.Saver()
target_ops = update_target_graph(tf.trainable_variables())
my_buffer = ExperienceBuffer()

r_list = []  # Final score of each game.
total_steps = 0


# Make a path for our model to be saved in.
if not os.path.exists(PATH):
    os.makedirs(PATH)
    
    
if __name__ == '__main__':
    with tf.Session() as sess:
        sess.run(init)
        if LOAD_MODEL is True:
            print 'Loading Model...'
            ckpt = tf.train.get_checkpoint_state(PATH)
            saver.restore(sess, ckpt.model_checkpoint_path)
        update_target(target_ops, sess)
        for i in range(NUM_GAMES):
            coin_flip = random.randint(0, 1)
            episode_buffer = ExperienceBuffer()
            b = Board(verbose=False)
            s = b.board_state_list[np.newaxis, :]
            r = 0
            while b.game_over is False:
                valid_moves = np.where(
                    [[x.is_valid_move for x in row] for row in b.board_state])
                move_mask = np.zeros_like(b.board_state, dtype='float32')
                move_mask[valid_moves] = 1
                move_mask = move_mask.flatten()[np.newaxis, :]
    
                if b.current_player == coin_flip:
                    # If my move.
                    main_QN.current_player = b.current_player
                    a = sess.run(
                        main_QN.predict,
                        feed_dict={
                           main_QN.scalar_input: s,
                           main_QN.move_mask: move_mask
                           })
                    b.coord_move(move_index_to_coord(a))
                    s1 = b.board_state_list[np.newaxis, :]
                    total_steps += 1
                    episode_buffer.add(
                        np.reshape(
                            np.array([s, a, r, s1, b.game_over, move_mask]),
                            [1, 6]))
    
                    if i &gt; 1 and total_steps % UPDATE_FREQ == 0:
                        # Get a random batch of experiences
                        # Perform Double-DQN update to the target Q-values
                        train_batch = my_buffer.sample(BATCH_SIZE)
                        main_QN.current_player = b.current_player
                        Q_targetN.current_player = b.current_player
                        A1 = sess.run(
                            main_QN.predict,
                            feed_dict={
                                main_QN.scalar_input:
                                    np.vstack(train_batch[:, 3]),
                                main_QN.move_mask:
                                    np.vstack(train_batch[:, 5])})
                        Q2 = sess.run(
                            Q_targetN.Q_out,
                            feed_dict={
                                Q_targetN.scalar_input:
                                    np.vstack(train_batch[:, 3]),
                                Q_targetN.move_mask:
                                    np.vstack(train_batch[:, 5])})
                        doubleQ = Q2[range(BATCH_SIZE), A1]
                        Q_target = train_batch[:, 2] + Y*doubleQ
    
                        # Update the network with our target values.
                        _ = sess.run(
                            main_QN.update_model,
                            feed_dict={
                                main_QN.scalar_input: np.vstack(
                                    train_batch[:, 0]),
                                main_QN.move_mask: np.vstack(
                                    train_batch[:, 5]),
                                main_QN.Q_target: Q_target,
                                main_QN.actions: train_batch[:, 1]})
    
                        # Set target network equal to primary network.
                        update_target(target_ops, sess)
                else:
                    # If opponent's move.
                    Q_targetN.current_player = b.current_player
                    a = sess.run(Q_targetN.predict,
                                 feed_dict={
                                    Q_targetN.scalar_input: s,
                                    Q_targetN.move_mask: move_mask
                                    })
                    b.coord_move(move_index_to_coord(a))
                    s1 = b.board_state_list[np.newaxis, :]
    
                if b.game_over is True:
                    score = [b.p0_score, b.p1_score]
                    my_score = score[coin_flip]
                    their_score = score[1 - coin_flip]
                    if my_score &gt; their_score:
                        r = 1
                    else:
                        r = -1
                s = s1
    
            my_buffer.add(episode_buffer.buffer)
            r_list += [r]
    
            # Periodically save the model.
            if i % SAVE_GAMES == 0:
                saver.save(sess, '%s/model-%s.cptk' % (PATH, i))
                print 'Saved Model'
            if len(r_list) % 10 == 0:
                print i+1, total_steps, np.mean(r_list[-10:])
    
        # Save at completion.
        saver.save(sess, '%s/model-%s.cptk' % (PATH, i))</pre><p>&nbsp;</p>
<p>The post <a href="http://realerthinks.com/creating-othello-tutor-step-4-applying-neural-network/">Creating an Othello Tutor: Step 4, Applying a Neural Network</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://realerthinks.com/creating-othello-tutor-step-4-applying-neural-network/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Creating an Othello Tutor: Step 3, Learning Reinforcement Learning</title>
		<link>http://realerthinks.com/creating-othello-tutor-step-3-learning-reinforcement-learning/</link>
					<comments>http://realerthinks.com/creating-othello-tutor-step-3-learning-reinforcement-learning/#respond</comments>
		
		<dc:creator><![CDATA[Addie]]></dc:creator>
		<pubDate>Tue, 11 Jul 2017 17:59:46 +0000</pubDate>
				<category><![CDATA[Data Analysis]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[machine learning]]></category>
		<category><![CDATA[numpy]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[reinforcement learning]]></category>
		<category><![CDATA[technical]]></category>
		<guid isPermaLink="false">http://realerthinks.com/?p=387</guid>

					<description><![CDATA[<p>Hello, friends! Today we&#8217;re going to be learning about reinforcement learning. How meta! The ultimate goal of this endeavor is to create an artificial intelligence that is a strong Othello player, and can teach you how to become stronger yourself. I explained the rules of Othello, my motivation, and how to create a playable game in [&#8230;]</p>
<p>The post <a href="http://realerthinks.com/creating-othello-tutor-step-3-learning-reinforcement-learning/">Creating an Othello Tutor: Step 3, Learning Reinforcement Learning</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hello, friends! Today we&#8217;re going to be learning about reinforcement learning. How meta!</p>
<p>The ultimate goal of this endeavor is to create an artificial intelligence that is a strong Othello player, and can <em>teach</em> you how to become stronger yourself.</p>
<p>I explained the rules of Othello, my motivation, and how to create a playable game in <a href="http://realerthinks.com/2017/05/?p=377" class="broken_link" rel="nofollow">Step 1 of this series</a>.</p>
<p>I created some basic artificial intelligence in <a href="https://realerthinks.com/?p=384" class="broken_link" rel="nofollow">Step 2 of this series</a>.</p>
<p>The next thing I want to do is to use machine learning to create an <strong>even better</strong> artificial intelligence, but before I can even do that, I need to learn how to implement reinforcement learning.</p>
<h4>Reinforcement learning is different from traditional machine learning</h4>
<p>In many machine learning aspects, the cause/effect relationship is fairly obvious: A house with X square feet, Y bedrooms, and Z bathrooms in neighborhood Q will cost, on average N dollars. An <a href="https://realerthinks.com/2017/04/?p=344" class="broken_link" rel="nofollow">abalone</a> with adult characteristics that is M centimeters long and weighs P grams will have, on average, D age rings.</p>
<p>Some settings where we want machine learning have less obvious goals; to say it in another way, those goals might be delayed over time. Games are a prime example: a move now might be beneficial for winning, but you may not know that until much later in play. <strong>Reinforcement learning</strong> is ideal for these situations: situations where your AI has delayed rewards.</p>
<h4>Someone like Q</h4>
<p>First we need to introduce the idea of a <strong>Q-table</strong>. In it&#8217;s most simple form, a Q-table is an <code>N</code>x<code>M</code> matrix, where <code>N</code> is the number of states, and <code>M</code> is the number of actions you can take. If you are in the <code>n</code>th state, you look look at row <code>n</code> of your Q-table, and each column entry is your &#8220;probability&#8221; of choosing the associated action. Without jumping too far ahead of ourselves, we can summarize reinforcement learning as the process by which one generates the most accurate Q-table possible.</p>
<h5>Big yellow taxi</h5>
<p>Let&#8217;s create an example, shall we? I&#8217;m going to be using <a href="https://gym.openai.com/">OpenAI Gym</a>, a collection of toy puzzles to start folks on their machine learning journey. I&#8217;m rather partial to the <a href="https://gym.openai.com/envs/Taxi-v1" class="broken_link" rel="nofollow">taxi game</a> example. From the documentation:</p>
<blockquote><p>This task was introduced in [Dietterich2000] to illustrate some issues in hierarchical reinforcement learning. There are 4 locations (labeled by different letters) and your job is to pick up the passenger at one location and drop [them] off in another. You receive +20 points for a successful dropoff, and lose 1 point for every timestep it takes. There is also a 10 point penalty for illegal pick-up and drop-off actions.</p></blockquote>
<p>So let&#8217;s initialize some Python, shall we?</p><pre class="crayon-plain-tag">import gym
import numpy as np

game = 'Taxi-v2'
env = gym.make(game)
Q = np.zeros([env.observation_space.n, env.action_space.n])</pre><p>We can see what the game-state looks like with <code>env.render()</code>:</p>
<p><img loading="lazy" decoding="async" id="longdesc-return-401" class="aligncenter size-full wp-image-401" tabindex="-1" src="http://realerthinks.com/wordpress/wp-content/uploads/2017/07/taxi_render.png" alt="The taxi game setup. The game is made of ASCII art; obstacles are represented with pipe characters, pickup/dropoff locations are the letters RGYB (in the corners, clockwise from top left); currently the &quot;taxi&quot;, a yellow-highlighted square, is on &quot;Y&quot; in the bottom left corner." width="99" height="128" longdesc="http://students.washington.edu/adelak?longdesc=401&amp;referrer=387" /></p>
<p>We also have a matrix, <code>Q</code>, which is <code>500x6</code> because <code>env.observation_space.n</code> (the number of possible states of the system) is 500 and <code>env.action_space.n</code> (the number of actions) is 6 (up, down, left, right, pick up, drop off).</p>
<h5>Saved by the Bellman</h5>
<p>Now that we have a Q-table, we want it to be something other than all-zeros; we&#8217;ll be updating it with a little something called the <a href="https://en.wikipedia.org/wiki/Bellman_equation">Bellman Equation</a>:</p>
<p><img loading="lazy" decoding="async" src="http://realerthinks.com/wordpress/wp-content/ql-cache/quicklatex.com-c4be1c67952422066affc1078e3e45d8_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#81;&#40;&#115;&#44;&#97;&#41;&#32;&#61;&#32;&#114;&#32;&#43;&#32;&#92;&#103;&#97;&#109;&#109;&#97;&#32;&#42;&#32;&#92;&#116;&#101;&#120;&#116;&#123;&#109;&#97;&#120;&#125;&#32;&#92;&#98;&#105;&#103;&#40;&#32;&#81;&#40;&#115;&#39;&#41;&#32;&#92;&#98;&#105;&#103;&#41;" title="Rendered by QuickLaTeX.com" height="22" width="222" style="vertical-align: -7px;"/></p>
<p>Which is to say, our table <img loading="lazy" decoding="async" src="http://realerthinks.com/wordpress/wp-content/ql-cache/quicklatex.com-2c758bec4c272382411b95fc0e7ee250_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#81;" title="Rendered by QuickLaTeX.com" height="16" width="14" style="vertical-align: -4px;"/> at state <img loading="lazy" decoding="async" src="http://realerthinks.com/wordpress/wp-content/ql-cache/quicklatex.com-ae1901659f469e6be883797bfd30f4f8_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#115;" title="Rendered by QuickLaTeX.com" height="8" width="8" style="vertical-align: 0px;"/> and taking action <img loading="lazy" decoding="async" src="http://realerthinks.com/wordpress/wp-content/ql-cache/quicklatex.com-5c53d6ebabdbcfa4e107550ea60b1b19_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#97;" title="Rendered by QuickLaTeX.com" height="8" width="9" style="vertical-align: 0px;"/> should have a value of its current reward <img loading="lazy" decoding="async" src="http://realerthinks.com/wordpress/wp-content/ql-cache/quicklatex.com-c409433a9e2dfcdb83360a974d243f18_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#114;" title="Rendered by QuickLaTeX.com" height="8" width="8" style="vertical-align: 0px;"/> (given to use by the game) and the maximum discounted (<img loading="lazy" decoding="async" src="http://realerthinks.com/wordpress/wp-content/ql-cache/quicklatex.com-4de02fc502ed5dbd15f371728ea270a3_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#92;&#103;&#97;&#109;&#109;&#97;" title="Rendered by QuickLaTeX.com" height="12" width="10" style="vertical-align: -4px;"/>) future reward that we expect for being in the new state, <img loading="lazy" decoding="async" src="http://realerthinks.com/wordpress/wp-content/ql-cache/quicklatex.com-7bc7053f2932cafc2f41141faa219498_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#115;&#39;" title="Rendered by QuickLaTeX.com" height="14" width="12" style="vertical-align: 0px;"/>. You can imagine that if you play through many times, the winning combination will start to trickle through from end to beginning, until you have an accurate Q-table that can predict long-term rewards.</p>
<h5>Learning point</h5>
<p>What do you think? Do we have to tools to put this all together and create a Q-table?</p><pre class="crayon-plain-tag"># Set learning parameters.
lr = 0.85  # Learning rate
gamma = 0.99
num_episodes = 2000  # AKA number of times to play.
# Create lists to contain total rewards and steps per episode.
j_list = []
r_list = []

for i in range(num_episodes):
    # Reset environment and get first new observation.
    s = env.reset()
    r_tot = 0  # Total reward so far
    d = False  # Is the game 'done'?
    j = 0  # We have taken 'j' steps.
    # The Q-Table learning algorithm.
    while j &lt; 99:
        j += 1
        # Choose an action by greedily (with noise) picking from Q table.
        # Note that the noise decreases with num. games played.
        a = np.argmax(Q[s] + np.random.randn(1, env.action_space.n)*(1./(i+1)))
        # Get new state, reward, 'done' from environment.
        s1, r, d, _ = env.step(a)
        # Update Q-Table with new knowledge according to Bellman.
        Q[s, a] += lr*(r + gamma*np.max(Q[s1]) - Q[s, a])
        r_tot += r
        s = s1
        if d is True:
            break
    j_list.append(j)  # Total number of steps
    r_list.append(r_tot)  # Total reward

print 'Score over time: %s' % (np.average(r_list))
print 'Score over last half: %s' % (np.average(r_list[1000:]))</pre><p></p>
<h5>Check it</h5>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" id="longdesc-return-402" class="aligncenter size-full wp-image-402" tabindex="-1" src="http://realerthinks.com/wordpress/wp-content/uploads/2017/07/taxi_graphs.png" alt="Two graphs are shown. The top is number of steps vs. simulation number, depicted in blue. The x-axis ranges from 0-2000. y-values start at about 100 and decay to 0-20 by step 600. The bottom graph is reward vs. simulation number, depicted in green. The x-axis ranges from 0-2000. y-values start at about -350 and increase to 0-20 by step 600." width="640" height="480" longdesc="http://students.washington.edu/adelak?longdesc=402&amp;referrer=387" srcset="http://realerthinks.com/wordpress/wp-content/uploads/2017/07/taxi_graphs.png 640w, http://realerthinks.com/wordpress/wp-content/uploads/2017/07/taxi_graphs-300x225.png 300w, http://realerthinks.com/wordpress/wp-content/uploads/2017/07/taxi_graphs-375x281.png 375w" sizes="auto, (max-width: 640px) 100vw, 640px" /></p>
<p>Well, plotting the number of moves over time shows that the algorithm definitely started taking fewer moves right around iteration 600. That&#8217;s also about the time that the cumulative rewards start being positive instead of, I don&#8217;t know, <strong>-350</strong>! I&#8217;d say we definitely taught the algorithm to do something! But what!? Let&#8217;s watch:</p><pre class="crayon-plain-tag"># Reset environment and show a simulation.
# Essentially same code as before, but with no learning
s = env.reset()
env.render()
d = False
while d is False:
    # time.sleep(1)  # Import time.time if you want to slow it down.
    a = np.argmax(Q[s])
    s1, r, d, _ = env.step(a)
    s = s1
    env.render()</pre><p><img loading="lazy" decoding="async" id="longdesc-return-400" class="aligncenter size-full wp-image-400" tabindex="-1" src="http://realerthinks.com/wordpress/wp-content/uploads/2017/07/Taxi.gif" alt="An animation of the taxi setup; the taxi car successfully navigates around obstacles to the passenger in the lower left corner, then successfully navigates to the upper right to drop the passenger off." width="99" height="128" longdesc="http://students.washington.edu/adelak?longdesc=400&amp;referrer=387" /></p>
<h4>Next up: Adding a neural network</h4>
<p>So obviously Othello is a lot more complicated than this taxi game. It has a LOT more game states (on the order of <img loading="lazy" decoding="async" src="http://realerthinks.com/wordpress/wp-content/ql-cache/quicklatex.com-2dc2f19bef8716625b36dd9044e28a6a_l3.png" class="ql-img-inline-formula quicklatex-auto-format" alt="&#54;&#52;&#94;&#123;&#51;&#125;&#32;&#92;&#97;&#112;&#112;&#114;&#111;&#120;&#32;&#50;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#49;&#48;&#94;&#53;" title="Rendered by QuickLaTeX.com" height="16" width="105" style="vertical-align: -1px;"/>.) Next week we&#8217;re going to take the taxi example a bit further and use a neural network to generate the Q-table. If this sounds like overkill, it definitely is. But it&#8217;s a great step on our learning journey!</p>
<h4>Standing on the shoulders of giants</h4>
<p>I have to throw out a huge acknowledgement to <a href="https://medium.com/@awjuliani?source=post_header_lockup" class="broken_link" rel="nofollow">Arthur Juliani</a>, whose two posts about <a href="https://medium.com/emergent-future/simple-reinforcement-learning-with-tensorflow-part-0-q-learning-with-tables-and-neural-networks-d195264329d0" class="broken_link" rel="nofollow">Q-learning tables</a> and <a href="https://medium.com/@awjuliani/simple-reinforcement-learning-with-tensorflow-part-4-deep-q-networks-and-beyond-8438a3e2b8df" class="broken_link" rel="nofollow">deep Q-learning networks</a> were basically 100% of how I wrote this article. If you find my work at all interesting, you should definitely check out the examples and explanations over there!</p>
<p>The post <a href="http://realerthinks.com/creating-othello-tutor-step-3-learning-reinforcement-learning/">Creating an Othello Tutor: Step 3, Learning Reinforcement Learning</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://realerthinks.com/creating-othello-tutor-step-3-learning-reinforcement-learning/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Creating an Othello Tutor: Step 2, Introducing basic AI</title>
		<link>http://realerthinks.com/creating-othello-tutor-step-2-introducing-basic-ai/</link>
					<comments>http://realerthinks.com/creating-othello-tutor-step-2-introducing-basic-ai/#respond</comments>
		
		<dc:creator><![CDATA[Addie]]></dc:creator>
		<pubDate>Wed, 10 May 2017 03:30:16 +0000</pubDate>
				<category><![CDATA[Data Analysis]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[numpy]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[python classes]]></category>
		<category><![CDATA[technical]]></category>
		<guid isPermaLink="false">http://realerthinks.com/?p=384</guid>

					<description><![CDATA[<p>Greetings everyone! Today I want to talk about making an artificial intelligence for my Othello game that I created last week. If you haven&#8217;t read that post already, I&#8217;d recommend going back to do so; I&#8217;ll be referencing some of the code I implemented, and at least assume you know what Othello is and the basics of [&#8230;]</p>
<p>The post <a href="http://realerthinks.com/creating-othello-tutor-step-2-introducing-basic-ai/">Creating an Othello Tutor: Step 2, Introducing basic AI</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Greetings everyone! Today I want to talk about making an artificial intelligence for <a href="http://realerthinks.com/2017/05/?p=377" class="broken_link" rel="nofollow">my Othello game that I created last week</a>. If you haven&#8217;t read that post already, I&#8217;d recommend going back to do so; I&#8217;ll be referencing some of the code I implemented, and at least assume you know what Othello is and the basics of play.<span title='You may be like me and prefer to read the first article you found. That&#8217;s totally fine, too! You do you.' class='inline-footnote' style=''>8<span class='footnoteContent' style='display:none;'>You may be like me and prefer to read the first article you found. That&#8217;s totally fine, too! You do you.</span></span></p>
<h4>Importing packages</h4>
<p></p><pre class="crayon-plain-tag">import copy  # Copy objects, don't just point to them.
import numpy as np  # Linear algebra libraries.

import board  # The code I wrote last week.</pre><p></p>
<h4>Start up the class</h4>
<p></p><pre class="crayon-plain-tag">class AI(object):
    """
    Artificial intelligence for playing Othello.

    Instance variables:
        max_lvl - highest available level of intelligence
        strategy - int in range [0, max_lvl] indicating strategy level
            0 - take random available space
            1 - maximize number of disks taken
            2 - take square with highest available weight
            3 - maximize weights of move + all flipped disks
            4 - minimize opponent's liberties

    Methods:
        move - take a move on the given board state
    """
    _weights = np.array([[ 64, -30,  10,   5,   5,  10, -30,  64],
                         [-30, -40,   2,   2,   2,   2, -40, -30],
                         [ 10,   2,   5,   1,   1,   5,   2,  10],
                         [  5,   2,   1,   1,   1,   1,   2,   5],
                         [  5,   2,   1,   1,   1,   1,   2,   5],
                         [ 10,   2,   5,   1,   1,   5,   2,  10],
                         [-30, -40,   2,   2,   2,   2, -40, -30],
                         [ 64, -30,  10,   5,   5,  10, -30,  64]])
    max_lvl = 4</pre><p>Not much to see here except documentation. I recommend always putting docstrings on things; it makes it so much easier to read your code! Future you will also thank you: give it a year and I guarantee you won&#8217;t remember what <code>x_prime_tilde_2</code> means. I define a &#8220;secret&#8221; variable at this level<span title='by putting the underscore out in front of it' class='inline-footnote' style=''>2<span class='footnoteContent' style='display:none;'>by putting the underscore out in front of it</span></span>, the point values or weights of each square in the game. This will be used later for the point-based approach.</p>
<p>Also remember: any code you see after this point is still attached to the <code>AI</code> class as a method, hence the extra indent.</p>
<h4>Initialize!</h4>
<p></p><pre class="crayon-plain-tag">def __init__(self, strategy=-1):
        """
        Initialize AI.

        Optional arguments:
            strategy - a number from -1 to max_lvl; default -1 = random

        Raises:
            ValueError - if invalid strategy passed
        """
        if strategy not in range(-1, self.max_lvl+1):
            raise ValueError('strategy level must be an integer from ' \
                             '-1 to %s' % (self.max_lvl))
        if strategy == -1:
            strategy = np.randint(self.max_lvl+1)

        self.strategy = strategy</pre><p>Mostly this just sets the strategy level a particular AI object would use, with a default to be random and a check that we&#8217;re actually given a valid number.</p>
<h4>Level 0: Random Move</h4>
<p></p><pre class="crayon-plain-tag">def _rand_move(self, possible_moves):
        """Take a random allowed move."""
        weights = np.zeros(len(possible_moves))
        return weights</pre><p>There are two design choices here I want to comment on:</p>
<ol>
<li>Every method tied to a strategy level I have made hidden/secret/private with an underscore before its name. Any public method is<span title='or should be' class='inline-footnote' style=''>3<span class='footnoteContent' style='display:none;'>or should be</span></span> a promise from the developer that the method will stick around. I wanted my strategy methods to be more behind-the-scenes.</li>
<li>I could have had each strategy method return a move choice from the list of possible moves, but I instead decided to have it return a list of probabilities; this serves several functions:
<ul>
<li>I don&#8217;t need to re-write the &#8220;random choice&#8221; code over and over and over again</li>
<li>I can initialize other methods with the weights from a previous method.</li>
<li>I can future-proof this in case I want to implement multiple &#8220;choice&#8221; methods: do I always want to take the best move, or do I want to add some stochastic effects to make games a little more interesting?</li>
</ul>
</li>
</ol>
<h4>Level 1: Take the most pieces</h4>
<p></p><pre class="crayon-plain-tag">def _most_pieces(self, possible_moves):
        """Take the move which flips the largest number of disks."""
        weights = np.array([len(p[1]) for p in possible_moves])
        return weights</pre><p>Recall that <code>possible_moves</code> comes from the <code>board.Board</code> class. For each entry, the first element is the move, the second element is a list of disks flipped from that move.</p>
<h4>Levels 2-3: Use a point system to evaluate board position</h4>
<p></p><pre class="crayon-plain-tag">def _by_weight(self, possible_moves):
        """Take the square with highest available weight."""
        weights = self._weights[zip(*[x[0] for x in possible_moves])]
        return weights

    def _by_weight_all(self, possible_moves):
        """Maximize weights of the move and all flipped disks."""
        placed_weights = self._by_weight(possible_moves)
        flipped_disks = [p[1] for p in possible_moves]
        flipped_weights = np.array([
            sum([self._weights[f] for f in fs]) for fs in flipped_disks])
        weights = flipped_weights + placed_weights
        return weights</pre><p>This is just some tomfoolery to do a table-lookup on the <code>_weights</code> variable created earlier.</p>
<h4>Level 4: Limit Liberties</h4>
<p></p><pre class="crayon-plain-tag">def _liberties(self, b):
        """Decrease number of opponent's moves."""
        n_moves_remaining = 64 - (b.p0_score + b.p1_score)
        possible_moves = b.get_valid_moves()
        weights = self._by_weight(possible_moves)
        if n_moves_remaining &lt; 25:
            weights = weights + self._most_pieces(possible_moves)
            scale = 1
        else:
            scale = 2

        for i, move in enumerate(possible_moves):
            newboard = copy.deepcopy(b)
            newboard.verbose = False
            newboard.coord_move(move[0])
            if newboard.current_player == b.current_player:
                continue
            n_opponent_moves = len(np.argwhere([
                [r.is_valid_move for r in row]
                for row in newboard.board_state]))
            weights[i] -= scale*n_opponent_moves
        return weights</pre><p>As you can see, at each strategy level, I start using some methods from previous levels. It&#8217;s not enough here to just limit the number of moves (liberties) an opponent has: we also need to keep from moving to stupid places that would e.g. give the opponent a corner.</p>
<p>This strategy also cares a lot more about what phase of the game it&#8217;s in: early or late game. Later in the game we don&#8217;t want to minimize our opponent&#8217;s moves nearly as much as we want to start creating stable (i.e. unflippable) disks. I&#8217;ve implemented this with the <code>scale</code> variable.</p>
<p>At this point, I copy the current board state and calculate the number of moves an opponent has. Two notes:</p>
<ul>
<li>It is possible that taking a move means the opponent has 0 moves and it is thus our turn again. The <code>board.Board</code> class takes care of that, so we have to check that it is indeed our opponent&#8217;s turn before calculating the number of available moves.</li>
<li><code>copy.deepcopy</code> is an important part of this method. The discussion of pointers vs. copies is a bit beyond the scope of this article, but let&#8217;s boil it down to this: even if you assign a new variable name, like <code>newboard</code>, updating <code>newboard</code> will update <strong>both</strong> <code>newboard</code> and <code>b</code> unless one is a copy of the other. <a href="https://docs.python.org/2/library/copy.html">For copy vs deepcopy, please read the documentation.</a></li>
</ul>
<h4>Tying it all together</h4>
<p></p><pre class="crayon-plain-tag">def _choice(self, weights):
        # Choose from set of best moves (weighted)
        p = np.exp(weights)
        p /= np.sum(p)
        return np.random.choice(range(len(weights)), p=p)

    def move(self, b):
        """
        Take a move on the given board state.

        Arguments:
            b - a board.Board() object

        Returns:
            move - coordinates (x, y) on which to make move
        """
        possible_moves = b.get_valid_moves()
        if self.strategy == 0:
            weights = self._rand_move(possible_moves)
        elif self.strategy == 1:
            weights = self._most_pieces(possible_moves)
        elif self.strategy == 2:
            weights = self._by_weight(possible_moves)
        elif self.strategy == 3:
            weights = self._by_weight_all(possible_moves)
        elif self.strategy == 4:
            weights = self._liberties(b)
        choice = self._choice(weights)
        return possible_moves[choice][0]</pre><p>There are several ways we could make a choice here: I have chosen to use a weighted random choice, where the probabilities of choosing each move are the exponential of the weights. This means the best move will <em>very very often</em> be the actual move, but that some variability will happen so that games don&#8217;t get super stale.</p>
<p>You should play around with different <code>_choice</code> methods yourself! See what you like best!</p>
<h4>Comparing strategy levels</h4>
<p>If our strategy is worth anything, it should beat strategies &#8220;below&#8221; it in sophistication. To this end, I pitted each strategy against each other strategy, and here are the results (numbers are win-loss-tie for the first player):</p>
<table>
<tbody>
<tr>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
<th style="text-align: center;" colspan="5">second</th>
</tr>
<tr>
<td></td>
<td></td>
<td>0</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
</tr>
<tr>
<th rowspan="5">first</th>
<td>0</td>
<td>47-49-4</td>
<td>44-49-7</td>
<td>25-74-1</td>
<td>15-80-5</td>
<td>18-78-4</td>
</tr>
<tr>
<td>1</td>
<td>57-41-2</td>
<td>44-53-3</td>
<td>17-79-4</td>
<td>17-80-3</td>
<td>17-83-0</td>
</tr>
<tr>
<td>2</td>
<td>79-16-5</td>
<td>76-19-5</td>
<td>45-54-3</td>
<td>30-68-2</td>
<td>20-79-1</td>
</tr>
<tr>
<td>3</td>
<td>79-15-6</td>
<td>77-18-5</td>
<td>58-37-5</td>
<td>46-50-4</td>
<td>35-60-5</td>
</tr>
<tr>
<td style="text-align: center;">4</td>
<td style="text-align: center;">83-13-4</td>
<td style="text-align: center;">81-16-3</td>
<td style="text-align: center;">68-31-1</td>
<td style="text-align: center;">66-32-2</td>
<td style="text-align: center;">35-63-2</td>
</tr>
</tbody>
</table>
<p>As you can see, the strategies <strong>do</strong> get better with sophistication, but they&#8217;re still not&#8230; great. AI level 4 got beaten by level 0 (random moves) 31/200 times. Ideally that number would be 0.</p>
<p>The traditional approach to an Othello intelligence is to implement a search algorithm, e.g. &#8220;If I move here, and my opponent moves here and then I move here&#8230;&#8221; to a depth of 8 or so moves ahead. We <strong>could</strong> do that, but I&#8217;m much more interested in machine learning, and so I&#8217;m going to try to tackle this problem with that approach.</p>
<p>First, though, I need to learn how on earth to do that! Tune in next week to learn the basics of Reinforcement Learning.</p>
<p>The post <a href="http://realerthinks.com/creating-othello-tutor-step-2-introducing-basic-ai/">Creating an Othello Tutor: Step 2, Introducing basic AI</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://realerthinks.com/creating-othello-tutor-step-2-introducing-basic-ai/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Creating an Othello Tutor: Step 1, Making a Playable Game</title>
		<link>http://realerthinks.com/creating-othello-tutor-step-1-making-playable-game/</link>
					<comments>http://realerthinks.com/creating-othello-tutor-step-1-making-playable-game/#respond</comments>
		
		<dc:creator><![CDATA[Addie]]></dc:creator>
		<pubDate>Wed, 03 May 2017 17:37:10 +0000</pubDate>
				<category><![CDATA[Data Analysis]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[numpy]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[python classes]]></category>
		<category><![CDATA[technical]]></category>
		<guid isPermaLink="false">http://realerthinks.com/?p=377</guid>

					<description><![CDATA[<p>Greetings dearest readers! I am a board game fiend. One of my favorites is called Othello (or sometimes Reversi). Othello takes place on a 8&#215;8 board, with disks that can be either black or white. The rules are fairly simple, but the strategy is complex. Place a disk of your color on the board such [&#8230;]</p>
<p>The post <a href="http://realerthinks.com/creating-othello-tutor-step-1-making-playable-game/">Creating an Othello Tutor: Step 1, Making a Playable Game</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Greetings dearest readers!</p>
<p>I am a board game fiend. One of my favorites is called Othello (or sometimes Reversi). Othello takes place on a 8&#215;8 board, with disks that can be either black or white.</p>
<p><img loading="lazy" decoding="async" id="longdesc-return-380" class="size-full wp-image-380 aligncenter" tabindex="-1" src="http://realerthinks.com/wordpress/wp-content/uploads/2017/05/Othello.png" alt="A bare-bones Othello board. The rows are labeled top-to-bottom 1-8. The columns are labeled left-to-right A-H. The background is dark green. Each cell is represented by a small, unfilled circle except the four center squares. D4 and E5 are large unfilled circles, D5 and E4 are large filled circles." width="371" height="372" longdesc="http://students.washington.edu/adelak?longdesc=380&amp;referrer=377" srcset="http://realerthinks.com/wordpress/wp-content/uploads/2017/05/Othello.png 371w, http://realerthinks.com/wordpress/wp-content/uploads/2017/05/Othello-150x150.png 150w, http://realerthinks.com/wordpress/wp-content/uploads/2017/05/Othello-300x300.png 300w" sizes="auto, (max-width: 371px) 100vw, 371px" /></p>
<p>The rules are fairly simple, but the strategy is complex. Place a disk of your color on the board such that it flanks at least one of your opponents&#8217; disks. All of your opponent&#8217;s flanked disks are flipped to your color. You must move if able. Once no moves remain, the winner is the person with the most disks on the board. If you want to try playing it for yourself, I recommend the <a href="https://www.mathsisfun.com/games/reversi.html">Reversi game implemented at mathisfun.com</a>.</p>
<p>I&#8217;ve gotten very good at playing my computer at Othello, but my forays into the online world playing against other humans I continually get crushed. I was hoping to find a computer program that could actually <em>teach</em> you how to play better (e.g. &#8220;A better move would have been &#8216;C2&#8217; because it forces your opponent to give you the corner.&#8221;) As far as I can find, no such program exists! I have now set out to make it myself.</p>
<p>The basic idea: Using machine learning and <a href="https://www.tensorflow.org/">TensorFlow</a>, I will teach the computer to play Othello really well so that it can then <em>teach me</em> to play really well.</p>
<h4>Outline of the plan</h4>
<ul>
<li>Step 1: Make a playable game
<ul>
<li>I need to have a board state that can return a list of valid moves.</li>
<li>If I make a move, the program should flip all of the captured disks.</li>
<li>The program should determine if a player can make no moves and must be skipped.</li>
<li>If neither player can move, the program should determine a winner and end.</li>
</ul>
</li>
<li>Step 2: Make a basic AI that can play the game with me
<ul>
<li>Level 0: Move to a random available square</li>
<li>Level 1: Move to the space which flips the most disks</li>
<li>Level 2: Assign point values to different squares (e.g. corners are worth the most) and make the move which maximizes board score.</li>
<li>Level 3: Take the move which most limits your opponent&#8217;s choices.</li>
</ul>
</li>
<li>Step 3: Learn about Reinforcement Learning so I can actually make a strong artificial intelligence.</li>
<li>Step 4: Implement the machine learning strategy to make a <em>really good</em> Othello AI.</li>
<li>Step 5: Create a tutor.
<ul>
<li>The tutor will show you what would have been a better move, and tell you why (if able).</li>
<li>The tutor should be able to teach at different levels, with information about each level and what its strengths and weaknesses are</li>
</ul>
</li>
<li>Step 6?: Create a GUI
<ul>
<li>If I feel like it</li>
<li>Make it pretty</li>
<li>Mouse input</li>
<li>Disk-flipping animations</li>
</ul>
</li>
</ul>
<h4>Today: Creating a playable game</h4>
<h5>The Square Class</h5>
<p>I have implemented, for each square on the board, a container for information about that square. It contains the <code>value</code> of the square- <code>0</code>, <code>1</code>, or <code>None</code>. Of note: I have implemented this &#8220;variable&#8221; as a <code>property</code>&#8212; It acts just like a variable, except that when you assign its value, it will automatically update the other two variables: <code>is_valid_move</code>, and <code>flipped_disks</code>.</p><pre class="crayon-plain-tag">class Square(object):
    """
    Represents one square of an othello board.

    Instance variables:
        value - If a disk is placed, its value, else None
        is_valid_move - boolean if the current player can play here
        flipped_disks - if the current player plays here,
                        which disks will flip to their color
    """
    def __init__(self, value=None):
        """
        Initialize Square.

        Optional arguments:
            value - current value of square, default None
        """
        self._value = value
        self.is_valid_move = False
        self.flipped_disks = []

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, value):
        self._value = value
        self.is_valid_move = False
        self.flipped_disks = []</pre><p></p>
<h5>The Board Class</h5>
<p>Everything from here out will be within the <code>Board</code> class, so all of the &#8220;functions&#8221; that you see will be methods of that class.</p>
<h6>Initializing</h6>
<p>This should be fairly self-explanatory, but I&#8217;ll note a few things. <code>_human_readable_dict</code> is something to translate from integer coordinates to alphabetical coordinates. <code>_computer_readable_dict</code> does the opposite. <code>_print_row</code> is a placeholder for displaying the board (explored later on).</p>
<p><code>current_player</code> is also a property here, so that if it is manually set, the list of valid moves will automatically be updated. <code>_xstr</code> is a function that I will show in a bit; it&#8217;s used to turn row values (0/1/None) into strings, and vectorizing it at initialization makes it so we can pass the whole row at once, rather than square-by-square.</p><pre class="crayon-plain-tag">class Board(object):
    """
    8 x 8 game board which can be displayed and interacted with.

    Instance variables:
        board_state - an 8 x 8 numpy array of Square objects
        game_over - boolean: True if the game has ended
        current_player - 0/1: the player whose move it is
        p0_score - number of discs player 0 controls
        p1_score - number of discs player 1 controls
        verbose - boolean: print output on moves

    Methods:
        update_valid_moves - calculate valid moves for the current player
        get_valid_moves - return valid moves and flipped disks
        print_board - display board state in a human-readable format
        translate_move - return a coordinate move, (x, y) in
                         human-readable format
        human_move - given human-readable input (e.g. 'A4'), make move
        coord_move - given tuple (x, y), make move
    """
    _human_readable_dict = dict(enumerate('ABCDEFGH'))
    _computer_readable_dict = dict([(v, k) for k, v in enumerate('ABCDEFGH')])
    _print_row = '%s %s %s %s %s %s %s %s'.encode('utf-8')

    def __init__(self, board_state=None, verbose=True):
        """
        Initialize Board object.

        Optional arguments:
            board_state - an 8 x 8 numpy array of Square objects
                          default: starting board
            verbose - print output; default True
        """
        self._current_player = 0
        self.verbose = verbose
        if board_state is None:
            start = np.array([[Square(1), Square(0)], [Square(0), Square(1)]])
            self.board_state = np.array([
                [Square() for _ in range(8)] for _ in range(8)])
            self.board_state[3:5, 3:5] = start
        else:
            self.board_state = board_state
        self.update_valid_moves()
        self.game_over = False
        self._score()
        self._xstr = np.vectorize(self._xstr)
        if self.verbose is True:
            self.print_board()

    @property
    def current_player(self):
        return self._current_player

    @current_player.setter
    def current_player(self, value):
        if value not in [0, 1]:
            raise ValueError('Player can only be 0 or 1.')
        self._current_player = value
        self.update_valid_moves()</pre><p></p>
<h6>Get valid moves</h6>
<p>A function to make the <code>Square</code> values more accessible.</p><pre class="crayon-plain-tag">def get_valid_moves(self):
        """
        Return all valid moves and accompanying flipped disks.

        Returns:
            vms - a list of tuples where
                tuple[0] is a valid move and
                tuple[1] is a list of flipped disks
        """
        flipped_disks = np.array([
            [r.flipped_disks for r in row] for row in self.board_state])
        valid_moves = [tuple(r) for r in np.argwhere(flipped_disks)]
        flipped_moves = list(flipped_disks[np.where(flipped_disks)])
        return zip(valid_moves, flipped_moves)</pre><p></p>
<h6>Update valid moves</h6>
<p>This is easily the part of the code I struggled with the most. All the other code I found to run Othello programs would search each square with your piece in it, and then find all moves that could be made using that square as the flanking piece. A separate function determined which disks were flipped once a move was made.</p>
<p>That strategy is <strong>slow</strong>, and can lead to ridiculous happenings like if there&#8217;s only one place on the board you can move it could still take a <em>looong</em> time to find it. I also see no reason to find valid moves and flipped disks in separate calls. So, breaking this down into its most basic form: if fed a 1-D array, <code>_valid_moves_in_array</code> will return the indices of each available move and the indices of the resulting flipped disks.</p><pre class="crayon-plain-tag">def _valid_moves_in_array(self, array):
        """
        Given a 1-D array, find valid moves and disks flipped.

        Called by update_valid_moves()

        Arguments:
            array - a 1-D numpy array

        Returns:
            valid_moves - list of tuples:
                tuple[0] is index of valid move
                tuple[1] is list of indices of flipped disks
        """
        valid_moves = []
        # If array doesn't have both 0 and 1, there are no valid moves.
        if not ((array == 0).any() and (array == 1).any()):
            return valid_moves
        opponent = 1 - self._current_player
        pos_list = np.where(array == self._current_player)[0]

        for pos in pos_list:
            i = pos - 1
            flipped_disks = []
            if i &gt;= 0 and array[i] == opponent:
                flipped_disks += [i]
                i -= 1
                while i &gt;= 0 and array[i] == opponent:
                    flipped_disks += [i]
                    i -= 1
                if i &gt;= 0 and array[i] is None:
                    valid_moves += [(i, flipped_disks)]

            i = pos + 1
            flipped_disks = []
            if i &lt; len(array) and array[i] == opponent:
                flipped_disks += [i]
                i += 1
                while i &lt; len(array) and array[i] == opponent:
                    flipped_disks += [i]
                    i += 1
                if i &lt; len(array) and array[i] is None:
                    valid_moves += [(i, flipped_disks)]
        return valid_moves</pre><p>Once we have that, it&#8217;s as simple as looking at each row, column, and diagonal:</p><pre class="crayon-plain-tag">def update_valid_moves(self):
        """
        Update valid moves for the current player, save to board_state.
        """
        # Reset all cells to 'invalid move'
        for row in self.board_state:
            for cell in row:
                cell.is_valid_move = False
                cell.flipped_disks = []

        # Horizontal
        for i, row in enumerate(self.board_state):
            array = np.array([cell.value for cell in row])
            vms = self._valid_moves_in_array(array)
            for index, flipped in vms:
                flipped_ids = zip([i]*len(flipped), flipped)
                self.board_state[i, index].is_valid_move = True
                self.board_state[i, index].flipped_disks += flipped_ids

        # Vertical
        for i, col in enumerate(self.board_state.T):
            array = np.array([cell.value for cell in col])
            vms = self._valid_moves_in_array(array)
            for index, flipped in vms:
                flipped_ids = zip(flipped, [i]*len(flipped))
                self.board_state[index, i].is_valid_move = True
                self.board_state[index, i].flipped_disks += flipped_ids

        # Diagonal NW--SE
        for i in range(-7, 8):
            array = np.array([
                cell.value for cell in self.board_state.diagonal(i)])
            vms = self._valid_moves_in_array(array)
            for index, flipped in vms:
                flipped_ids = [self._diag_coords(i, f, 'NW') for f in flipped]
                coords = self._diag_coords(i, index, 'NW')
                self.board_state[coords].is_valid_move = True
                self.board_state[coords].flipped_disks += flipped_ids

        # Diagonal NE--SW
        for i in range(-7, 8):
            array = np.array([cell.value for cell in np.diag(
                np.fliplr(self.board_state), i)])
            vms = self._valid_moves_in_array(array)
            for index, flipped in vms:
                flipped_ids = [self._diag_coords(i, f, 'NE') for f in flipped]
                coords = self._diag_coords(i, index, 'NE')
                self.board_state[coords].is_valid_move = True
                self.board_state[coords].flipped_disks += flipped_ids</pre><p>The very last thing to consider is that there is a bit of shenanigans with diagonal arrays. We need to take the index of the diagonal array and turn that back into 8&#215;8 coordinates. I wrote a function to do just that.</p><pre class="crayon-plain-tag">def _diag_coords(self, i, index, NW_NE):
        """
        Translate from diagonal indices to array coordinates.

        Called by update_valid_moves()

        Arguments:
            i - i'th slice of matrix
            index - index of the diagonal array
            NW_NE - can be 'NW' or 'NE'; direction of slice

        Returns:
            row - index of numpy row
            col - index of numpy column

        Exceptions Raised:
            AssertionError - if NW_NE is neither 'NW' nor 'NE'
        """
        assert NW_NE in ['NW', 'NE'], 'NW_NE must be either "NW" or "NE"'
        if i &gt;= 0:
            row = index
        else:
            row = index - i

        if NW_NE == 'NW':
            col = row + i
        else:
            if i &gt; 0:
                col = 7 - index - i
            else:
                col = 7 - index
        return row, col</pre><p></p>
<h6>Printing the board in an intelligible manner</h6>
<p>The values in my <code>Square</code>s are <code>0</code>, <code>1</code>, or <code>None</code>. I&#8217;d like to print them as a little more user-friendly. I&#8217;ve chosen the unicode characters <code>u25CF</code> (●), <code>u25CB</code> (○), and <code>u25E6</code>(◦). <code>print_board</code> translates each row into these characters and makes it all nice and easy to read.</p><pre class="crayon-plain-tag">def print_board(self):
        """Display board state in a human-readable format."""
        row_num = 1
        for row in self.board_state:
            vals = tuple(self._xstr([cell.value for cell in row]))
            print row_num, self._print_row % vals
            row_num += 1
        print '  A B C D E F G H'

    def _xstr(self, s):
        """For printing human-readable board: convert None to ' '."""
        if s is None:
            return u'\u25E6'  # bullet
        elif s == 0:
            return u'\u25CF'  # filled circle
        elif s == 1:
            return u'\u25CB'  # empty circle
        else:
            raise ValueError('Invalid value for square.')</pre><p></p>
<h6>Taking moves- both as a human and with numpy coordinates</h6>
<p>At this point we&#8217;re just interacting with all of the framework we&#8217;ve already made&#8230; almost home free!</p><pre class="crayon-plain-tag">def translate_move(self, move):
        """
        Translate coordinate move (x, y) into human-readable format.

        Arguments:
            move - an (x, y) tuple

        Returns:
            a length-2 string e.g. 'A4'
        """
        return self._human_readable_dict[move[1]], move[0]+1

    def human_move(self, s):
        """
        Make move on board.

        Arguments:
            s - Human-readable string of length-2 e.g. 'A4'

        Effects:
            take move
            flip relevent disks
            update current_player
            update valid moves
            print message if player skipped
            check if game has ended; print final score if so
            print board

        Exceptions raised:
            AssertionError - if s is incorrect length
            RuntimeError - if invalid move provided
        """
        assert len(s) == 2, 's must be 2 characters'
        s1, s2 = list(s)
        s1 = self._computer_readable_dict[s1]
        s2 = int(s2) - 1
        self.coord_move((s2, s1))

    def coord_move(self, move):
        """
        Make move on board.

        Called by human_move()

        Arguments:
            move - tuple of array coordinates (x, y)

        Effects:
            take move
            flip relevent disks
            update current_player
            update valid moves
            print message if player skipped
            check if game has ended; print final score if so
            print board

        Exceptions raised:
            RuntimeError - if invalid move provided
        """

        cell = self.board_state[move]
        if cell.is_valid_move is False:
            raise RuntimeError('Invalid move.')
        flipped_disks = cell.flipped_disks

        self.board_state[move].value = self._current_player
        for d in flipped_disks:
            self.board_state[d].value = self._current_player

        self._current_player = 1 - self._current_player
        self.update_valid_moves()
        self._score()
        if self.verbose:
            self.print_board()</pre><p></p>
<h6>Scoring the game and tracking its conclusion</h6>
<p></p><pre class="crayon-plain-tag">def _score(self):
        """
        Tracks if players have moves and if game has ended

        Called by coord_move()

        Effects:
            update current player scores
            if current player has no valid moves, skip player
            print 'skipped player' message
            update valid moves
            if current player has no valid moves
                set game_over to True
                print 'game over' message
                print final scores
        """
        vals = np.array([[r.value for r in row] for row in self.board_state])
        self.p0_score = len(np.where(vals == 0)[0])
        self.p1_score = len(np.where(vals == 1)[0])
        n_moves = len(self.get_valid_moves())
        if n_moves == 0:
            self._current_player = 1 - self._current_player
            self.update_valid_moves()
            n_moves = len(self.get_valid_moves())
            if n_moves == 0:
                self.game_over = True
                if self.verbose:
                    print 'Game over.'
                    print u'\u25CF : %s\t\u25CB : %s'.encode('utf-8') % (
                        self.p0_score, self.p1_score)</pre><p></p>
<h4>Playing the Game</h4>
<p></p><pre class="crayon-plain-tag">In [3]: b = Board()
1 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
2 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
3 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
4 ◦ ◦ ◦ ○ ● ◦ ◦ ◦
5 ◦ ◦ ◦ ● ○ ◦ ◦ ◦
6 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
7 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
8 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
  A B C D E F G H

In [4]: b.human_move('E6')
1 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
2 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
3 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
4 ◦ ◦ ◦ ○ ● ◦ ◦ ◦
5 ◦ ◦ ◦ ● ● ◦ ◦ ◦
6 ◦ ◦ ◦ ◦ ● ◦ ◦ ◦
7 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
8 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
  A B C D E F G H

In [5]: b.human_move('F6')
1 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
2 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
3 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
4 ◦ ◦ ◦ ○ ● ◦ ◦ ◦
5 ◦ ◦ ◦ ● ○ ◦ ◦ ◦
6 ◦ ◦ ◦ ◦ ● ○ ◦ ◦
7 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
8 ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦
  A B C D E F G H</pre><p></p>
<h4>That&#8217;s all for now!</h4>
<p>Tune in next week, for creating an AI that will play the game with us!</p>
<p>The post <a href="http://realerthinks.com/creating-othello-tutor-step-1-making-playable-game/">Creating an Othello Tutor: Step 1, Making a Playable Game</a> appeared first on <a href="http://realerthinks.com">RealThinks</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://realerthinks.com/creating-othello-tutor-step-1-making-playable-game/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
