| Title: | Cleaning Text Data with an AI Assistant | 
| Version: | 0.1.0 | 
| Description: | Provides functions to clean and standardize messy data, including textual categories and free-text addresses, using Large Language Models. The package corrects typos, expands abbreviations, and maps inconsistent entries to standardized values. Ideal for Bioinformatics, business, and general data cleaning tasks. | 
| License: | MIT + file LICENSE | 
| Encoding: | UTF-8 | 
| RoxygenNote: | 7.3.2 | 
| Imports: | cli, jsonlite, rlang, ellmer | 
| Depends: | R (≥ 4.1.0) | 
| LazyData: | true | 
| Suggests: | rmarkdown, testthat (≥ 3.0.0) | 
| Config/testthat/edition: | 3 | 
| URL: | https://github.com/anuopensci/emend, https://anuopensci.github.io/emend/ | 
| BugReports: | https://github.com/anuopensci/emend/issues | 
| NeedsCompilation: | no | 
| Packaged: | 2025-03-31 00:07:48 UTC; u1133824 | 
| Author: | Emi Tanaka | 
| Maintainer: | Jiajia Li <lijia970324@gmail.com> | 
| Repository: | CRAN | 
| Date/Publication: | 2025-04-01 16:20:02 UTC | 
emend: Cleaning Text Data with an AI Assistant
Description
Provides functions to clean and standardize messy data, including textual categories and free-text addresses, using Large Language Models. The package corrects typos, expands abbreviations, and maps inconsistent entries to standardized values. Ideal for Bioinformatics, business, and general data cleaning tasks.
Author(s)
Maintainer: Jiajia Li lijia970324@gmail.com (ORCID)
Authors:
- Emi Tanaka dr.emi.tanaka@gmail.com (ORCID) [copyright holder] 
See Also
Useful links:
- Report bugs at https://github.com/anuopensci/emend/issues 
Airbnb listings and reviews
Description
A sample dataset of Airbnb listings and reviews of properties from Sydney, Australia.
Usage
airbnb_listings
airbnb_reviews
Format
airbnb_listings
A data.frame with 1623 rows and 68 columns
- id
- Airbnb's unique identifier for the listing. 
- name
- Name of the listing. 
- description
- Detailed description of the listing. 
- neighborhood_overview
- Host's description of the neighbourhood. 
- picture_url
- URL to the Airbnb hosted regular sized image for the listing. 
- host_id
- Airbnb's unique identifier for the host/user. 
- host_name
- Name of the host. Usually just the first name(s). 
- host_since
- The date the host/user was created. For hosts that are Airbnb guests this could be the date they registered as a guest. 
- host_location
- The host's self reported location. 
- host_about
- Description about the host. 
- host_response_time
- The time interval between when a host responds to an inquiry from a guest. 
- host_response_rate
- Percentage of inquiries from potential guests that are responded to by hosts. 
- host_acceptance_rate
- That rate at which a host accepts booking requests. 
- host_is_superhost
- Whether the host is a super host or not. 
- host_thumbnail_url
- A thumbnail of the host. 
- host_picture_url
- A URL to the picture of the host. 
- host_neighbourhood
- The host neighbourhood. 
- host_listings_count
- The number of listings the host has. 
- host_total_listings_count
- The number of listings the host has. 
- host_verifications
- Host communication verifications. 
- host_has_profile_pic
- Whether the host has a profile pic. 
- host_identity_verified
- Whether the host has their identity verified. 
- neighbourhood_cleansed
- The neighbourhood as geocoded using the latitude and longitude against neighborhoods as defined by open or public digital shapefiles. 
- latitude
- Uses the World Geodetic System (WGS84) projection for latitude and longitude. 
- longitude
- Uses the World Geodetic System (WGS84) projection for latitude and longitude. 
- property_type
- Self selected property type. Hotels and Bed and Breakfasts are described as such by their hosts in this field. 
- room_type
- Entire home/apt, Private room, Shared room, or Hotel. Entire places are best if you're seeking a home away from home. With an entire place, you'll have the whole space to yourself. This usually includes a bedroom, a bathroom, a kitchen, and a separate, dedicated entrance. Hosts should note in the description if they'll be on the property or not (ex: "Host occupies first floor of the home"), and provide further details on the listing. Private rooms are great for when you prefer a little privacy, and still value a local connection. When you book a private room, you'll have your own private room for sleeping and may share some spaces with others. You might need to walk through indoor spaces that another host or guest may occupy to get to your room. Shared rooms are for when you don't mind sharing a space with others. When you book a shared room, you'll be sleeping in a space that is shared with others and share the entire space with other people. Shared rooms are popular among flexible travelers looking for new friends and budget-friendly stays. 
- accommodates
- The maximum capacity of the listing. 
- bathrooms
- The number of bathrooms in the listing. 
- bathrooms_text
- The text of the number of bathsroom in the listings. 
- bedrooms
- The number of bedrooms. 
- beds
- The number of bed(s). 
- amenities
- The amenities. 
- price
- Daily price in local currency. 
- minimum_nights
- Minimum number of night stay for the listing. 
- maximum_nights
- Maximum number of night stay for the listing. 
- minimum_minimum_nights
- The smallest minimum_night value from the calender (looking 365 nights in the future). 
- maximum_minimum_nights
- The largest minimum_night value from the calender (looking 365 nights in the future). 
- minimum_maximum_nights
- The smallest maximum_night value from the calender (looking 365 nights in the future). 
- maximum_maximum_nights
- The largest maximum_night value from the calender (looking 365 nights in the future). 
- minimum_nights_avg_ntm
- The average minimum_night value from the calender (looking 365 nights in the future). 
- maximum_nights_avg_ntm
- The average maximum_night value from the calender (looking 365 nights in the future). 
- has_availability
- Whether there is availability or not. 
- availability_30
- The availability of the listing x days in the future as determined by the calendar. Note a listing may not be available because it has been booked by a guest or blocked by the host. 
- availability_60
- availability_90
- availability_365
- number_of_reviews
- The number of reviews the listing has. 
- number_of_reviews_ltm
- The number of reviews the listing has (in the last 12 months). 
- number_of_reviews_l30d
- The number of reviews the listing has (in the last 30 days). 
- first_review
- The date of the first/oldest review. 
- last_review
- The date of the last/newest review. 
- review_scores_rating
- The review score for ratings of the listing. 
- review_scores_accuracy
- The review score for accuracy of the listing. 
- review_scores_cleanliness
- The review score for cleanliness of the listing. 
- review_scores_checkin
- The review score for checkin experience of the listing. 
- review_scores_communication
- The review score for communication of the listing. 
- review_scores_location
- The review score for location of the listing. 
- review_scores_value
- The review score for value of the listing. 
- license
- The licence/permit/registration number. 
- instant_bookable
- Whether the guest can automatically book the listing without the host requiring to accept their booking request. An indicator of a commercial listing. 
- calculated_host_listings_count
- The number of listings the host has in the current scrape, in the city/region geography. 
- calculated_host_listings_count_entire_homes
- The number of Entire home/apt listings the host has in the current scrape, in the city/region geography. 
- calculated_host_listings_count_private_rooms
- The number of Private room listings the host has in the current scrape, in the city/region geography. 
- calculated_host_listings_count_shared_rooms
- The number of Shared room listings the host has in the current scrape, in the city/region geography. 
- reviews_per_month
- The average number of reviews per month the listing has over the lifetime of the listing. 
airbnb_reviews
A data.frame with 5679 rows and 6 columns
- listing_id
- Unique identifier for the listing 
- id
- Unique identifier for the review 
- date
- Date of the review 
- reviewer_id
- Unique identifier for the reviewer 
- reviewer_name
- Name of the reviewer 
- comments
- Text of the review 
Source
https://insideairbnb.com/get-the-data/
Alcohol warehouse and retail sales
Description
- year
- Year 
- month
- Month 
- supplier
- Supplier 
- item_code
- Item code 
- item_description
- Item description 
- item_type
- Item type 
- retail_sales
- Retail sales 
- retail_transfers
- Retail transfers 
- warehouse_sales
- Warehouse sales 
Usage
alcohol
Format
An object of class spec_tbl_df (inherits from tbl_df, tbl, data.frame) with 1000 rows and 9 columns.
Source
https://catalog.data.gov/dataset/warehouse-and-retail-sales
Amazon consumer reviews
Description
A sample of reviews from Amazon in the applicances category.
Usage
consumer
Format
A data.frame with 4549 rows and 11 columns
- overall
- Overall rating of the product. 
- verified
- Whether the reviewer is verified or not. 
- review_date
- Review date. 
- review_id
- A unique identifier of the reviewer. 
- reviewer_name
- The name of the reviewer. 
- review_text
- The text of the review. 
- summary
- Summary of the review. 
- vote_helpful
- The number of helpful votes of the review. 
- image
- The images that the reviewer post after they receive the product. 
Source
Jianmo Ni, Jiacheng Li, Julian McAuley (2019) Justifying recommendations using distantly-labeled reviews and fined-grained aspects. Empirical Methods in Natural Language Processing .
Standardise address format
Description
This function standardise inconsistent address formats to a standard format.
Usage
emend_clean_address(address_vector, chat = get_default_chat())
Arguments
| address_vector | A character vector that is assumed to be addresses. | 
| chat | A chat object defined by ellmer. | 
Value
A character vector with converted addresses.
Examples
# Convert a vector of inconsistent formatted address to a standard format
options(ellmer_timeout_s = 3600) 
x <- c("154 university avenue, acton act 2601",
       "76/2 Cape Street, Dickson ACT 2602",
       "Shop 4/96 Bunda St, Canberra ACT 2601",
       "11 E Row, Canberra ACT 2601",
       "173/46 Macquarie St, Barton ACT 2600",
       "Unit 189/260 City walk, Canberra ACT 2601",
       "the kebab place",
       "i don't know the address")
