The Textgain Elixir package provides a simple interface into the Textgain web service for natural language processing (NLP) and text analytics. The analytics services currently available are:
- Age
- Concepts
- Education
- Gender
- Genre
- Language
- Part-of-speech tags
- Personality
- Sentiment
If available in Hex, the package can be installed as:
- Add
textgain
to your list of dependencies inmix.exs
:
def deps do
[{:textgain, "~> 0.1.0"}]
end
- Ensure
textgain
is started before your application:
def application do
[applications: [:textgain]]
end
- Configure your API key, if you have one, in config.exs:
config :textgain,
key: "***"
Note: Without an API key you are restricted to 100 API calls in a 24 hour period, and some API calls might be refused. That being said, some of your tests will fail if you are not using a legit API key.
The package's main API module is Textgain
which leverages the service
macro defined in Textgain.Service
to instantiate endpoints for each Textgain service. All returned data is decoded into service-specific structs to facilitate leveraging Elixir's pattern matching to process responses.
Additionally, the Textgain.Service
module exposes a public function raw_query
which can be used to execute custom queries against the service if necessary.
To use the module, simply call the service by function name in the Textgain
module, with the text to be analyzed as the first argument followed by a keyword list of optional parameters, per the API services documentation. Valid return values are also documented on the API services page.
iex(1)> Textgain.age("The quick brown fox jumps over the lazy dog.", lang: "en")
{:ok, %Textgain.Age{age: "25+", confidence: 0.75}}
iex(2)> Textgain.concepts("The quick brown fox jumps over the lazy dog.", lang: "en")
{:ok, %Textgain.Concepts{concepts: ["jump", "fox", "dog"]}}
iex(3)> Textgain.education("The quick brown fox jumps over the lazy dog.", lang: "en")
{:ok, %Textgain.Education{confidence: 0.8, education: "-"}}
iex(4)> Textgain.gender("The quick brown fox jumps over the lazy dog.", lang: "en")
{:ok, %Textgain.Gender{confidence: 0.75, gender: "m"}}
iex(5)> Textgain.genre("The quick brown fox jumps over the lazy dog.", lang: "en")
{:ok, %Textgain.Genre{confidence: 0.95, genre: "review", review: nil}}
iex(6)> Textgain.language("The quick brown fox jumps over the lazy dog.", lang: "en")
{:ok, %Textgain.Language{confidence: 0.95, language: "en"}}
iex(7)> Textgain.personality("The quick brown fox jumps over the lazy dog.", lang: "en")
{:ok, %Textgain.Personality{confidence: 0.6, personality: "E"}}
iex(8)> Textgain.sentiment("The quick brown fox jumps over the lazy dog.", lang: "en")
{:ok, %Textgain.Sentiment{confidence: 0.7, polarity: 0.0}}
iex(9)> Textgain.tag("The quick brown fox jumps over the lazy dog.", lang: "en")
{:ok,
%Textgain.Tag{confidence: 0.95,
text: [[[%{"tag" => "DET", "word" => "The"},
%{"tag" => "ADJ", "word" => "quick"}, %{"tag" => "ADJ", "word" => "brown"},
%{"tag" => "NOUN", "word" => "fox"},
%{"tag" => "NOUN", "word" => "jumps"}],
[%{"tag" => "PREP", "word" => "over"}],
[%{"tag" => "DET", "word" => "the"}, %{"tag" => "ADJ", "word" => "lazy"},
%{"tag" => "NOUN", "word" => "dog"}],
[%{"tag" => "PUNC", "word" => "."}]]]}}
The "!" variant for each function also exists, which will return just the service struct or raise an error.