zoviet/lexicon

俄语单词和句子的语法和语义转换类

dev-master 2021-01-06 21:16 UTC

This package is auto-updated.

Last update: 2024-09-29 05:49:03 UTC


README

Lexicon/Semantic: 俄语单词和句子的语法和语义转换类

================================

该类使用语法规则而不是词典。例外:将单词从一个词性转换为另一个词性时,使用 Yandex.Speller。该类非常适合处理正式声明、结构化陈述以及没有词典同义词的单词 - 例如,复杂的科学术语。

功能

  1. 在文本中提取词性
  2. 根据两种算法(马丁·波特的算法和词典结尾算法)去除单词的结尾
  3. 将文本转换为单词数组
  4. 从文本中清除无关词性
  5. 在文本中查找对象、主语和宾语
  6. 从单词根生成词形
  7. 将文本中的形容词(作为定义)转换为名词
  8. 将文本中的名词(作为主语)转换为形容词
  9. 将单词从一种词性转换为另一种词性
  10. 向词根添加后缀
  11. 从单词生成可能的词形后缀

安装

composer require zoviet/lexicon

使用

有关更多信息,请参阅 examples.php。

返回的指针类型及其解释

  • 'UNKN' => '未定义',
  • 'PRES' => '介词',
  • 'NUMS' => '数词',
  • 'ADVS' => '副词',
  • 'NOUNS' => '名词',
  • 'VERBS' => '动词',
  • 'PARTS' => '分词',
  • 'ADJS' => '形容词',
  • 'UNIS' => '连词'

此解释可在常量 TYPE 中找到;

静态方法(用于处理单词)

  • test_word($word,FALSE|TRUE) - 确定单词的词性,第二个参数传递是否需要以文本形式解释(默认为 FALSE)。
echo \Lexicon\Semantic::test_word('курица');

//Вернет: NOUNS

echo \Lexicon\Semantic::test_word('курица',TRUE);

//Вернет: Существительное
  • remove_ending($word,$type=FALSE) - 从单词中去除结尾,第二个参数是指示如何解释单词的指针(例如,'PARTS' - 分词。不强制)
echo \Lexicon\Semantic::remove_ending('курица');

//Вернет: куриц

echo \Lexicon\Semantic::remove_ending('курица','ADVS');

//Вернет: курица
  • stem($word) - 根据马丁·波特的算法对单词进行词干提取。
echo \Lexicon\Semantic::stem('гиперборейский');

//Вернет: гиперборейск
  • transform($word,$type,FALSE) - 将单词转换为另一种类型(从名词到形容词,反之亦然),第二个参数指示要转换的类型,第三个参数指示是否需要返回最可信的选项数组(默认为 FALSE)。
echo \Lexicon\Semantic::transform('ботаник','ADJS');

//Вернет: ботанический

echo \Lexicon\Semantic::transform('некоторый','ADJS');

//Вернет FALSE, т.к. некоторый - не существительное

echo \Lexicon\Semantic::transform('аалдрораловавыаффвыпрафп','ADJS');

//Вернет NULL, т.к. преобразование не получилось
  • remove_suffix($word,$type) - 递归地去除单词的词形后缀,类型 type 指定要去除的后缀类型(例如,'VERBS' - 动词)。它可以接受已经没有结尾的单词。
echo \Lexicon\Semantic::remove_suffix('патологоанатомический','ADJS');

//Вернет: патологоанат
  • add_suffix($stem,$type,FALSE) - 向词根添加词形后缀,类型 type 指定要添加的后缀类型,第二个参数指定是否返回最可信的选项数组(默认为 FALSE)。使用 Speller。
echo \Lexicon\Semantic::add_suffix('ботан','ADJS');

//Вернет: ботанический

\Lexicon\Semantic::add_suffix('лис','ADJS');

