来自TextMining的语料库需要显式父类型转换

时间:2016-09-26 15:09:06

标签: julia text-mining

我正在尝试朱莉娅的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))

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

代码有两个问题。

  1. @data创建一个DataArray,TextAnalysis代码不知道如何处理。像你一样编写显式转换是一种完全可以接受的方法来处理它。您使用DataArrays而不是普通数组是否有特殊原因?

  2. 即使您删除@data,代码也会失败。这是因为Corpus的构造函数受限于它可以作为参数(以及Julia数组不是共变体的事实)。

  3. 一种解决方法,同样是明确转换。正确的解决方法是定义一个新的构造函数,如下所示。这可能应该添加到包中,但您可以直接在REPL中使用以下代码:

    TextAnalysis.Corpus{T<:AbstractDocument}(docs::Vector{T}) = TextAnalysis.Corpus(convert(Array{GenericDocument,1}, docs))
    

    有了这个,你可以这样做:

    julia> @>> ["hello","bro"] map(StringDocument) Corpus
    A Corpus