gplx/mediawiki/extensions/SemanticMediaWiki/Tesa/src/SanitizerFactory.php

254 lines
5.4 KiB
PHP

<?php
namespace Onoi\Tesa;
use Onoi\Tesa\LanguageDetector\NullLanguageDetector;
use Onoi\Tesa\LanguageDetector\TextCatLanguageDetector;
use Onoi\Tesa\StopwordAnalyzer\ArrayStopwordAnalyzer;
use Onoi\Tesa\StopwordAnalyzer\CdbStopwordAnalyzer;
use Onoi\Tesa\StopwordAnalyzer\NullStopwordAnalyzer;
use Onoi\Tesa\StopwordAnalyzer\StopwordAnalyzer;
use Onoi\Tesa\Synonymizer\NullSynonymizer;
use Onoi\Tesa\Synonymizer\Synonymizer;
use Onoi\Tesa\Tokenizer\CJKSimpleCharacterRegExTokenizer;
use Onoi\Tesa\Tokenizer\GenericRegExTokenizer;
use Onoi\Tesa\Tokenizer\IcuWordBoundaryTokenizer;
use Onoi\Tesa\Tokenizer\JaCompoundGroupTokenizer;
use Onoi\Tesa\Tokenizer\JaTinySegmenterTokenizer;
use Onoi\Tesa\Tokenizer\NGramTokenizer;
use Onoi\Tesa\Tokenizer\PunctuationRegExTokenizer;
use Onoi\Tesa\Tokenizer\Tokenizer;
/**
* @license GPL-2.0-or-later
* @since 0.1
*
* @author mwjames
*/
class SanitizerFactory {
/**
* @since 0.1
*
* @return Sanitizer
*/
public function newSanitizer( $text = '' ) {
return new Sanitizer( $text );
}
/* StopwordAnalyzer */
/**
* @since 0.1
*
* @param string|null $languageCode
*
* @return StopwordAnalyzer
*/
public function newStopwordAnalyzerByLanguage( $languageCode = null ) {
if ( $languageCode === null ) {
return $this->newNullStopwordAnalyzer();
}
$cdbStopwordAnalyzer = $this->newCdbStopwordAnalyzer(
$languageCode
);
return $cdbStopwordAnalyzer->isAvailable() ? $cdbStopwordAnalyzer : $this->newNullStopwordAnalyzer();
}
/**
* @since 0.1
*
* @return StopwordAnalyzer
*/
public function newCdbStopwordAnalyzer( $languageCode = null ) {
return new CdbStopwordAnalyzer( CdbStopwordAnalyzer::getTargetByLanguage( $languageCode ) );
}
/**
* @since 0.1
*
* @param array $stopwords
*
* @return StopwordAnalyzer
*/
public function newArrayStopwordAnalyzer( array $stopwords = [] ) {
return new ArrayStopwordAnalyzer( $stopwords );
}
/**
* @since 0.1
*
* @return StopwordAnalyzer
*/
public function newNullStopwordAnalyzer() {
return new NullStopwordAnalyzer();
}
/**
* @since 0.1
*
* @param string|null $languageCode
*
* @return Synonymizer
*/
public function newSynonymizerByLanguage( $languageCode = null ) {
if ( $languageCode === null ) {
return $this->newNullSynonymizer();
}
return $this->newNullSynonymizer();
}
/* Synonymizer */
/**
* @since 0.1
*
* @return Synonymizer
*/
public function newNullSynonymizer() {
return new NullSynonymizer();
}
/* LanguageDetector */
/**
* @since 0.1
*
* @return NullLanguageDetector
*/
public function newNullLanguageDetector() {
return new NullLanguageDetector();
}
/**
* @since 0.1
*
* @return TextCatLanguageDetector
*/
public function newTextCatLanguageDetector() {
return new TextCatLanguageDetector();
}
/* Tokenizer */
/**
* @since 0.1
*
* @param string $text
* @param string|null $languageCode
*
* @return Tokenizer
*/
public function newPreferredTokenizerByLanguage( $text, $languageCode = null ) {
$tokenizer = $this->newIcuWordBoundaryTokenizer();
if ( !$tokenizer->isAvailable() && CharacterExaminer::contains( CharacterExaminer::CJK_UNIFIED, $text ) ) {
return $this->newCJKMatchableTokenizer( $text );
} elseif ( !$tokenizer->isAvailable() ) {
return $this->newGenericRegExTokenizer( $tokenizer );
}
$tokenizer->setLocale( $languageCode );
$tokenizer->setWordTokenizerAttribute(
!CharacterExaminer::contains( CharacterExaminer::CJK_UNIFIED, $text )
);
return $this->newGenericRegExTokenizer( $tokenizer );
}
/**
* @since 0.1
*
* @param string $text
*
* @return Tokenizer
*/
public function newCJKMatchableTokenizer( $text ) {
$tokenizer = null;
if ( CharacterExaminer::contains( CharacterExaminer::HIRAGANA_KATAKANA, $text ) ) {
$tokenizer = $this->newJaTinySegmenterTokenizer();
} else {
$tokenizer = $this->newNGramTokenizer( $tokenizer );
}
$tokenizer = $this->newCJKSimpleCharacterRegExTokenizer( $tokenizer );
return $this->newGenericRegExTokenizer( $tokenizer );
}
/**
* @since 0.1
*
* @param Tokenizer|null $tokenizer
*
* @return Tokenizer
*/
public function newIcuWordBoundaryTokenizer( ?Tokenizer $tokenizer = null ) {
return new IcuWordBoundaryTokenizer( $tokenizer );
}
/**
* @since 0.1
*
* @param Tokenizer|null $tokenizer
*
* @return Tokenizer
*/
public function newGenericRegExTokenizer( ?Tokenizer $tokenizer = null ) {
return new GenericRegExTokenizer( $tokenizer );
}
/**
* @since 0.1
*
* @param Tokenizer|null $tokenizer
*
* @return Tokenizer
*/
public function newPunctuationRegExTokenizer( ?Tokenizer $tokenizer = null ) {
return new PunctuationRegExTokenizer( $tokenizer );
}
/**
* @since 0.1
*
* @return Tokenizer
*/
public function newJaCompoundGroupTokenizer( ?Tokenizer $tokinizer = null ) {
return new JaCompoundGroupTokenizer( $tokinizer );
}
/**
* @since 0.1
*
* @return Tokenizer
*/
public function newJaTinySegmenterTokenizer( ?Tokenizer $tokinizer = null ) {
return new JaTinySegmenterTokenizer( $tokinizer );
}
/**
* @since 0.1
*
* @return Tokenizer
*/
public function newCJKSimpleCharacterRegExTokenizer( ?Tokenizer $tokinizer = null ) {
return new CJKSimpleCharacterRegExTokenizer( $tokinizer );
}
/**
* @since 0.1
*
* @return Tokenizer
*/
public function newNGramTokenizer( ?Tokenizer $tokinizer = null, $ngram = 2 ) {
return new NGramTokenizer( $tokinizer, $ngram );
}
}