我正在尝试朱莉娅的text mining module。
当我使用Corpus
提供DataArray{TextAnalysis.StringDocument,1}
函数时,我收到了转换错误,即(注意我使用Lazy
pacakge来管道命令)
using Lazy, TextMining, DataArrays
@>> @data(["hello","bro"]) map(StringDocument) Corpus
->LoadError: MethodError: `convert` has no method matching convert(::Type{TextAnalysis.Corpus}, ::DataArrays.DataArray{TextAnalysis.StringDocument,1})
This may have arisen from a call to the constructor TextAnalysis.Corpus(...),
since type constructors fall back to convert methods.WARNING: Error showing method candidates, aborted
我需要应用convert(Vector{GenericDocument})
来使这段代码工作:
@>> @data(["hello","bro"]) map(StringDocument) convert(Vector{GenericDocument}) Corpus
这是Corpus功能:
type Corpus
documents::Vector{GenericDocument}
total_terms::Int
lexicon::Dict{Compat.UTF8String, Int}
inverse_index::Dict{Compat.UTF8String, Vector{Int}}
h::TextHashFunction
end
function Corpus(docs::Vector{GenericDocument})
Corpus(
docs,
0,
Dict{Compat.UTF8String, Int}(),
Dict{Compat.UTF8String, Vector{Int}}(),
TextHashFunction()
)
end
Corpus(docs::Vector{Any}) = Corpus(convert(Array{GenericDocument,1}, docs))
我在这里缺少什么?
答案 0 :(得分:0)
代码有两个问题。
@data
创建一个DataArray,TextAnalysis代码不知道如何处理。像你一样编写显式转换是一种完全可以接受的方法来处理它。您使用DataArrays而不是普通数组是否有特殊原因?
即使您删除@data
,代码也会失败。这是因为Corpus
的构造函数受限于它可以作为参数(以及Julia数组不是共变体的事实)。
一种解决方法,同样是明确转换。正确的解决方法是定义一个新的构造函数,如下所示。这可能应该添加到包中,但您可以直接在REPL中使用以下代码:
TextAnalysis.Corpus{T<:AbstractDocument}(docs::Vector{T}) = TextAnalysis.Corpus(convert(Array{GenericDocument,1}, docs))
有了这个,你可以这样做:
julia> @>> ["hello","bro"] map(StringDocument) Corpus
A Corpus