2017-04-18 23:20:12 +03:00
# frozen_string_literal: true
2017-06-01 16:29:14 +03:00
2017-04-18 23:20:12 +03:00
require 'rails_helper'
describe LanguageDetector do
2017-09-16 15:59:41 +03:00
describe 'prepare_text' do
2017-06-01 16:29:14 +03:00
it 'returns unmodified string without special cases' do
string = 'just a regular string'
2017-09-16 15:59:41 +03:00
result = described_class . instance . send ( :prepare_text , string )
2017-06-01 16:29:14 +03:00
expect ( result ) . to eq string
end
it 'collapses spacing in strings' do
string = 'The formatting in this is very odd'
2017-09-16 15:59:41 +03:00
result = described_class . instance . send ( :prepare_text , string )
2017-06-01 16:29:14 +03:00
expect ( result ) . to eq 'The formatting in this is very odd'
end
it 'strips usernames from strings before detection' do
string = '@username Yeah, very surreal...! also @friend'
2017-09-16 15:59:41 +03:00
result = described_class . instance . send ( :prepare_text , string )
2017-06-01 16:29:14 +03:00
expect ( result ) . to eq 'Yeah, very surreal...! also'
end
it 'strips URLs from strings before detection' do
string = 'Our website is https://example.com and also http://localhost.dev'
2017-09-16 15:59:41 +03:00
result = described_class . instance . send ( :prepare_text , string )
2017-06-01 16:29:14 +03:00
expect ( result ) . to eq 'Our website is and also'
end
it 'strips #hashtags from strings before detection' do
string = 'Hey look at all the #animals and #fish'
2017-09-16 15:59:41 +03:00
result = described_class . instance . send ( :prepare_text , string )
2017-06-01 16:29:14 +03:00
expect ( result ) . to eq 'Hey look at all the and'
end
end
2017-09-16 15:59:41 +03:00
describe 'detect' do
let ( :account_without_user_locale ) { Fabricate ( :user , locale : nil ) . account }
2018-10-05 20:17:46 +03:00
let ( :account_remote ) { Fabricate ( :account , domain : 'joinmastodon.org' ) }
2017-09-16 15:59:41 +03:00
2017-05-03 17:59:31 +03:00
it 'detects english language for basic strings' do
strings = [
2017-06-09 19:09:37 +03:00
" Hello and welcome to mastodon how are you today? " ,
2017-05-03 17:59:31 +03:00
" I'd rather not! " ,
" a lot of people just want to feel righteous all the time and that's all that matters " ,
]
strings . each do | string |
2017-09-16 15:59:41 +03:00
result = described_class . instance . detect ( string , account_without_user_locale )
2017-05-03 17:59:31 +03:00
expect ( result ) . to eq ( :en ) , string
end
2017-04-18 23:20:12 +03:00
end
it 'detects spanish language' do
2018-07-14 05:05:36 +03:00
string = 'Obtener un Hola y bienvenidos a Mastodon. Obtener un Hola y bienvenidos a Mastodon. Obtener un Hola y bienvenidos a Mastodon. Obtener un Hola y bienvenidos a Mastodon'
2017-09-16 15:59:41 +03:00
result = described_class . instance . detect ( string , account_without_user_locale )
2017-04-18 23:20:12 +03:00
expect ( result ) . to eq :es
end
2017-04-19 00:39:51 +03:00
describe 'when language can\'t be detected' do
2017-06-09 19:09:37 +03:00
it 'uses nil when sent an empty document' do
2017-09-16 15:59:41 +03:00
result = described_class . instance . detect ( '' , account_without_user_locale )
2017-06-09 19:09:37 +03:00
expect ( result ) . to eq nil
2017-04-18 23:20:12 +03:00
end
2017-04-22 05:26:25 +03:00
describe 'because of a URL' do
2017-06-09 19:09:37 +03:00
it 'uses nil when sent just a URL' do
2017-04-22 05:26:25 +03:00
string = 'http://example.com/media/2kFTgOJLXhQf0g2nKB4'
Use CLD3 (#2949)
Compact Language Detector v3 (CLD3) is the successor of CLD2, which was
used in the previous implementation. CLD3 includes improvements since CLD2,
and supports newer compilers. On the other hand, it has additional
requirements and cld3-ruby, the FFI of CLD3 for Ruby, is still new and may
be still inmature.
Though CLD3 is named after CLD2, it is implemented with a neural network
model, different from the old implementation, which is based on a Naïve
Bayesian classifier.
CLD3 supports newer compilers, such as GCC 6. CLD2 is not compatible with
GCC 6 because it assigns negative values to varibales typed unsigned.
(see internal/cld_generated_cjk_uni_prop_80.cc) The support for GCC 6 and
newer compilers are essential today, when some server operating system
such as Ubuntu Server 16.10 has GCC 6 by default.
On the one hand, CLD3 requires C++11 support. Environments with old
compilers such as Ubuntu Server 14.04 needs to update the system or install
a newer compiler.
CLD3 needs protocol buffers as a new dependency. However,it is not
considered problematic because major server operating systems, CentOS and
Ubuntu Server provide them.
The FFI cld3-ruby was written by me (Akihiko Odaki) for use in Mastodon.
It is still new and may be inmature, but confirmed to pass existing tests.
2017-05-09 20:58:03 +03:00
cld_result = CLD3 :: NNetLanguageIdentifier . new ( 0 , 2048 ) . find_language ( string )
2017-05-03 17:59:31 +03:00
expect ( cld_result ) . not_to eq :en
2017-04-22 05:26:25 +03:00
2017-09-16 15:59:41 +03:00
result = described_class . instance . detect ( string , account_without_user_locale )
2017-04-22 05:26:25 +03:00
2017-06-09 19:09:37 +03:00
expect ( result ) . to eq nil
2017-04-22 05:26:25 +03:00
end
end
2017-04-18 23:20:12 +03:00
describe 'with an account' do
it 'uses the account locale when present' do
2017-05-09 00:10:50 +03:00
account = double ( user_locale : 'fr' )
2017-09-16 15:59:41 +03:00
result = described_class . instance . detect ( '' , account )
2017-04-18 23:20:12 +03:00
2018-07-14 05:05:36 +03:00
expect ( result ) . to eq nil
2017-04-18 23:20:12 +03:00
end
2017-06-09 19:09:37 +03:00
it 'uses nil when account is present but has no locale' do
2018-10-04 13:36:53 +03:00
result = described_class . instance . detect ( '' , account_without_user_locale )
2017-04-18 23:20:12 +03:00
2017-06-09 19:09:37 +03:00
expect ( result ) . to eq nil
2017-04-18 23:20:12 +03:00
end
end
describe 'with an `en` default locale' do
2017-06-09 19:09:37 +03:00
it 'uses nil for undetectable string' do
2017-09-16 15:59:41 +03:00
result = described_class . instance . detect ( '' , account_without_user_locale )
2017-04-18 23:20:12 +03:00
2017-06-09 19:09:37 +03:00
expect ( result ) . to eq nil
2017-04-18 23:20:12 +03:00
end
end
2018-10-05 20:17:46 +03:00
describe 'remote user' do
2019-03-15 06:07:09 +02:00
it 'detects Korean language' do
2018-10-05 20:17:46 +03:00
string = '안녕하세요'
result = described_class . instance . detect ( string , account_remote )
2019-03-15 06:07:09 +02:00
expect ( result ) . to eq :ko
2018-10-05 20:17:46 +03:00
end
end
2017-04-18 23:20:12 +03:00
describe 'with a non-`en` default locale' do
around ( :each ) do | example |
before = I18n . default_locale
I18n . default_locale = :ja
example . run
I18n . default_locale = before
end
2017-06-09 19:09:37 +03:00
it 'uses nil for undetectable string' do
2017-04-18 23:20:12 +03:00
string = ''
2017-09-16 15:59:41 +03:00
result = described_class . instance . detect ( string , account_without_user_locale )
2017-04-18 23:20:12 +03:00
2017-06-09 19:09:37 +03:00
expect ( result ) . to eq nil
2017-04-18 23:20:12 +03:00
end
end
end
end
end