The idea of Ngram is that it is a view of N string of length k without 
using k times as much memory. I would like to preform operation the set of 
Ngram string, let's say unique(). In those cases I expect it to be treat as 
1 dimension Array of String.

I am making some progress with similar defined like this

Base.similar(s::Ngram) = Array(ASCIIString)
Base.similar(a::Ngram, dims::Dims) = Array(ASCIIString, dims)
Base.similar{T}(a::Ngram, ::Type{T}, dims::Dims) = Array(T, dims)

So far I have successfully applied, map(), maximum(), unique(), etc. sort() 
gives an error though

In [428]:

sort(s)

access to undefined reference
while loading In[428], in expression starting on line 1

 in sort at sort.jl:342


Wai yip


On Thursday, February 5, 2015 at 3:47:26 AM UTC-8, Milan Bouchet-Valat 
wrote:
>
>  Le mercredi 04 février 2015 à 23:11 -0800, Wai Yip Tung a écrit : 
>
> I have successfully defined a custom array Ngram. 
>
>  
>
>  type Ngram <: AbstractArray{ASCIIString,1} 
>
>      seq::ASCIIString 
>
>      n::Int 
>
>  end 
>
>  
>
>  function getindex(s::Ngram, i::Int) 
>
>      s.seq[i:i+s.n-1] 
>
>  end 
>
>  
>
>  function Base.size(s::Ngram)
>
>      length(s.seq) - s.n + 1 
>
>  end 
>
>  
>
>  
>
>  It works as I expected. For example 
>
>  
>
>  In [219]: 
>
>  
>  
>  
>  ng=SeqUtil.Ngram("hello",2)
>
>  
>  
>  Out[219]: 
>
>  4-element Ngram:
>  "he"
>  "el"
>  "ll"
>  "lo"
>
>  
>
>  But it seems in other usage, a corresponding `similar` method is 
> necessary 
>
>  
>
>  In [222]: 
>
>  
>  
>  
>  map(print,ng)
>
>  
>  
>  
>  he
>
>  
>  `similar` has no method matching similar(::Ngram, ::Type{Nothing}, 
> ::(Int32,))
> while loading In[222], in expression starting on line 1
>
>  in similar at abstractarray.jl:116
>  in map at abstractarray.jl:1329
>
>  
>
>  I have read the documentation and I still don't get what I need to do in 
> the similar method. You help will be appreciated. 
>
> That method should just create an array of the same type, with the same 
> element type and dimensions by default, but accepting arguments to override 
> these two values. For example, you can see what that function does for 
> standard Arrays with: ...@edit <javascript:> similar([1:3]). In the case 
> of map(f, ng), the goal is to create an array to hold the result: its 
> element type must be that of the result of calling f on an element of ng, 
> and its dimensions must be the the same as ng.
>
> The problem with Ngram is that it cannot store the result of calling map() 
> on it. So I'm not sure what's the best solution here. Looks like Ngram is 
> not really an AbstractArray, only an iterable and indexable, in which 
> case a different map() method would be used. Then you wouldn't implement 
> similar()., but rather the start()/next()/done() iteration protocol.
>
> Regards 
>  

Reply via email to