//Вернет: ["лисянский"]=>
  int(5)
  ["лысенький"]=>
  int(3) 
  ["лисицкий"]=>
  int(3)
  ["лысоватый"]=>
  int(3) 
  ["лисовский"]=>
  int(2)
  ["листоватый"]=>
  int(2)
  ["лесистый"]=>
  int(2) 
  ["лосский"]=>
  int(2)
  • forms ($stem,$type) - 根据类型 type 从词根生成所有“脏”词形。
var_dump (\Lexicon\Semantic::forms('лис','ADJS'));

//Вернет: array(94) {[0]=>
  string(26) "лисоватенький"
  [1]=>
  string(26) "лисоватенькый"
  [2]=>
  string(26) "лисеватенький"
  [3]=>
  string(26) "лисеватенькый"
  [4]=>
  string(22) "лисехонький"
  [5]=>
  string(22) "лисехонькый"
  [6]=>
  string(22) "лисохонький"
  [7]=>
  string(22) "лисохонькый"
  [8]=>
  string(22) "лисешенький"
  [9]=>
  string(22) "лисешенькый"
  [10]=>
  string(22) "лисошенький"
  
  и т д

文本处理方法:短语、陈述、命题

初始化

$semantic = new \Lexicon\Semantic();

//или инициализация с передачей текста:

$semantic = new \Lexicon\Semantic('Программное обеспечение P позволяет рационально организовать распорядок дня и освободить до 70% времени.');

跨属性

  • string - 包含原始短语及其所有基本转换(如果有的话)

  • words - 按顺序出现单词的数组。它由方法 words 或在调用任何处理方法时自动创建

  • result - 以词性数组的形式存储文本的语法分析结果

如果未指定方法,则其结果是改变类的跨属性。

基本文本处理方法

如果没有指定传递的属性,则意味着它们不存在。

  • text(字符串) - 将文本传递给处理
  • remove_braces() - 从文本中删除括号及其内容
  • words(array=NULL) - 将字符串转换为不包含属性的单词数组,或者将属性设置为传递的数组单词类
  • remove_pres() - 从数组中删除介词
  • remove_unis() - 删除连词
  • remove_nums() - 删除数词
  • remove_all() - 应用上述所有删除操作
  • remover($array) - 从以数组形式传递的数组中删除单词和符号
$string = 'Программное обеспечение (P) позволяет чуть более рационально организовать распорядок дня и освободить до 70% времени.';

$semantic->text($string)->remove_braces()->words()->remove_all()->remover(array('%','.'));

var_dump($semantic->words);

//Вернет

array(9) {
  [0]=>
  string(22) "Программное"
  [1]=>
  string(22) "обеспечение"
  [2]=>
  string(18) "позволяет"
  [3]=>
  string(22) "рационально"
  [4]=>
  string(24) "организовать"
  [5]=>
  string(20) "распорядок"
  [6]=>
  string(6) "дня"
  [7]=>
  string(20) "освободить"
  [8]=>
  string(14) "времени"
}

词性分析

设置类属性的方法。

  • explore()
$string = 'Программное обеспечение (P) позволяет чуть более рационально организовать распорядок дня и освободить до 70% времени.';

$semantic->text($string)->remove_braces()->words()->remove_all()->explore();

//или если предварительный разбор не нужен, а текст передан через конструктор

$semantic->explore();

var_dump($semantic->result);

//Вернет

 ["ADJS"]=>
  array(2) {
    [0]=>
    string(22) "Программное"
    [1]=>
    string(22) "обеспечение"
  }
  ["VERBS"]=>
  array(3) {
    [0]=>
    string(18) "позволяет"
    [1]=>
    string(24) "организовать"
    [2]=>
    string(20) "освободить"
  }
  ["ADVS"]=>
  array(1) {
    [0]=>
    string(22) "рационально"
  }
  ["NOUNS"]=>
  array(3) {
    [0]=>
    string(20) "распорядок"
    [1]=>
    string(6) "дня"
    [2]=>
    string(14) "времени"
  }
}

