Enums Elixir:Enum.EmptyError将列表传递给Senient库
我试图通过将每个句子传递到外部库Sentient中的analyze函数来对一部小说进行情感分析。我反复遇到以下错误:Enums Elixir:Enum.EmptyError将列表传递给Senient库,enums,elixir,Enums,Elixir,我试图通过将每个句子传递到外部库Sentient中的analyze函数来对一部小说进行情感分析。我反复遇到以下错误: (Enum.EmptyError) empty error (elixir) lib/enum.ex:1590: Enum.reduce/2 (elixir) lib/enum.ex:1184: Enum."-map/2-lists^map/1-0-"/2 (sentiment) lib/sentiment.ex:23: Sentiment.analyze/1 (sentimen
(Enum.EmptyError) empty error
(elixir) lib/enum.ex:1590: Enum.reduce/2
(elixir) lib/enum.ex:1184: Enum."-map/2-lists^map/1-0-"/2
(sentiment) lib/sentiment.ex:23: Sentiment.analyze/1
(sentiment) lib/sentiment.ex:6: Sentiment.run/1
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
(elixir) lib/code.ex:168: Code.eval_string/3
据我所知,我并没有向函数传递空字符串。我一直在使用一个包含以下内容的测试文件:
This is a test. This sentence is sad. This sentence is happy. The end.
这是我的代码:
defmodule Sentiment do
def run(file) do
file
|> fileread
|> analyze
|>IO.inspect
end
def fileread(file) do
file
|> File.stream!
|> Stream.map(&String.trim_trailing(&1))
|> Enum.map(&String.replace(&1, ~r/[-@#$%^&*()=_+|;':",<>']/, ""))
|> Stream.map(&String.split(&1,~r/[\p{P}\p{S}]+/, trim: true))
|> Enum.to_list
|> List.flatten
|> IO.inspect
end
def analyze(list) do
list
|> Enum.map(&Sentient.analyze(&1))
|> IO.inspect
end
end
所以,我真的不知道为什么会出现这个错误。有人有什么建议吗?这是有意识的
中的一个错误:
$ mix run -e 'Sentient.analyze("This is a test")'
** (Enum.EmptyError) empty error
(elixir) lib/enum.ex:1722: Enum.reduce/2
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
(elixir) lib/code.ex:170: Code.eval_string/3
(elixir) lib/enum.ex:645: Enum."-each/2-lists^foreach/1-0-"/2
(elixir) lib/enum.ex:645: Enum.each/2
(mix) lib/mix/tasks/run.ex:78: Mix.Tasks.Run.run/1
它看起来像是作者在Git回购中发布的,但从未在hex.pm上发布过。对于当前git版本,上述语句不会引发任何错误
错误在于,旧版本正在使用空列表调用Enum.reduce/2
,如果列表为空,则记录该列表以引发该错误。他们将其更改为Enum.reduce/3
,在前面链接的提交中使用默认的累加器值,该值可以很好地处理空列表。根据堆栈跟踪判断,Enum.EmptyError
似乎是由Enum.map/2
而不是由sencent.analyze(&1)
引发的。您是否100%肯定analyze/1
中的list
是您在问题中显示的数组列表?我假设是这样,因为我只是调用run函数,它只是将文件导入fileread/1函数,然后将结果导入analyze/1。您使用的是哪个版本的Elixir?(我正在努力理解stacktrace。)我正在运行1.3.4,谢谢!你能在iex-S mix
中手动调用这四个句子中的每一个吗?有没有错误?谢谢,这太棒了!
$ mix run -e 'Sentient.analyze("This is a test")'
** (Enum.EmptyError) empty error
(elixir) lib/enum.ex:1722: Enum.reduce/2
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
(elixir) lib/code.ex:170: Code.eval_string/3
(elixir) lib/enum.ex:645: Enum."-each/2-lists^foreach/1-0-"/2
(elixir) lib/enum.ex:645: Enum.each/2
(mix) lib/mix/tasks/run.ex:78: Mix.Tasks.Run.run/1