{"id":2206,"date":"2025-01-01T00:01:32","date_gmt":"2025-01-01T05:01:32","guid":{"rendered":"https:\/\/mathvoices.ams.org\/featurecolumn\/?p=2206"},"modified":"2024-12-29T16:50:24","modified_gmt":"2024-12-29T21:50:24","slug":"visualizing-anti-trans-legislation-using-rstudio","status":"publish","type":"post","link":"https:\/\/mathvoices.ams.org\/featurecolumn\/2025\/01\/01\/visualizing-anti-trans-legislation-using-rstudio\/","title":{"rendered":"Visualizing anti-trans legislation using RStudio"},"content":{"rendered":"<p><span id=\"pullQuote\"><em>Can I use these text analyses to understand the content of the bill, without reading 400 pages?<\/em><\/span><\/p>\n<h1 class=\"headlineText\">Visualizing anti-trans legislation using RStudio<\/h1>\n<p><b>Bianca Thompson<br \/>\nWestminster University<\/b><\/p>\n<p>While I was working with Kenan \u0130nce on their open source active learning book, <a href=\"https:\/\/qr-for-social-justice.github.io\/workbook\/qr4sj.html\"><i>Quantitative Reasoning for Social Justice,<\/i><\/a> we discussed their dream chapter on using text data visualization to understand legislation about trans people in the US as a source for trans rights activism. \u0130nce was trained as a poet and topologist and identified as non-binary (they\/them), and I am trained as a number theorist and identify as a queer, biracial Latina (she\/they). The nature of the project, demanding expertise in data analysis and familiarity with many different experiences of gender, made us both feel out of our depth. Regardless, we pushed on because this chapter is key to bringing culturally relevant topics into our classroom. Living in Salt Lake City, UT, with its vibrant queer communities, our goal has always been to create and defend habitable spaces in Utah for LGBTQ+ community members. <\/p>\n<p>\u0130nce passed away before we could finish this chapter. \u0130nce was an activist poet-scholar and was committed to challenging legislation intent on erasing Utah\u2019s queer communities.\u00a0To quote from <a href=\"https:\/\/www.netflix.com\/title\/81059939\">Heartstopper<\/a>, \u201cTrans people aren\u2019t a debate. We\u2019re human beings\u201d. To honor \u0130nce&#8217;s memory and legacy, their collaborators and I are working to finish <i>Quantitative Reasoning for Social Justice<\/i>. <\/p>\n<figure id=\"attachment_2212\" aria-describedby=\"caption-attachment-2212\" style=\"width: 799px\" class=\"wp-caption aligncenter\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/mathvoices.ams.org\/featurecolumn\/wp-content\/uploads\/sites\/2\/2025\/01\/blmutah.jpg?w=600&#038;ssl=1\" alt=\"Colorful rainbow flags and arches in front of a downtown Salt Lake City clock tower\"  \/><figcaption id=\"caption-attachment-2212\" class=\"wp-caption-text\">A Pride celebration in Salt Lake City. (Public domain photo by the Bureau of Land Management.)<\/figcaption><\/figure>\n<p>Since 2023, Utah\u2019s legislature has introduced 6 anti-trans bills: HB132 (failed), HB209, HB257, SB0016, SB0039, SB0093 (see <a href=\"https:\/\/www.tracktranslegislation.com\/\">Track Trans Legislation<\/a> for details). The 5 bills that passed have been harmful to my students, especially recent graduates, who have experienced acceptance on campus but face harassment in their new careers. I was inspired by <a href=\"https:\/\/www.geeksforgeeks.org\/visualizing-text-data-techniques-and-applications\/\">Visualizing Text Data: Techniques and Applications<\/a> by <a href=\"https:\/\/www.geeksforgeeks.org\/\">Geeks for Geeks<\/a>, which argues text data visualization is good for simplifying complex data and will facilitate enhanced comprehension, pattern recognition, improved communications, exploratory data analysis, and decision making. This pushed me to take analysis beyond an in-class activity and follow in \u0130nce\u2019s footsteps to develop tools for activism.\u00a0<\/p>\n<p>So, why am I using math to study this? The shortest of these bills is around 10 pages and the longest is over 300 pages all written in legislation speak. To be an informed citizen I\u2019d need to find time to analyze 400 pages in the past year alone. And that\u2019s just to keep up with the anti-trans legislation! There are more bills going through Utah\u2019s House and Senate about issues that impact my friends and family. If I can use mathematics to do as the Geeks for Geeks article suggests, then I can be more efficient with my time. Let\u2019s go on this journey together and see what we can learn from doing a text analysis.\u00a0<\/p>\n<p>Throughout the following discussion, I&#8217;ll provide code in <a href=\"https:\/\/posit.co\/products\/open-source\/rstudio\/\">RStudio<\/a>. This is an application you can download to make using the statistical programming language R easier.<\/p>\n<p>My questions are\u00a0<\/p>\n<ul>\n<li>What were the major language themes these bills had associated with their bill types such as: youth athletics, ID updates, healthcare, nondiscrimination protections, public facilities, school\/education and any other topic missed by these broad categories? These categories are the ones created on the Track Trans Legislation website.<\/li>\n<li>Can I use these text analyses to understand the content of the bill, without reading 400 pages?<\/li>\n<\/ul>\n<h2>Using RStudio tutorial to clean the data<\/h2>\n<p>To start with, I pasted the text into .txt files. I loaded my libraries:<\/p>\n<pre>\r\nlibrary(tidytext) # provides additional text mining\r\nlibrary(stringr)   # text cleaning and regular expressions\r\nlibrary(stopwords) # identifies stopwords\r\nlibrary(dplyr) # allows me to filter\r\nlibrary(tidyverse) # where the graph commands live\r\nlibrary(igraph) #make ngrams\r\nlibrary(ggraph) #visualize the networks\r\nlibrary(forcats) #refinding some of the graphs\r\n<\/pre>\n<p>There are lots of ways we can clean the text once it\u2019s loaded in, but we can use a mix of regular expressions and built in commands to make a <code>clean_text_function()<\/code>.<\/p>\n<pre>clean_text_function &lt;- function(text) {\r\n  # Clean each line of text:\r\n  cleaned_text %\r\n\tstr_to_lower() %&gt;%  # Convert text to lowercase\r\n\tstr_replace_all(\"[^[:alnum:]\\\\s]\", \" \") %&gt;%  # Remove non-alphanumeric characters (except spaces)\r\n\tstr_replace_all(\"\\\\d+\", \" \") %&gt;% #deletes all numbers\r\n\tstr_squish()  # Remove extra spaces\r\n\r\n  return(cleaned_text)\r\n}\r\n<\/pre>\n<p>This <code>clean_text_function()<\/code> has no finesse. If you\u2019re familiar with <a href=\"https:\/\/regexone.com\/\"><span style=\"font-weight: 400\">regular expressions (regex)<\/a>, you can make one more tailored to your .txt files. I noticed that this function would delete things like the \u201c12\u201d in \u201ck12\u201d and it leaves in all the names of list items, like \u201ca\u201d, \u201cj\u201d, and \u201cii\u201d. When I tried to refine my code, it would delete too much, so I figured better the enemy I know. <\/p>\n<p>Now that we have defined the cleaning function, we can load our .txt files, clean them and turn them into data frames:<\/p>\n<pre>\r\nbill_lines_0257 &lt;-read_lines(&quot;HB0257.txt&quot;)\r\nbill_lines_0093 &lt;- read_lines(&quot;SB0093.txt&quot;)\r\nbill_lines_0016 &lt;- read_lines(&quot;SB0016.txt&quot;)\r\nbill_lines_0039 &lt;- read_lines(&quot;SB0039.txt&quot;)\r\nbill_lines_0209 &lt;- read_lines(&quot;HB0209.txt&quot;)\r\nbill_lines_0132_fail &lt;- read_lines(&quot;HB0132-failed.txt&quot;) \r\n\r\nclean_line_0257_df &lt;- data.frame(text = clean_text_function(bill_lines_0257), stringsAsFactors = FALSE)\r\nclean_line_0093_df &lt;- data.frame(text = clean_text_function(bill_lines_0093), stringsAsFactors = FALSE)\r\nclean_line_0016_df &lt;- data.frame(text = clean_text_function(bill_lines_0016), stringsAsFactors = FALSE)\r\nclean_line_0039_df &lt;- data.frame(text = clean_text_function(bill_lines_0039), stringsAsFactors = FALSE)\r\nclean_line_0209_df &lt;- data.frame(text = clean_text_function(bill_lines_0209), stringsAsFactors = FALSE)\r\nclean_line_0132_fail_df &lt;- data.frame(text = clean_text_function(bill_lines_0132_fail), stringsAsFactors = FALSE)\r\n\r\ncombined_bills_df % mutate(book = \"HB0257\"),\r\n  clean_line_0093_df %&gt;% mutate(book = \"SB0093\"),\r\n  clean_line_0016_df %&gt;% mutate(book = \"SB0016\"),\r\n  clean_line_0039_df %&gt;% mutate(book = \"SB0039\"),\r\n  clean_line_0209_df %&gt;% mutate(book = \"HB0209\"),\r\n  clean_line_0132_fail_df %&gt;% mutate(book = \"HB0132_fail\")\r\n)\r\n<\/pre>\n<h2>Using R to Visualize the data in bigrams<\/h2>\n<p>A bigram is a pair of words. Using the <code>unnest_tokens()<\/code> function we can break up the text into a data frame that keeps track of bigrams (or any $n$-gram, but I\u2019m looking at bigrams). We can then visualize all 6 bills&#8217; top 10 bigrams at once. The <code>separate()<\/code> function allows us to break up a bigram into two categorical variables. We use <code>drop_na()<\/code>, because cleaning the text creates spaces being counted as words. The filter command in conjunction with <code>stop_words<\/code> helps remove words like \u201cthe\u201d and \u201ca\u201d or \u201can\u201d. Then since we want to know how many of each we have, we use the <code>count()<\/code> function. We use <code>unite()<\/code> since we separated our bigrams earlier in order to clean out stop words. Then we use <code>group_by()<\/code> so we can study the bigrams in each different legislation. To visualize, we use a bar graph created with <code>ggplot()<\/code>. The commands are just to clean up the visualization so that it appears nice.<\/p>\n<pre>\r\nbigram_data %\r\n  unnest_tokens(bigram, text, token = \"ngrams\", n = 2) %&gt;%\r\n  separate(bigram, c(\"word1\", \"word2\"), sep = \" \") %&gt;%\r\n  drop_na() %&gt;%\r\n  filter(!word1 %in% stop_words$word,\r\n     \t!word2 %in% stop_words$word) %&gt;%\r\n  count(book, word1, word2, sort = TRUE) %&gt;%\r\n  unite(\"bigram\", c(word1, word2), sep = \" \") %&gt;%\r\n  group_by(book) %&gt;%\r\n  top_n(10) \r\n\r\nbigram_data %&gt;%\r\n  ggplot(aes(reorder_within(bigram, n, book), n, fill = book)) +\r\n  geom_bar(stat = \"identity\", alpha = .9, show.legend = FALSE) +\r\n  scale_x_reordered() +\r\n  facet_wrap(~ book, ncol = 2, scales = \"free\") +\r\n  coord_flip()\r\n<\/pre>\n<p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/mathvoices.ams.org\/featurecolumn\/wp-content\/uploads\/sites\/2\/2025\/01\/bar-graph-1.png?w=600&#038;ssl=1\" alt=\"\"  \/><\/p>\n<p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/mathvoices.ams.org\/featurecolumn\/wp-content\/uploads\/sites\/2\/2025\/01\/bar-graph-2.png?w=600&#038;ssl=1\" alt=\"\"  \/><\/p>\n<p>Fun fact: when I print the bar graph image in R, all the text overlays it, so I needed to launch the image in its own window to read it. We can also see that the cleaning of the data was not good enough because \u201csection section\u201d appears more than once, and \u201csection\u201d is just the headers that are being used in the documents. I assume SB0093 has more than 10 since several bigrams had the same frequency and it\u2019s clear SB0039 is the longest document. But even so, through this image we can see that HB132, SB0039, and SB0016 all have \u201chealth care\u201d and other related health words, SB093 also talks about \u201chealth care\u201d, but we can see \u201cbirth certificate\u201d appears often in the document. Moreover, HB209 looks like it&#8217;s focused on K12 and \u201cextracurricular activity.\u201d It\u2019s a little unclear what HB257 is meant to focus on since it looks like the data wasn\u2019t cleaned that well, but \u201cprivacy space\u201d and \u201csex designated\u201d are near the top of the list.\u00a0<\/p>\n<p>Let\u2019s view some of these bigrams as networks. I want to look at HB257, and SB0039 more since it wasn\u2019t clear what the documents were about. First we\u2019ll make a couple of functions&mdash;<code>count_bigrams()<\/code> and <code>visualize_bigrams()<\/code>&mdash;that make the bigram lists and then visualize them as networks. The darker arrows mean the connections appeared more often. You\u2019ll see the commands in the function look familiar as we did something similar earlier with the full data frame.\u00a0<\/p>\n<pre>\r\ncount_bigrams %\r\n\tunnest_tokens(bigram, text, token = \"ngrams\", n = 2) %&gt;%\r\n\tseparate(bigram, c(\"word1\", \"word2\"), sep = \" \") %&gt;%\r\n\tfilter(!word1 %in% stop_words$word,\r\n       \t!word2 %in% stop_words$word) %&gt;%\r\n\tcount(word1, word2, sort = TRUE)\r\n}\r\n\r\nvisualize_bigrams &lt;- function(bigrams) {\r\n  set.seed(2016)\r\n  a %\r\n\tgraph_from_data_frame() %&gt;%\r\n\tggraph(layout = \"fr\") +\r\n\tgeom_edge_link(aes(edge_alpha = n), show.legend = FALSE, arrow = a) +\r\n\tgeom_node_point(color = \"lightblue\", size = 3) +\r\n\tgeom_node_text(aes(label = name), repel=TRUE) +\r\n\ttheme_void()\r\n}\r\n<\/pre>\n<p>Here $n$ is the number of times the bigram appears in the document. So we\u2019re filtering out the bigrams that appear less than 5 times.\u00a0<\/p>\n<pre>\r\nHB257_bigrams %\r\n \t\t count_bigrams()%&gt;%\r\n \t\t drop_na()\r\n\tHB257_bigrams %&gt;%\r\n filter(n &gt; 5,\r\n     \t!str_detect(word1, \"\\\\d\"),\r\n     \t!str_detect(word2, \"\\\\d\")) %&gt;%\r\n \t\t visualize_bigrams()\r\n<\/pre>\n<p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/mathvoices.ams.org\/featurecolumn\/wp-content\/uploads\/sites\/2\/2025\/01\/image2.png?w=600&#038;ssl=1\" alt=\"A word cloud showing relationships between words such as privacy and space or government and entity\"  \/><\/p>\n<p>This created a disconnected graph of related words. A connection between two words means they are a bigram, and the directional arrow is used to demonstrate which is word 1 and which is word 2. Looking at the darker arrows and seeing what networks they are connected to leads to looking at \u201csex\u201d, \u201cdesignat(ed\/ion)\u201d, \u201cprivacy\u201d, \u201cchanging\u201d, \u201cspace\u201d, and a few other words. This leads me to suspect this bill is about bathroom spaces, since there is a path from \u201csex\u201d to \u201cspace\u201d and \u201cchanging\u201d.\u00a0<\/p>\n<p>For SB0039, I changed the command a little since this is the one that was over 300 pages, so leaving $n$ small left a giant unreadable network. <\/p>\n<pre>\r\nSB0039_bigrams%\r\n count_bigrams()%&gt;%\r\n drop_na()\r\n<\/pre>\n<p>Here\u2019s an example of content in the bigrams table. Here <var>word1<\/var> is the first word in the bigram, <var>word2<\/var> is the second, and <var>n<\/var> is the frequency that bigram appeared in the document.\u00a0<\/p>\n<table border=\"1\">\n<tbody>\n<tr>\n<td><b>word1<\/b><\/td>\n<td><b>word2<\/b><\/td>\n<td><b>n<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">utah<\/span><\/td>\n<td><span style=\"font-weight: 400\">chapter<\/span><\/td>\n<td><span style=\"font-weight: 400\">2088<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">medicaid<\/span><\/td>\n<td><span style=\"font-weight: 400\">program<\/span><\/td>\n<td><span style=\"font-weight: 400\">878<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">care<\/span><\/td>\n<td><span style=\"font-weight: 400\">facility<\/span><\/td>\n<td><span style=\"font-weight: 400\">833<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">nursing<\/span><\/td>\n<td><span style=\"font-weight: 400\">care<\/span><\/td>\n<td><span style=\"font-weight: 400\">754<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">health<\/span><\/td>\n<td><span style=\"font-weight: 400\">care<\/span><\/td>\n<td><span style=\"font-weight: 400\">577<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">medicaid<\/span><\/td>\n<td><span style=\"font-weight: 400\">expansion<\/span><\/td>\n<td><span style=\"font-weight: 400\">465<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">managed<\/span><\/td>\n<td><span style=\"font-weight: 400\">care<\/span><\/td>\n<td><span style=\"font-weight: 400\">348<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">health<\/span><\/td>\n<td><span style=\"font-weight: 400\">insurance<\/span><\/td>\n<td><span style=\"font-weight: 400\">329<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">medical<\/span><\/td>\n<td><span style=\"font-weight: 400\">assistance<\/span><\/td>\n<td><span style=\"font-weight: 400\">328<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">medicaid<\/span><\/td>\n<td><span style=\"font-weight: 400\">waiver<\/span><\/td>\n<td><span style=\"font-weight: 400\">321<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre>SB0039_bigrams %&gt;%\r\n filter(n &gt; 100,\r\n     \t!str_detect(word1, \"\\\\d\"),\r\n     \t!str_detect(word2, \"\\\\d\")) %&gt;%\r\n  visualize_bigrams()\r\n<\/pre>\n<p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/mathvoices.ams.org\/featurecolumn\/wp-content\/uploads\/sites\/2\/2025\/01\/image3.png?w=600&#038;ssl=1\" alt=\"A word cloud showing relationships between words such as government and behavioral or care and facility.\"  \/><\/p>\n<p>There are not as many dark arrows here. The grey ones seem to flow from \u201cnursing\u201d to \u201cprogram\u201d . This connected network seems to talk a lot about healthcare, facilities, and programs. But I\u2019m still unsure of the overall content of this bill.<\/p>\n<h2>Conclusion<\/h2>\n<p>After pulling the bigrams and their networks to analyze their contents, my goal was to find the major themes of the legislation. For example, SB0016 and HB0132 are clearly about healthcare, which matches the categorization on Track Trans Legislation. But for others, like SB0093, SB0039, and HB0257 were more difficult to categorize using bigrams and their networks alone. HB209 is coded as \u201cyouth athletics\u201d and maybe the bigrams containing \u201cextracurricular activities\u201d should have clued me in, but to be more certain for future conclusions I need to look at more \u201cyouth athletic bills\u201d. Further, for the healthcare bills, I could identify that they were about health care and transgender access to health care, but I couldn\u2019t tell what restrictions were being put in place.\u00a0\u00a0<\/p>\n<p>When \u0130nce and I first proposed this project, it felt incredibly intimidating since I predominantly use SageMath for all my math needs, and very rarely venture into other tools. After doing this exploration, I felt confident in using these tools but realized that I need questions informed by the community impacted by these bills so that this data analysis is not <i>for<\/i> this community but <i>with<\/i> this community. As someone who is working to do better analyzing data using <a href=\"https:\/\/www.gida-global.org\/care\">CARE principles<\/a> for Indigenous data governance and data feminism, I need my practices to be informed by the community.\u00a0<\/p>\n<h2>Reading Further<\/h2>\n<ul>\n<li> <a href=\"https:\/\/www.tracktranslegislation.com\/\">2023 Anti-Trans Legislation<\/a><\/li>\n<li>Text mining examples:\n<ul>\n<li> <a href=\"https:\/\/www.tidytextmining.com\/ngrams.html\">Relationships between words: n-grams and correlations<\/a> (R)<\/li>\n<li> <a href=\"https:\/\/uc-r.github.io\/word_relationships\">Text Mining: Word Relationships&#8221;<\/a> (R)<\/li>\n<li> <a href=\"https:\/\/www.geeksforgeeks.org\/visualizing-text-data-techniques-and-applications\/\">Visualizing Text Data: Techniques and Applications<\/a> (Python)<\/li>\n<\/ul>\n<li> <a href=\"https:\/\/www.drew-lewis.com\/QR4SJ\/sec-leg-obtain-clean.html\">Quantitative Reasoning for Social Justice Chapter 5<\/a>\n<li> <a href=\"https:\/\/datascience.codata.org\/articles\/10.5334\/dsj-2020-043\">The CARE Principles for Indigenous Data Governance<\/a>\n<li> <a href=\"https:\/\/data-feminism.mitpress.mit.edu\/\">Data Feminism<\/a>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Can I use these text analyses to understand the content of the bill, without reading 400 pages? Visualizing anti-trans legislation using RStudio Bianca Thompson Westminster University While I was working with Kenan \u0130nce on their open source active learning book, Quantitative Reasoning for Social Justice, we discussed their dream chapter<span class=\"more-link\"><a href=\"https:\/\/mathvoices.ams.org\/featurecolumn\/2025\/01\/01\/visualizing-anti-trans-legislation-using-rstudio\/\">Read More &rarr;<\/a><\/span><\/p>\n","protected":false},"author":2,"featured_media":2037,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[178,179,137,25],"tags":[180,184,181,182,153,183],"class_list":["entry","author-uwhitcher","post-2206","post","type-post","status-publish","format-standard","has-post-thumbnail","category-178","category-bianca-thompson","category-math-and-social-sciences","category-probability-and-statistics","tag-legislation","tag-lgbtq-rights","tag-political-science","tag-r","tag-statistics","tag-textual-analysis"],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/mathvoices.ams.org\/featurecolumn\/wp-content\/uploads\/sites\/2\/2024\/07\/cropped-FC1380x500x2.png?fit=1380%2C288&ssl=1","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/mathvoices.ams.org\/featurecolumn\/wp-json\/wp\/v2\/posts\/2206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mathvoices.ams.org\/featurecolumn\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mathvoices.ams.org\/featurecolumn\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mathvoices.ams.org\/featurecolumn\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mathvoices.ams.org\/featurecolumn\/wp-json\/wp\/v2\/comments?post=2206"}],"version-history":[{"count":22,"href":"https:\/\/mathvoices.ams.org\/featurecolumn\/wp-json\/wp\/v2\/posts\/2206\/revisions"}],"predecessor-version":[{"id":2221,"href":"https:\/\/mathvoices.ams.org\/featurecolumn\/wp-json\/wp\/v2\/posts\/2206\/revisions\/2221"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mathvoices.ams.org\/featurecolumn\/wp-json\/wp\/v2\/media\/2037"}],"wp:attachment":[{"href":"https:\/\/mathvoices.ams.org\/featurecolumn\/wp-json\/wp\/v2\/media?parent=2206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mathvoices.ams.org\/featurecolumn\/wp-json\/wp\/v2\/categories?post=2206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mathvoices.ams.org\/featurecolumn\/wp-json\/wp\/v2\/tags?post=2206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}