处理词尾和后缀

  • stemming() - 根据词典删除词尾。如果将此方法应用于词性分析,则词尾将在单词数组(words)中删除,如果之后应用,则将在词性数组(results)中删除。
$string = 'Программное обеспечение (P) позволяет чуть более рационально организовать распорядок дня и освободить до 70% времени.';

$semantic->text($string)->remove_braces()->words()->remove_all()->explore()->stemming();

var_dump($semantic->result);

//Вернет:

 ["ADJS"]=>
  array(2) {
    [0]=>
    string(18) "программн"
    [1]=>
    string(18) "обеспечен"
  }
  ["VERBS"]=>
  array(3) {
    [0]=>
    string(14) "позволя"
    [1]=>
    string(20) "организова"
    [2]=>
    string(14) "освобод"
  }
  ["ADVS"]=>
  array(1) {
    [0]=>
    string(14) "рациона"
  }
  ["NOUNS"]=>
  array(3) {
    [0]=>
    string(16) "распоряд"
    [1]=>
    string(4) "дн"
    [2]=>
    string(12) "времен"
  }
}


$semantic->text($string)->stemming();

var_dump($semantic->words);

//Вернет:

 [0]=>
  string(18) "программн"
  [1]=>
  string(18) "обеспечен"
  [2]=>
  string(14) "позволя"
  [3]=>
  string(14) "рациона"
  [4]=>
  string(20) "организова"
  [5]=>
  string(16) "распоряд"
  [6]=>
  string(4) "дн"
  [7]=>
  string(14) "освобод"
  [8]=>
  string(12) "времен"
}

提取主语、谓语和宾语

概率方法,提取不保证。可以与单词数组或词干数组一起工作。

  • subject() - 提取主语 - 最“重要”的名词。如果找到则返回名词,否则返回NULL。
  • defenition() - 对于形容词也是同样的。
  • predict() - 对于谓语也是同样的。
$string = 'Программное обеспечение (P) позволяет чуть более рационально организовать распорядок дня и освободить до 70% времени.';

echo 'Предикт:'. $semantic->text($string)->predict();
echo ' | Субъект:'. $semantic->subject();
echo ' | Отношение:'. $semantic->definition();

//Вернет:

Предикт:позволяет | Субъект:распорядок | Отношение:Программное

行中词性的转换

  • to_noun(FALSE) - 将重要的形容词(自己找到)转换为名词。在无属性启动时返回一个值(最可能的),在TRUE时返回一个数组(字典)中的单词。用于Speller;
  • to_adj(false) - 与之相同,但方向相反
$string = 'Программное обеспечение (P) позволяет чуть более рационально организовать распорядок дня и освободить до 70% времени.';

echo 'Новый субъект:'. $semantic->text($string)->to_noun();
echo ' | Новое отношение:'. $semantic->to_adj();

//Вернет:

Новый субъект:программа | Новое отношение:распорядительный
  • analise($deep) - 深度转换到指定的嵌套深度。假设处理的是复杂的句子。深度 - 考虑分析的实体(形容词和名词)的数量。返回一个关联数组,包含展开级别和相应的主体。
$string = 'Программное обеспечение (P) позволяет чуть более рационально организовать распорядок дня и освободить до 70% времени.';

var_dump ($semantic->text($string)->analise(2));

//Вернет:

array(2) {
  ["level"]=>
  array(3) {
    [0]=>
    string(32) "распорядительный"
    [1]=>
    string(10) "новый"
    [2]=>
    string(18) "временный"
  }
  ["subject"]=>
  array(2) {
    [0]=>
    string(16) "программа"
    [1]=>
    string(20) "беспечность"
  }
}

处理此类数组:将展开级别关联到主体。例如,在上面的例子中,数组可以读作“命令程序 - 新的临时无耐性”。在拼写检查器处理后:“命令性程序 - 新的临时无耐性”。