You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
NaN (or ArgumentError) from QGram distances for short strings #61
Maybe it is better to have a consistent behaviour for such inputs? Returning an ArgumentError might be better and then the caller has to decide how to handle such situations.
I am not sure there is an issue with the current implementation. The way I think about it is that there is a formula for each Qgram distance (given in the docs), which is valid even when the set of qgrams is empty. In some distances, the length of qgrams appears in the denominator, which is why the distance returns NaN when the set of qgrams is empty.
I see dangers in actual use but ok, people will have to handle it themselves. I guess a simple solution might be to just highlight somewhere in the documentation that one can add a safe evaluate method like so:
julia>functionsafeevaluate(D::Union{Cosine, Overlap, MorisitaOverlap}, s1, s2)
length(s1) >= D.q &&length(s2) >= D.q &&return(evaluate(D, s1, s2))
throw(ArgumentError("An argument is shorter than q ($(D.q)): \"$s1\", \"$s2\""))
end
safeevaluate (generic function with 1 method)
julia> D =Cosine(2)
Cosine(2)
julia>@assertsafeevaluate(D, "aa", "bb") ==evaluate(D, "aa", "bb")
julia>safeevaluate(D, "", "bb")
ERROR: ArgumentError: An argument is shorter than q (2):"", "bb"
Stacktrace:
[1] safeevaluate(D::Cosine, s1::String, s2::String)
@ Main ./REPL[2]:3
[2] top-level scope
@ REPL[5]:1
julia>functionsafeevaluate(D::Union{Jaccard, SorensenDice, NMD}, s1, s2)
(length(s1) >= D.q ||length(s2) >= D.q) &&return(evaluate(D, s1, s2))
throw(ArgumentError("An argument is shorter than q ($(D.q)): \"$s1\", \"$s2\""))
end
safeevaluate (generic function with 2 methods)
julia>safeevaluate(Jaccard(2), "", "")
ERROR: ArgumentError: An argument is shorter than q (2):"", ""
Stacktrace:
[1] safeevaluate(D::Jaccard, s1::String, s2::String)
@ Main ./REPL[11]:3
[2] top-level scope
@ REPL[12]:1
Activity
robertfeldt commentedon Dec 20, 2022
Note that it goes even deeper since all but QGram returns NaN if both inputs are shorter than q:
matthieugomez commentedon Dec 22, 2022
I am not sure there is an issue with the current implementation. The way I think about it is that there is a formula for each Qgram distance (given in the docs), which is valid even when the set of qgrams is empty. In some distances, the length of qgrams appears in the denominator, which is why the distance returns NaN when the set of qgrams is empty.
robertfeldt commentedon Dec 22, 2022
Mathematically I agree.
I see dangers in actual use but ok, people will have to handle it themselves. I guess a simple solution might be to just highlight somewhere in the documentation that one can add a
safe evaluatemethod like so:matthieugomez commentedon Dec 22, 2022
Sure. I'm also open to change things — following what other libraries typically do in this case. I will leave this issue open.
matthieugomez commentedon Apr 8, 2026
Fixed in 20aeac7