chat <- ellmer::chat_ollama(model = "llama3.1:8b", seed = 0, echo = "none")
emend_clean_address(x, chat = chat)
 
Standardise date format
Description
This function standardise inconsistent date formats.
Usage
emend_clean_date(dates_vector, chat = get_default_chat())
Arguments
| dates_vector | A character vector that is assumed to be dates. | 
| chat | A chat object defined by ellmer. | 
Value
A vector of Date objects.
Examples
x <- c("16/02/1997", "20 November 2024", "24 Mar 2022", "2000-01-01", "Jason", 
       "Dec 25, 2030", "11/05/2024", "March 10, 1999")
chat <- ellmer::chat_ollama(model = "llama3.1:8b", seed = 0, echo = "none")
emend_clean_date(x, chat = chat)
Match input factor to specified levels.
Description
Match input factor to specified levels.
Usage
emend_fct_match(.f, levels = NULL, chat = get_default_chat())
Arguments
| .f | A factor. | 
| levels | The levels of the factor | 
| chat | A chat object defined by ellmer. | 
Value
A factor with levels matching the provided levels argument.
Examples
chat <- ellmer::chat_ollama(model = "llama3.1:8b", seed = 0, echo = "none")
emend_fct_match(messy$country, levels = c("UK", "USA", "Canada", "Australia", "NZ"), chat = chat)
Reorder the levels of the input factor in a meaningful way.
Description
Reorder the levels of the input factor in a meaningful way.
Usage
emend_fct_reorder(.f, chat = get_default_chat())
Arguments
| .f | A vector of characters or a factor. | 
| chat | A chat object defined by ellmer. | 
Value
A factor with standardized category labels.
Examples
chat <- ellmer::chat_ollama(model = "llama3.1:8b", seed = 0, echo = "none")
emend_fct_reorder(likerts$likert1, chat = chat) |> levels()
Match the input factor to supplied levels.
Description
Match the input factor to supplied levels.
Usage
emend_lvl_match(.f, levels = NULL, chat = get_default_chat())
Arguments
| .f | A vector of characters or a factor. | 
| levels | The levels of the factor. | 
| chat | The chat object defined by ellmer. | 
Value
A named character vector of standardised category labels, with the class "emend_lvl_match".
The names correspond to the original messy categories, and the values are the cleaned versions.
Examples
chat <- ellmer::chat_ollama(model = "llama3.1:8b", seed = 0, echo = "none")
emend_lvl_match(messy$country,
                levels = c("Asia", "Europe", "North America", "Oceania",
                           "South America"),
                chat = chat)
