Compare Text Differences Between Two Contents (%) Using Ruby on Rails
Requirement: Compare two contents (HTML, JavaScript code or any other text) and find text difference in percentage(%) between them.
Technology: Ruby on Rails
Versions: Rails: 5.1.4 , Ruby: 2.4.1 (would work with almost any version)
Git Repo: https://github.com/AnkurVyas-BTC/compare
We are going to build something like below.
Difference Comparison (%)
For this we are going to use string metric called as Levenshtein distance.
PC: https://www.memecenter.com/fun/1057701/virus-elaboration
Okay sir !!!
In information theory, Linguistics and computer science, the Levenshtein distance is a string metric for measuring the difference between two sequences. It is named after Vladimir Levenshtein, who considered this distance in 1965.
Informally, the Levenshtein distance between two words is the minimum number of single-character edits (insertions, deletions or substitutions) required to change one word into the other.
For this, we are going to use text gem. Let’s start creating our app.
$ rails new compare
This will create our rails app with name compare.
Then move to our app directory and install the dependencies.
$ bundle install
If above command gives you an error you may need install bundler gem for this.
$ gem install bundler
Now your rails app is ready. Let’s add text gem to our app. Open Gemfile and write following line to add gem.
gem 'text'
Again do bundle install
to install the gem.
Let’s create controller now by the following command.
$ rails g controller comparisons compare
This will generate following files.
Output of comparison controller generation!
Add the routes at config/routes.rb
Rails.application.routes.draw do
get ‘comparisons/compare’
post ‘comparisons/compare_sections’
root to: ‘comparisons#compare’
end
Now go to controllers/comparisons_controller.rb
file and paste following contents.
Gist for comparisons controller
Idea below (sample code run on irb console)
irb code
So from above the distance between ankur and abkur is 20% as there is 1 character change out of 5. This is exactly what we want.
Leveraging the above functionality, the code is like below
distance = Text::Levenshtein.distance(params[:left_section], params[:right_section]).to_f
Here is the view file.
app/views/comparisons/compare.html.erb
Now as we have written remote: true in the form it would send an AJAX request. Following the the AJAX response code,
app/views/comparisons/compare_sections.js.erb
Result text shows in green when both contents are same and shows in red when contents are different!
You can find the whole github code here.
Thanks for reading. If you liked it, press the clap & share 🙂
At BoTree Technologies, we build enterprise applications with our RoR team of 25+ engineers.
We also specialize in RPA, AI, Python, Django, JavaScript and ReactJS.