Skip to content

Commit d9077c7

Browse files
committed
Adding snowball stemmer
1 parent 0e68a5b commit d9077c7

File tree

3 files changed

+70
-1
lines changed

3 files changed

+70
-1
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
"php": ">=5.5",
2828
"yooper/stop-words": "^1.0",
2929
"symfony/console": ">=2.7",
30-
"camspiers/porter-stemmer": "1.0.*"
30+
"camspiers/porter-stemmer": "1.0.*",
31+
"wamania/php-stemmer": "1.2"
3132
},
3233
"require-dev": {
3334
"phpunit/phpunit": "5.*",

src/Stemmers/SnowballStemmer.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace TextAnalysis\Stemmers;
4+
5+
use TextAnalysis\Interfaces\IStemmer;
6+
7+
/**
8+
* A wrapper around PHP native snowball implementation
9+
* @author yooper
10+
*/
11+
class SnowballStemmer implements IStemmer
12+
{
13+
const BASE_NAMESPACE = '\\Wamania\\Snowball\\';
14+
15+
/**
16+
*
17+
* @var \Wamania\Snowball\Stem
18+
*/
19+
protected $stemmer;
20+
21+
public function __construct($stemmerType = 'English')
22+
{
23+
$className = self::BASE_NAMESPACE.$stemmerType;
24+
if(!class_exists($className)) {
25+
throw new \RuntimeException("Class {$stemmerType} does not exist");
26+
}
27+
$this->stemmer = new $className();
28+
}
29+
30+
public function stem($token)
31+
{
32+
return $this->stemmer->stem($token);
33+
}
34+
35+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Tests\TextAnalysis\Stemmers;
4+
5+
use TextAnalysis\Stemmers\SnowballStemmer;
6+
7+
/**
8+
*
9+
* @author yooper
10+
*/
11+
class SnowballStemmerTest extends \PHPUnit_Framework_TestCase
12+
{
13+
public function testDefaultEnglish()
14+
{
15+
$stemmer = new SnowballStemmer('English');
16+
$this->assertEquals("judg", $stemmer->stem("judges"));
17+
$this->assertEquals('ski', $stemmer->stem('skis'));
18+
$this->assertEquals('univers', $stemmer->stem('universities'));
19+
$this->assertEquals('news', $stemmer->stem('news'));
20+
}
21+
22+
public function testSwedish()
23+
{
24+
$stemmer = new SnowballStemmer('Swedish');
25+
$this->assertEquals("affärschef", $stemmer->stem("affärscheferna"));
26+
}
27+
28+
public function testException()
29+
{
30+
$this->setExpectedException('Exception');
31+
$stemmer = new SnowballStemmer('Wookie');
32+
}
33+
}

0 commit comments

Comments
 (0)