Get the unique levels of messy categorical data
Description
The returned value is a vector. The LLM will return full names instead of abbreviations. You can use this functions to clean up your categorical data and obtain unique levels. Double check if the output from LLM is true to your data. This function is generally suitable for categories, not working well with sentences and too many categories.
Usage
emend_lvl_unique(.f, chat = get_default_chat())
Arguments
| .f | A vector of characters or a factor. | 
| chat | A chat object defined by ellmer. | 
Value
A character vector of standardised category names.
Examples
options(ellmer_timeout_s = 3600)
chat <- ellmer::chat_ollama(model = "llama3.1:8b", seed = 0, echo = "none")
emend_lvl_unique(messy$country, chat = chat)
Translate text from one language to another.
Description
Translate text from one language to another.
Usage
emend_translate(text, to = "English", chat = get_default_chat())
Arguments
| text | The text to translate. | 
| to | The language to translate to. The default is "English". | 
| chat | An ellmer Chat object. | 
Value
A character vector of translated text.
Examples
chat <- ellmer::chat_ollama(model = "llama3.1:8b", seed = 0, echo = "none")
emend_translate(c("\u733F\u3082\u6728\u304B\u3089\u843D\u3061\u308B", 
                  "\u4F60\u597D", "bon appetit"), chat = chat)
Identify the language in the text.
Description
Identify the language in the text.
Usage
emend_what_language(text, chat = get_default_chat())
Arguments
| text | A string or a factor that contains text information. | 
| chat | A chat object defined by ellmer | 
Value
A character vector of language names.
Examples
chat <- ellmer::chat_ollama(model = "llama3.1:8b", seed = 0, echo = "none")
emend_what_language(c("\u733F\u3082\u6728\u304B\u3089\u843D\u3061\u308B", 
                      "\u4F60\u597D", "bon appetit"), chat = chat)
