mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
More classifier docs
This commit is contained in:
@@ -3,16 +3,24 @@ require 'linguist/tokenizer'
|
|||||||
module Linguist
|
module Linguist
|
||||||
# Language bayesian classifier.
|
# Language bayesian classifier.
|
||||||
class Classifier
|
class Classifier
|
||||||
|
# Internal: Path to persisted classifier db.
|
||||||
PATH = File.expand_path('../classifier.yml', __FILE__)
|
PATH = File.expand_path('../classifier.yml', __FILE__)
|
||||||
|
|
||||||
|
# Public: Check if persisted db exists on disk.
|
||||||
|
#
|
||||||
|
# Returns Boolean.
|
||||||
def self.exist?
|
def self.exist?
|
||||||
File.exist?(PATH)
|
File.exist?(PATH)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Public: Get persisted Classifier instance.
|
||||||
|
#
|
||||||
|
# Returns Classifier.
|
||||||
def self.instance
|
def self.instance
|
||||||
@instance ||= YAML.load_file(PATH)
|
@instance ||= YAML.load_file(PATH)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Public: Initialize a Classifier.
|
||||||
def initialize
|
def initialize
|
||||||
@tokens_total = 0
|
@tokens_total = 0
|
||||||
@languages_total = 0
|
@languages_total = 0
|
||||||
@@ -21,6 +29,16 @@ module Linguist
|
|||||||
@languages = Hash.new(0)
|
@languages = Hash.new(0)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Public: Train classifier that data is a certain language.
|
||||||
|
#
|
||||||
|
# language - Language of data
|
||||||
|
# data - String contents of file
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# train(Language['Ruby'], "def hello; end")
|
||||||
|
#
|
||||||
|
# Returns nothing.
|
||||||
def train(language, data)
|
def train(language, data)
|
||||||
language = language.name
|
language = language.name
|
||||||
tokens = Tokenizer.new(data).tokens
|
tokens = Tokenizer.new(data).tokens
|
||||||
@@ -32,8 +50,13 @@ module Linguist
|
|||||||
end
|
end
|
||||||
@languages[language] += 1
|
@languages[language] += 1
|
||||||
@languages_total += 1
|
@languages_total += 1
|
||||||
|
|
||||||
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Public: Prune infrequent tokens.
|
||||||
|
#
|
||||||
|
# Returns receiver Classifier instance.
|
||||||
def gc
|
def gc
|
||||||
@tokens.each do |language, tokens|
|
@tokens.each do |language, tokens|
|
||||||
if @language_tokens[language] > 20
|
if @language_tokens[language] > 20
|
||||||
@@ -49,6 +72,17 @@ module Linguist
|
|||||||
self
|
self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Public: Guess language of data.
|
||||||
|
#
|
||||||
|
# data - String data to analyze.
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# classify("def hello; end")
|
||||||
|
# # => [ [Language['Ruby'], 0.90], [Language['Python'], 0.2], ... ]
|
||||||
|
#
|
||||||
|
# Returns sorted Array of result pairs. Each pair contains the
|
||||||
|
# Language and a Float score.
|
||||||
def classify(data)
|
def classify(data)
|
||||||
tokens = Tokenizer.new(data).tokens
|
tokens = Tokenizer.new(data).tokens
|
||||||
|
|
||||||
@@ -60,12 +94,24 @@ module Linguist
|
|||||||
scores.sort { |a, b| b[1] <=> a[1] }.map { |score| [Language[score[0]], score[1]] }
|
scores.sort { |a, b| b[1] <=> a[1] }.map { |score| [Language[score[0]], score[1]] }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Probably of set of tokens in a language occuring - P(D | C)
|
||||||
|
#
|
||||||
|
# tokens - Array of String tokens.
|
||||||
|
# language - Language to check.
|
||||||
|
#
|
||||||
|
# Returns Float between 0.0 and 1.0.
|
||||||
def tokens_probability(tokens, language)
|
def tokens_probability(tokens, language)
|
||||||
tokens.inject(1.0) do |sum, token|
|
tokens.inject(1.0) do |sum, token|
|
||||||
sum *= token_probability(token, language)
|
sum *= token_probability(token, language)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Probably of token in language occuring - P(F | C)
|
||||||
|
#
|
||||||
|
# token - String token.
|
||||||
|
# language - Language to check.
|
||||||
|
#
|
||||||
|
# Returns Float between 0.0 and 1.0.
|
||||||
def token_probability(token, language)
|
def token_probability(token, language)
|
||||||
if @tokens[language][token] == 0
|
if @tokens[language][token] == 0
|
||||||
1 / @tokens_total.to_f
|
1 / @tokens_total.to_f
|
||||||
@@ -74,6 +120,11 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Probably of a language occuring - P(C)
|
||||||
|
#
|
||||||
|
# language - Language to check.
|
||||||
|
#
|
||||||
|
# Returns Float between 0.0 and 1.0.
|
||||||
def language_probability(language)
|
def language_probability(language)
|
||||||
@languages[language].to_f / @languages_total.to_f
|
@languages[language].to_f / @languages_total.to_f
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user