Get or create the default chat object
Description
Get or create the default chat object
Usage
get_default_chat()
Value
A Chat object.
Hotel reviews
Description
A sample review of hotels.
Usage
hotel
Format
A data.frame with 13,193 rows and 8 columns
- reviewer_name
- The name of the reviewer. 
- reviewer_nationality
- The nationality of the reviewer. 
- reviewer_rating
- Reviewer's rating. 
- review_date
- Date of the review. 
- review_title
- Title of the review. 
- review_text
- Text of the review. 
- hotel_name
- Name of the hotel being reviewed. 
- avg_rating
- Average rating of the hotel. 
Source
https://www.kaggle.com/datasets/nikitaryabukhin/reviewshotel
A collection of different likert scales
Description
A data set containing 9 different likert scales.
Usage
likerts
Format
A data.frame with 40 rows and 9 columns
- likert1
- A 7-point agreeableness likert scale. 
- likert2
- A 5-point agreeableness likert scale. 
- likert3
- A 5-point agreeableness likert scale as a sentence. 
- likert4
- A 5-point frequency likert scale. 
- likert5
- A 5-point rating likert scale. 
- likert6
- A 5-point likelihood likert scale. 
- likert7
- A 5-point likert scale. 
- likert8
- A 5-point satisfaction likert scale. 
- likert9
- A 6-point priority likert scale. 
A collection of messy inputs
Description
A synthetic dataset that contains inputs with some common standardisation issues.
Usage
messy
Format
A list of 3 character vectors
- country
- A character vector of countries. 
- suburb
- A character vector of suburbs in Australia with various typos. 
- school
- A character vector of schools or college (with typos) at the Australian National University. 
Recipes
Description
A sample of 200 recipes.
Usage
recipes
Format
A data.frame with 200 rows and 7 columns.
- name
- The name of the dish. 
- ingredients
- The list of ingredients. 
- url
- The URL of the recipe. 
- image
- An image of the dish. 
- cook_time
- Cooking time. 
- prep_time
- Preperation time. 
- servings
- The number of servings in text. 
Source
https://github.com/jakevdp/open-recipe-data/tree/main
Registration data for workshops
Description
A dataset containing registration information for a series of workshops The dataset includes columns for workshop name, affiliation, and the cleaned affiliation by hand.
Usage
registration
Format
A data frame with 221 rows and 3 columns:
- Workshop
- Character: Workshop name and time. 
- Affiliation
- Character: Affiliation input by participants. 
- GroundTruth
- Character: The cleaned affiliation type, cleaned manually by author. 
Source
Real registration data from the Biological Data Science Institute, Australian National University.
Review of Iori restaurant
Description
Iori is a Japanese restaurant in Canberra, Australia. The data contains a sample of 20 reviews from Google maps.
Usage
restaurant
Format
A data.frame with 20 rows and 2 columns
- review
- The text of the review. 
- rating
- A rating out of 5. 
Ask A Manager Salary Survey 2021
Description
Ask A Manager Salary Survey 2021
Usage
salary
Format
A data.frame with 28,083 rows and 18 columns
- timestamp
- The timestampe of response. 
- age
- Age cateogry. "How old are you?" 
- industry
- Categorical but respondents can enter text for Other. "What industry do you work in?" 
- job_title
- Text entry. "Job title" 
- job_title_context
- Text entry. "If your job title needs additional context, please clarify here:" 
- salary_annual
- Text entry. "What is your annual salary? (You'll indicate the currency in a later question. If you are part-time or hourly, please enter an annualized equivalent – what you would earn if you worked the job 40 hours a week, 52 weeks a year.)" 
- salarly_additional
- Text entry. "How much additional monetary compensation do you get, if any (for example, bonuses or overtime in an average year)? Please only include monetary compensation here, not the value of benefits." 
- currency
- Categorical entry. "Please indicate the currency" 
- currency_other
- Text entry. "If "Other," please indicate the currency here:" 
- salary_context
- Text entry. "If your income needs additional context, please provide it here:" 
- country
- Text entry. "What country do you work in?" 
- state
- Categorical entry. "If you're in the U.S., what state do you work in?" 
- city
- Text entry. "What city do you work in?" 
- experience_overall
- Categorical entry. "How many years of professional work experience do you have overall?" 
- experience_in_field
- Categorical entry. "How many years of professional work experience do you have in your field?" 
- education
- Categorical entry."What is your highest level of education completed?" 
- gender
- Categorical entry. "What is your gender?" 
- race
- Multiselect entry. "What is your race? (Choose all that apply.)" 
Source
https://www.askamanager.org/2021/04/how-much-money-do-you-make-4.html