├── .coveralls.yml ├── .editorconfig ├── .gitignore ├── .scrutinizer.yml ├── .styleci.yml ├── .travis.yml ├── AnalyzerText ├── Analyzer │ ├── Analyzer.php │ └── Frequency.php ├── Filter │ ├── Factory.php │ ├── Filter.php │ ├── Informative.php │ └── WordList │ │ ├── Adverb.php │ │ ├── Interjection.php │ │ ├── Particle.php │ │ ├── Preposition.php │ │ ├── Pronoun.php │ │ ├── Union.php │ │ └── WordList.php ├── Text.php └── Text │ └── Word.php ├── LICENSE ├── README.md ├── composer.json ├── example.php ├── example.png ├── phpunit.xml.dist └── tests ├── Analyzer └── FrequencyTest.php ├── Filter └── FactoryTest.php ├── Text └── WordTest.php ├── TextTest.php └── bootstrap.php /.coveralls.yml: -------------------------------------------------------------------------------- 1 | service_name: travis-ci 2 | coverage_clover: build/coverage-clover.xml 3 | json_path: build/coveralls-upload.json 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | ; top-most EditorConfig file 2 | root = true 3 | 4 | ; Unix-style newlines 5 | [*] 6 | end_of_line = LF 7 | 8 | [*.php] 9 | indent_style = space 10 | indent_size = 4 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | /build/ 3 | phpunit.xml 4 | composer.lock 5 | -------------------------------------------------------------------------------- /.scrutinizer.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - php 3 | 4 | tools: 5 | external_code_coverage: true 6 | -------------------------------------------------------------------------------- /.styleci.yml: -------------------------------------------------------------------------------- 1 | preset: symfony 2 | 3 | enabled: 4 | - long_array_syntax 5 | - alpha_ordered_imports 6 | 7 | disabled: 8 | - phpdoc_align 9 | - yoda_style 10 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | sudo: false 4 | 5 | notifications: 6 | email: deploy@peter-gribanov.ru 7 | 8 | branches: 9 | except: 10 | - /^analysis-.*$/ 11 | 12 | matrix: 13 | fast_finish: true 14 | include: 15 | - php: 7.3 16 | - php: 7.2 17 | - php: 7.1 18 | - php: 7.0 19 | - php: 5.6 20 | - php: 5.5 21 | dist: trusty 22 | - php: 5.4 23 | dist: trusty 24 | - php: 5.3 25 | dist: precise 26 | 27 | before_install: 28 | - if [ -n "$GH_TOKEN" ]; then composer config github-oauth.github.com ${GH_TOKEN}; fi; 29 | 30 | before_script: 31 | - composer install --prefer-dist --no-interaction --no-scripts --no-progress 32 | 33 | script: 34 | - vendor/bin/phpunit --coverage-clover build/coverage-clover.xml 35 | 36 | after_script: 37 | - vendor/bin/ocular code-coverage:upload --format=php-clover build/coverage-clover.xml 38 | - vendor/bin/coveralls -v -c .coveralls.yml 39 | -------------------------------------------------------------------------------- /AnalyzerText/Analyzer/Analyzer.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Analyzer; 9 | 10 | use AnalyzerText\Filter\Factory; 11 | use AnalyzerText\Text; 12 | 13 | /** 14 | * Базовый класс для анализаторов текста. 15 | * 16 | * @author Peter Gribanov 17 | */ 18 | abstract class Analyzer 19 | { 20 | /** 21 | * @var Text 22 | */ 23 | protected $text; 24 | 25 | /** 26 | * Устанавливает аналезируемый текст 27 | * 28 | * @param Text $text 29 | * 30 | * @return Analyzer 31 | */ 32 | public function setText(Text $text) 33 | { 34 | $this->clear(); 35 | $this->text = $text; 36 | 37 | return $this; 38 | } 39 | 40 | /** 41 | * Возвращает список слов. 42 | * 43 | * @return Text 44 | */ 45 | public function getText() 46 | { 47 | return $this->text; 48 | } 49 | 50 | /** 51 | * Очищает анализатор 52 | * 53 | * @return Analyzer 54 | */ 55 | public function clear() 56 | { 57 | $this->text = null; 58 | 59 | return $this; 60 | } 61 | 62 | /** 63 | * Возвращает фабрику фильтров для применения их. 64 | * 65 | * @return Factory 66 | */ 67 | public function applyFilters() 68 | { 69 | return new Factory($this); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /AnalyzerText/Analyzer/Frequency.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Analyzer; 9 | 10 | /** 11 | * Анализатор частоты появления строк в тексте. 12 | * 13 | * @author Peter Gribanov 14 | */ 15 | class Frequency extends Analyzer 16 | { 17 | /** 18 | * Список слов с частотой их появления. 19 | * 20 | * @var array 21 | */ 22 | protected $frequencies = array(); 23 | 24 | /** 25 | * Список слов с частотой их появления в процентах. 26 | * 27 | * @var array 28 | */ 29 | protected $percent = array(); 30 | 31 | /** 32 | * Очищает анализатор 33 | * 34 | * @return Frequency 35 | */ 36 | public function clear() 37 | { 38 | $this->frequencies = array(); 39 | $this->percent = array(); 40 | parent::clear(); 41 | 42 | return $this; 43 | } 44 | 45 | /** 46 | * Определяет частоту появления слов. 47 | * 48 | * @return array 49 | */ 50 | public function getFrequency() 51 | { 52 | if (empty($this->frequencies) && $this->getText()->count()) { 53 | foreach ($this->getText() as $word) { 54 | if (!isset($this->frequencies[$word->getPlain()])) { 55 | $this->frequencies[$word->getPlain()] = 0; 56 | } 57 | ++$this->frequencies[$word->getPlain()]; 58 | } 59 | arsort($this->frequencies); 60 | } 61 | 62 | return $this->frequencies; 63 | } 64 | 65 | /** 66 | * Получение проуентное отнашение частоты слов из списка частот слов. 67 | * 68 | * @return array 69 | */ 70 | public function getPercent() 71 | { 72 | if (empty($this->percent) && ($frequencies = $this->getFrequency())) { 73 | $ratio = max($frequencies) / 100; 74 | foreach ($frequencies as $word => $frequency) { 75 | $this->percent[$word] = $frequency / $ratio; 76 | } 77 | } 78 | 79 | return $this->percent; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /AnalyzerText/Filter/Factory.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Filter; 9 | 10 | use AnalyzerText\Analyzer\Analyzer; 11 | use AnalyzerText\Filter\WordList\Adverb; 12 | use AnalyzerText\Filter\WordList\Preposition; 13 | use AnalyzerText\Filter\WordList\Pronoun; 14 | use AnalyzerText\Filter\WordList\Union; 15 | 16 | /** 17 | * Фабрика фильтров. 18 | * 19 | * @author Peter Gribanov 20 | */ 21 | class Factory 22 | { 23 | /** 24 | * @var Analyzer 25 | */ 26 | private $analyzer; 27 | 28 | /** 29 | * @param Analyzer $analyzer 30 | */ 31 | public function __construct(Analyzer $analyzer) 32 | { 33 | $this->analyzer = $analyzer; 34 | } 35 | 36 | /** 37 | * Применяет фильтр Informative. 38 | * 39 | * @return Factory 40 | */ 41 | public function Informative() 42 | { 43 | return $this->apply(new Informative($this->analyzer->getText())); 44 | } 45 | 46 | /** 47 | * Применяет фильтр Preposition. 48 | * 49 | * @return Factory 50 | */ 51 | public function Preposition() 52 | { 53 | return $this->apply(new Preposition($this->analyzer->getText())); 54 | } 55 | 56 | /** 57 | * Применяет фильтр Pronoun. 58 | * 59 | * @return Factory 60 | */ 61 | public function Pronoun() 62 | { 63 | return $this->apply(new Pronoun($this->analyzer->getText())); 64 | } 65 | 66 | /** 67 | * Применяет фильтр Union. 68 | * 69 | * @return Factory 70 | */ 71 | public function Union() 72 | { 73 | return $this->apply(new Union($this->analyzer->getText())); 74 | } 75 | 76 | /** 77 | * Применяет фильтр Adverb. 78 | * 79 | * @return Factory 80 | */ 81 | public function Adverb() 82 | { 83 | return $this->apply(new Adverb($this->analyzer->getText())); 84 | } 85 | 86 | /** 87 | * Применяет фильтр 88 | * 89 | * @param Filter $filter 90 | * 91 | * @return Factory 92 | */ 93 | private function apply(Filter $filter) 94 | { 95 | if ($filter->getText()->count()) { 96 | $words = array(); 97 | foreach ($filter as $word) { 98 | $words[] = $word->getWord(); 99 | } 100 | $text_class = get_class($filter->getText()); 101 | $this->analyzer->setText(new $text_class(implode(' ', $words))); 102 | } 103 | 104 | return $this; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /AnalyzerText/Filter/Filter.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Filter; 9 | 10 | use AnalyzerText\Text; 11 | use AnalyzerText\Text\Word; 12 | 13 | /** 14 | * Фильтр итератор 15 | * 16 | * @author Peter Gribanov 17 | */ 18 | abstract class Filter extends \FilterIterator 19 | { 20 | /** 21 | * @param Text $text 22 | */ 23 | public function __construct(Text $text) 24 | { 25 | parent::__construct($text); 26 | } 27 | 28 | /** 29 | * Возвращает текущее слово. 30 | * 31 | * @return Word 32 | */ 33 | public function current() 34 | { 35 | return $this->getInnerIterator()->current(); 36 | } 37 | 38 | /** 39 | * Возвращает текст 40 | * 41 | * @return Text 42 | */ 43 | public function getText() 44 | { 45 | return $this->getInnerIterator(); 46 | } 47 | 48 | /** 49 | * Возвращает текст 50 | * 51 | * @return Text 52 | */ 53 | public function getInnerIterator() 54 | { 55 | return parent::getInnerIterator(); 56 | } 57 | 58 | /** 59 | * Заменяет слово в тексте. 60 | * 61 | * @param Word $word Слово 62 | */ 63 | protected function replace(Word $word) 64 | { 65 | $this->getInnerIterator()->replace($word); 66 | } 67 | 68 | /** 69 | * Возвращает предыдущее слово. 70 | * 71 | * @param int $shift Смещение 72 | * 73 | * @return Word|null 74 | */ 75 | protected function getPreviousWord($shift = 1) 76 | { 77 | return $this->getText()->offsetGet($this->getText()->key() + $shift * -1); 78 | } 79 | 80 | /** 81 | * Возвращает следующее слово. 82 | * 83 | * @param int $shift Смещение 84 | * 85 | * @return Word|null 86 | */ 87 | protected function getNextWord($shift = 1) 88 | { 89 | return $this->getText()->offsetGet($this->getText()->key() + $shift); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /AnalyzerText/Filter/Informative.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Filter; 9 | 10 | use AnalyzerText\Filter\WordList\Adverb; 11 | use AnalyzerText\Filter\WordList\Interjection; 12 | use AnalyzerText\Filter\WordList\Particle; 13 | use AnalyzerText\Filter\WordList\Preposition; 14 | use AnalyzerText\Filter\WordList\Pronoun; 15 | use AnalyzerText\Filter\WordList\Union; 16 | use AnalyzerText\Filter\WordList\WordList; 17 | use AnalyzerText\Text; 18 | 19 | /** 20 | * Оставляет только информационные слова. 21 | * 22 | * Сушествительные, глаголы, прилагательные, имена, фамилии 23 | * 24 | * @author Peter Gribanov 25 | */ 26 | class Informative extends Filter 27 | { 28 | /** 29 | * Список фильтров. 30 | * 31 | * @var WordList[] 32 | */ 33 | private $filters = array(); 34 | 35 | /** 36 | * @param Text $iterator Текст 37 | */ 38 | public function __construct(Text $iterator) 39 | { 40 | parent::__construct($iterator); 41 | $this->filters = array( 42 | new Interjection($this->getInnerIterator()), 43 | new Particle($this->getInnerIterator()), 44 | new Preposition($this->getInnerIterator()), 45 | new Pronoun($this->getInnerIterator()), 46 | new Union($this->getInnerIterator()), 47 | new Adverb($this->getInnerIterator()), 48 | ); 49 | } 50 | 51 | /** 52 | * @see \FilterIterator::accept() 53 | */ 54 | public function accept() 55 | { 56 | $word = $this->current(); 57 | // сначала ищем последовательности 58 | foreach ($this->filters as $filter) { 59 | if ($filter->isSequence($word)) { 60 | return false; 61 | } 62 | } 63 | // ищем простые и сложные формы 64 | foreach ($this->filters as $filter) { 65 | if ($filter->isSimple($word) || $filter->isComposite($word)) { 66 | return false; 67 | } 68 | } 69 | 70 | return true; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /AnalyzerText/Filter/WordList/Adverb.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Filter\WordList; 9 | 10 | /** 11 | * Оставляет в списке наречия. 12 | * 13 | * @author Peter Gribanov 14 | */ 15 | class Adverb extends WordList 16 | { 17 | /** 18 | * Возвращает список слов. 19 | * 20 | * @return array 21 | */ 22 | public function getWords() 23 | { 24 | return array( 25 | // русские предлоги 26 | 'возле', 27 | 'близко', 28 | 'ближе', 29 | 'вблизи', 30 | 'неподалёку', 31 | 'неподалеку', 32 | 'недалеко', 33 | 'поблизости', 34 | 'невдалеке', 35 | 'рядом', 36 | 'поодаль', 37 | 'далеко', 38 | 'далёко', 39 | 'далече', 40 | 'вдалеке', 41 | 'вдали', 42 | 'вплотную', 43 | 'тесно', 44 | 'в отдалении', 45 | 'бок о бок', 46 | 'непосредственно', 47 | 'напрямую', 48 | 'напрямик', 49 | 'прямо', 50 | 'ровно', 51 | 'гладко', 52 | 'равномерно', 53 | 'размеренно', 54 | 'точно', 55 | 'аккуратно', 56 | 'прилежно', 57 | 'усердно', 58 | 'старательно', 59 | 'тщательно', 60 | 'добросовестно', 61 | 'основательно', 62 | 'скрупулёзно', 63 | 'скрупулезно', 64 | 'дотошно', 65 | 'подробно', 66 | 'детально', 67 | 'досконально', 68 | 'педантично', 69 | 'пунктуально', 70 | 'небрежно', 71 | 'озабоченно', 72 | 'обеспокоенно', 73 | 'встревоженно', 74 | 'пренебрежительно', 75 | 'высокомерно', 76 | 'надменно', 77 | 'заносчиво', 78 | 'свысока', 79 | 'скромно', 80 | 'сдержанно', 81 | 'вызывающе', 82 | 'нагло', 83 | 'грандиозно', 84 | 'роскошно', 85 | 'шикарно', 86 | 'ужасно', 87 | 'отвратительно', 88 | 'прекрасно', 89 | 'превосходно', 90 | 'великолепно', 91 | 'отлично', 92 | 'хорошо', 93 | 'плохо', 94 | 'безобразно', 95 | 'скверно', 96 | 'нехорошо', 97 | 'дурно', 98 | 'неприятно', 99 | 'отталкивающе', 100 | 'приятно', 101 | 'противно', 102 | 'жутко', 103 | 'страшно', 104 | 'пугающе', 105 | 'боязно', 106 | 'боязливо', 107 | 'очень', 108 | 'чересчур', 109 | 'чрезмерно', 110 | 'излишне', 111 | 'слишком', 112 | 'сильно', 113 | 'крепко', 114 | 'прочно', 115 | 'надёжно', 116 | 'надежно', 117 | 'безопасно', 118 | 'солидно', 119 | 'ненадёжно', 120 | 'ненадежно', 121 | 'гарантированно', 122 | 'слабо', 123 | 'несильно', 124 | 'хило', 125 | 'неудачно', 126 | 'мало', 127 | 'дистрофически', 128 | 'немного', 129 | 'чуток', 130 | 'чуть-чуть', 131 | 'едва-едва', 132 | 'еле-еле', 133 | 'еле', 134 | 'насилу', 135 | 'с трудом', 136 | 'едва', 137 | 'чуть', 138 | 'чуточку', 139 | 'немножко', 140 | 'немножечко', 141 | 'слегка', 142 | 'маленько', 143 | 'значительно', 144 | 'важно', 145 | 'напыщенно', 146 | 'спесиво', 147 | 'горделиво', 148 | 'гордо', 149 | 'униженно', 150 | 'смиренно', 151 | 'покорно', 152 | 'послушно', 153 | 'непокорно', 154 | 'безропотно', 155 | 'весомо', 156 | 'намного', 157 | 'существенно', 158 | 'заметно', 159 | 'значимо', 160 | 'немаловажно', 161 | 'неважно', 162 | 'многократно', 163 | 'маловажно', 164 | 'незначительно', 165 | 'много', 166 | 'немало', 167 | 'гораздо', 168 | 'недостаточно', 169 | 'достаточно', 170 | 'довольно', 171 | 'сравнительно', 172 | 'запросто', 173 | 'по-простому', 174 | 'легко', 175 | 'тяжело', 176 | 'тяжко', 177 | 'трудно', 178 | 'сложно', 179 | 'непросто', 180 | 'просто', 181 | 'несложно', 182 | 'затруднительно', 183 | 'проблематично', 184 | 'нетрудно', 185 | 'трудоёмко', 186 | 'трудоемко', 187 | 'сурово', 188 | 'вовсю', 189 | 'изо всех сил', 190 | 'всеми силами', 191 | 'что есть силы', 192 | 'со всей силы', 193 | 'что было силы', 194 | 'со всей мочи', 195 | 'со всей дури', 196 | 'вполсилы', 197 | 'кое-как', 198 | 'качественно', 199 | 'неаккуратно', 200 | 'неопрятно', 201 | 'неряшливо', 202 | 'чисто', 203 | 'непорочно', 204 | 'возвышенно', 205 | 'целомудренно', 206 | 'безупречно', 207 | 'искусно', 208 | 'ловко', 209 | 'проворно', 210 | 'удобно', 211 | 'комфортно', 212 | 'уютно', 213 | 'покойно', 214 | 'дискомфортно', 215 | 'прилично', 216 | 'некомфортно', 217 | 'не в своей тарелке', 218 | 'неуютно', 219 | 'неудобно', 220 | 'неловко', 221 | 'неуклюже', 222 | 'неповоротливо', 223 | 'неуместно', 224 | 'неприлично', 225 | 'не в себе', 226 | 'как рыба в воде', 227 | 'как сыр в масле', 228 | 'в своей тарелке', 229 | 'в своей стихии', 230 | 'с удобством', 231 | 'ладно', 232 | 'мирно', 233 | 'миролюбиво', 234 | 'агрессивно', 235 | 'враждебно', 236 | 'в ладу', 237 | 'успешно', 238 | 'благополучно', 239 | 'удачно', 240 | 'счастливо', 241 | 'уместно', 242 | 'к месту', 243 | 'кстати', 244 | 'некстати', 245 | 'вовремя', 246 | 'своевременно', 247 | 'невовремя', 248 | 'несвоевременно', 249 | 'невпопад', 250 | 'безуспешно', 251 | 'напрасно', 252 | 'бесплодно', 253 | 'тщетно', 254 | 'безрезультатно', 255 | 'бесполезно', 256 | 'без толку', 257 | 'с пользой', 258 | 'впустую', 259 | 'результатно', 260 | 'понапрасну', 261 | 'попусту', 262 | 'даром', 263 | 'задаром', 264 | 'бесплатно', 265 | 'за деньги', 266 | 'за так', 267 | 'за просто так', 268 | 'задарма', 269 | 'за здорово живёшь', 270 | 'за здорово живешь', 271 | 'за красивые глаза', 272 | 'по заслугам', 273 | 'безвозмездно', 274 | 'за спасибо', 275 | 'вотще', 276 | 'втуне', 277 | 'незря', 278 | 'всуе', 279 | 'по делу', 280 | 'зазря', 281 | 'без необходимости', 282 | 'без надобности', 283 | 'вхолостую', 284 | 'недаром', 285 | 'неслучайно', 286 | 'с умыслом', 287 | 'не зря', 288 | 'обоснованно', 289 | 'небезрезультатно', 290 | 'беспричинно', 291 | 'без причины', 292 | 'немотивированно', 293 | 'неспровоцированно', 294 | 'безосновательно', 295 | 'бесцельно', 296 | 'бессмысленно', 297 | 'осмысленно', 298 | 'результативно', 299 | 'с успехом', 300 | 'худо', 301 | 'дружно', 302 | 'по-товарищески', 303 | 'согласованно', 304 | 'слаженно', 305 | 'вместе', 306 | 'сообща', 307 | 'cовместно', 308 | 'врозь', 309 | 'врознь', 310 | 'поврозь', 311 | 'порознь', 312 | 'совместно', 313 | 'коллективно', 314 | 'единолично', 315 | 'всенародно', 316 | 'вдвоём', 317 | 'вдвоем', 318 | 'в одиночку', 319 | 'на пару', 320 | 'втроём', 321 | 'втроем', 322 | 'хором', 323 | 'разобщённо', 324 | 'разобщенно', 325 | 'всем миром', 326 | 'скопом', 327 | 'одновременно', 328 | 'параллельно', 329 | 'перпендикулярно', 330 | 'фиолетово', 331 | 'последовательно', 332 | 'синхронно', 333 | 'асинхронно', 334 | 'разновременно', 335 | 'единовременно', 336 | 'сразу', 337 | 'зараз', 338 | 'в момент', 339 | 'быстро', 340 | 'живо', 341 | 'бойко', 342 | 'энергично', 343 | 'расторопно', 344 | 'деловито', 345 | 'неутомимо', 346 | 'резко', 347 | 'внезапно', 348 | 'неожиданно', 349 | 'нежданно', 350 | 'непредвиденно', 351 | 'ожидаемо', 352 | 'предсказуемо', 353 | 'вдруг', 354 | 'непредсказуемо', 355 | 'без предупреждения', 356 | 'разом', 357 | 'за один приём', 358 | 'за один прием', 359 | 'наконом', 360 | 'решительно', 361 | 'твёрдо', 362 | 'твердо', 363 | 'устойчиво', 364 | 'неколебимо', 365 | 'непреклонно', 366 | 'непоколебимо', 367 | 'уверенно', 368 | 'неуверенно', 369 | 'робко', 370 | 'трусливо', 371 | 'застенчиво', 372 | 'смело', 373 | 'храбро', 374 | 'мужественно', 375 | 'отважно', 376 | 'доблестно', 377 | 'бесстрашно', 378 | 'бесцеремонно', 379 | 'развязно', 380 | 'мягко', 381 | 'податливо', 382 | 'плавно', 383 | 'спокойно', 384 | 'мерно', 385 | 'неподвижно', 386 | 'недвижимо', 387 | 'тихо', 388 | 'негромко', 389 | 'громко', 390 | 'звучно', 391 | 'глухо', 392 | 'приглушённо', 393 | 'приглушенно', 394 | 'с помпой', 395 | 'помпезно', 396 | 'парадно', 397 | 'пышно', 398 | 'эффектно', 399 | 'торжественно', 400 | 'официально', 401 | 'неофициально', 402 | 'серьёзно', 403 | 'серьезно', 404 | 'несерьёзно', 405 | 'несерьезно', 406 | 'величаво', 407 | 'величественно', 408 | 'внушительно', 409 | 'царственно', 410 | 'по-царски', 411 | 'нерушимо', 412 | 'священно', 413 | 'церемониально', 414 | 'крадучись', 415 | 'украдкой', 416 | 'незаметно', 417 | 'скрытно', 418 | 'тайком', 419 | 'тайно', 420 | 'втайне', 421 | 'открыто', 422 | 'публично', 423 | 'негласно', 424 | 'гласно', 425 | 'приватно', 426 | 'по секрету', 427 | 'громогласно', 428 | 'во всеуслышание', 429 | 'во всеуслышанье', 430 | 'явно', 431 | 'ясно', 432 | 'безоблачно', 433 | 'понятно', 434 | 'только', 435 | 'еще', 436 | 'уже', 437 | 'раз', 438 | 'можно', 439 | 'после', 440 | 'сейчас', 441 | 'тоже', 442 | 'теперь', 443 | 'несколько', 444 | 'более', 445 | 'также', 446 | 'пока', 447 | 'именно', 448 | 'почти', 449 | 'сегодня', 450 | 'совсем', 451 | 'нужно', 452 | 'пора', 453 | 'больше', 454 | 'сколько', 455 | 'опять', 456 | 'нельзя', 457 | 'снова', 458 | 'особенно', 459 | 'назад', 460 | 'совершенно', 461 | 'давно', 462 | 'часто', 463 | 'прежде', 464 | 'долго', 465 | 'иногда', 466 | 'затем', 467 | 'вполне', 468 | 'около', 469 | 'вокруг', 470 | 'менее', 471 | 'сначала', 472 | 'причем', 473 | 'наиболее', 474 | 'возможно', 475 | 'иначе', 476 | 'обычно', 477 | 'практически', 478 | 'столько', 479 | 'весьма', 480 | 'домой', 481 | 'необходимо', 482 | 'однажды', 483 | 'впервые', 484 | 'видно', 485 | 'известно', 486 | 'вовсе', 487 | 'скоро', 488 | 'страх', 489 | 'правильно', 490 | 'недавно', 491 | 'вперед', 492 | 'завтра', 493 | 'полностью', 494 | 'вновь', 495 | 'дома', 496 | 'обязательно', 497 | 'постоянно', 498 | 'вчера', 499 | 'примерно', 500 | 'невозможно', 501 | 'далее', 502 | 'медленно', 503 | 'естественно', 504 | 'мимо', 505 | 'внутри', 506 | 'вскоре', 507 | 'чай', 508 | 'вниз', 509 | 'абсолютно', 510 | 'интересно', 511 | 'согласно', 512 | 'лично', 513 | 'постепенно', 514 | 'настолько', 515 | 'нечего', 516 | 'должно', 517 | 'насколько', 518 | 'очевидно', 519 | 'след', 520 | 'обратно', 521 | 'вряд', 522 | 'впереди', 523 | 'вверх', 524 | 'поздно', 525 | 'рано', 526 | 'по-прежнему', 527 | 'по-моему', 528 | 'соответственно', 529 | 'специально', 530 | 'буквально', 531 | 'немедленно', 532 | 'странно', 533 | 'зло', 534 | 'относительно', 535 | 'молча', 536 | 'округ', 537 | 'тепло', 538 | 'ранее', 539 | 'вдоль', 540 | 'честно', 541 | 'осторожно', 542 | 'внимательно', 543 | 'сверху', 544 | 'навсегда', 545 | 'страсть', 546 | 'угодно', 547 | 'заранее', 548 | 'окончательно', 549 | 'фактически', 550 | 'вслед', 551 | 'исключительно', 552 | 'вне', 553 | 'особо', 554 | 'похоже', 555 | 'порой', 556 | 'редко', 557 | 'крайне', 558 | 'строго', 559 | 'широко', 560 | 'активно', 561 | 'ныне', 562 | 'навстречу', 563 | 'глубоко', 564 | 'везде', 565 | 'зря', 566 | 'больно', 567 | 'весело', 568 | 'жалко', 569 | 'выше', 570 | 'неизвестно', 571 | 'жаль', 572 | 'днем', 573 | 'сзади', 574 | 'впоследствии', 575 | 'накануне', 576 | 'внизу', 577 | 'чрезвычайно', 578 | 'отнюдь', 579 | 'непременно', 580 | 'мгновенно', 581 | 'стыдно', 582 | 'вправе', 583 | 'замуж', 584 | 'четко', 585 | 'отдельно', 586 | 'нередко', 587 | 'видать', 588 | 'нету', 589 | 'радостно', 590 | 'дважды', 591 | 'неплохо', 592 | 'ничего', 593 | 'независимо', 594 | 'высоко', 595 | 'здорово', 596 | 'самостоятельно', 597 | 'срочно', 598 | 'сперва', 599 | 'вечно', 600 | 'всерьез', 601 | 'ниже', 602 | 'поначалу', 603 | 'искренне', 604 | 'непонятно', 605 | 'реально', 606 | 'вплоть', 607 | 'справа', 608 | 'подряд', 609 | 'нынче', 610 | 'вначале', 611 | 'слева', 612 | 'по-настоящему', 613 | 'удивительно', 614 | 'холодно', 615 | 'вслух', 616 | 'слышно', 617 | 'тотчас', 618 | 'позади', 619 | 'свыше', 620 | 'посреди', 621 | 'снизу', 622 | 'вот-вот', 623 | 'кругом', 624 | 'свободно', 625 | 'по-русски', 626 | 'по-другому', 627 | 'нормально', 628 | 'коротко', 629 | 'регулярно', 630 | 'конкретно', 631 | 'крышка', 632 | 'зачастую', 633 | 'невольно', 634 | 'откровенно', 635 | 'надолго', 636 | 'подобно', 637 | 'отчасти', 638 | 'ярко', 639 | 'принципиально', 640 | 'заодно', 641 | 'целиком', 642 | 'некуда', 643 | 'неоднократно', 644 | 'наряду', 645 | 'стремительно', 646 | 'следом', 647 | 'внутрь', 648 | 'отчетливо', 649 | 'равно', 650 | 'ежедневно', 651 | 'охотно', 652 | 'смешно', 653 | 'ежегодно', 654 | 'максимально', 655 | 'грустно', 656 | 'частично', 657 | 'задумчиво', 658 | 'внешне', 659 | 'красиво', 660 | 'изнутри', 661 | 'одинаково', 662 | 'по-разному', 663 | 'по-своему', 664 | 'преимущественно', 665 | 'заново', 666 | 'недолго', 667 | 'бесконечно', 668 | 'темно', 669 | 'полно', 670 | 'попросту', 671 | 'грубо', 672 | 'научно', 673 | 'обидно', 674 | 'скучно', 675 | 'некого', 676 | 'плотно', 677 | 'наружу', 678 | 'ласково', 679 | 'наверх', 680 | 'наверху', 681 | 'шепотом', 682 | 'торопливо', 683 | 'изредка', 684 | 'пешком', 685 | 'вежливо', 686 | 'категорически', 687 | 'нежно', 688 | 'остро', 689 | 'мысленно', 690 | 'традиционно', 691 | 'потихоньку', 692 | 'прочь', 693 | 'автоматически', 694 | 'впрямь', 695 | 'тихонько', 696 | 'испуганно', 697 | 'неизбежно', 698 | 'изначально', 699 | 'поверх', 700 | 'упорно', 701 | 'физически', 702 | 'удивленно', 703 | 'сбоку', 704 | 'снаружи', 705 | 'предварительно', 706 | 'приблизительно', 707 | 'формально', 708 | 'вдвое', 709 | 'повсюду', 710 | 'поспешно', 711 | 'направо', 712 | 'толком', 713 | 'сознательно', 714 | 'печально', 715 | 'однозначно', 716 | 'жарко', 717 | 'налево', 718 | 'сердито', 719 | 'горько', 720 | 'нисколько', 721 | 'условно', 722 | 'издалека', 723 | 'горячо', 724 | 'сплошь', 725 | 'лень', 726 | 'оперативно', 727 | 'сугубо', 728 | 'нарочно', 729 | 'опять-таки', 730 | 'отныне', 731 | 'неизменно', 732 | 'временно', 733 | 'дорого', 734 | 'трижды', 735 | 'предельно', 736 | 'насквозь', 737 | 'добровольно', 738 | 'поистине', 739 | 'издали', 740 | 'объективно', 741 | 'отчаянно', 742 | 'вправду', 743 | 'щас', 744 | 'незадолго', 745 | 'неправильно', 746 | 'слыхать', 747 | 'наполовину', 748 | 'мучительно', 749 | 'ненадолго', 750 | 'растерянно', 751 | 'жадно', 752 | 'мрачно', 753 | 'моментально', 754 | 'нервно', 755 | 'всячески', 756 | 'терпеливо', 757 | 'поперек', 758 | 'справедливо', 759 | 'настойчиво', 760 | 'подчас', 761 | 'желательно', 762 | 'выгодно', 763 | 'невероятно', 764 | 'вправо', 765 | 'неторопливо', 766 | 'периодически', 767 | 'материально', 768 | 'экономически', 769 | 'низко', 770 | 'вяло', 771 | 'первоначально', 772 | 'применительно', 773 | 'любопытно', 774 | 'пополам', 775 | 'бережно', 776 | 'дополнительно', 777 | 'внутренне', 778 | 'влево', 779 | 'густо', 780 | 'взамен', 781 | 'профессионально', 782 | 'пристально', 783 | 'теоретически', 784 | 'равнодушно', 785 | 'сухо', 786 | 'задолго', 787 | 'понемногу', 788 | 'лениво', 789 | 'убедительно', 790 | 'безнадежно', 791 | 'непрерывно', 792 | 'культурно', 793 | 'глупо', 794 | 'лежа', 795 | 'умело', 796 | 'исторически', 797 | 'морально', 798 | 'по-английски', 799 | 'отрицательно', 800 | 'негде', 801 | 'жестко', 802 | 'положительно', 803 | 'замечательно', 804 | 'наизусть', 805 | 'недовольно', 806 | 'привычно', 807 | 'изрядно', 808 | 'давным-давно', 809 | 'круто', 810 | 'устало', 811 | 'заведомо', 812 | 'достойно', 813 | 'светло', 814 | 'бодро', 815 | 'шумно', 816 | 'посередине', 817 | 'наедине', 818 | 'яростно', 819 | 'налицо', 820 | 'напряженно', 821 | 'определенно', 822 | 'туго', 823 | 'тревожно', 824 | 'наутро', 825 | 'щедро', 826 | 'смутно', 827 | 'страстно', 828 | 'лихо', 829 | 'мелко', 830 | 'вдобавок', 831 | 'напоследок', 832 | 'опасно', 833 | 'нелегко', 834 | 'идеально', 835 | 'тупо', 836 | 'частенько', 837 | 'упрямо', 838 | 'необычайно', 839 | 'нехотя', 840 | 'бегом', 841 | 'покуда', 842 | 'подолгу', 843 | 'туда-сюда', 844 | 'нетерпеливо', 845 | 'судорожно', 846 | 'впредь', 847 | 'безумно', 848 | 'тонко', 849 | 'наглядно', 850 | 'жалобно', 851 | 'бесшумно', 852 | 'духовно', 853 | 'организационно', 854 | 'хмуро', 855 | 'сладко', 856 | 'по-человечески', 857 | 'послезавтра', 858 | 'быстренько', 859 | 'смертельно', 860 | 'снисходительно', 861 | 'презрительно', 862 | 'замужем', 863 | 'смущенно', 864 | 'политически', 865 | 'виновато', 866 | 'насмешливо', 867 | 'только-только', 868 | 'подозрительно', 869 | 'истинно', 870 | 'раздраженно', 871 | 'спереди', 872 | 'неохотно', 873 | 'полезно', 874 | 'жестоко', 875 | 'скорее', 876 | 'начисто', 877 | 'беззвучно', 878 | 'извне', 879 | 'хорошенько', 880 | 'грозно', 881 | 'назло', 882 | 'лихорадочно', 883 | 'болезненно', 884 | 'по-новому', 885 | 'хрипло', 886 | 'по-вашему', 887 | 'психологически', 888 | 'кратко', 889 | 'позавчера', 890 | 'насмерть', 891 | 'угрюмо', 892 | 'навеки', 893 | 'тоскливо', 894 | 'блестяще', 895 | 'напрочь', 896 | 'прямо-таки', 897 | 'грамотно', 898 | 'искусственно', 899 | 'мельком', 900 | 'незачем', 901 | 'жизненно', 902 | 'дико', 903 | 'посему', 904 | 'всего-то', 905 | 'бурно', 906 | 'характерно', 907 | 'демонстративно', 908 | 'сколько-нибудь', 909 | 'явственно', 910 | 'одиноко', 911 | 'кверху', 912 | 'приветливо', 913 | 'косвенно', 914 | 'восторженно', 915 | 'любезно', 916 | 'нечаянно', 917 | 'просто-напросто', 918 | 'хитро', 919 | 'интенсивно', 920 | 'вопросительно', 921 | 'набок', 922 | 'вдаль', 923 | 'вполголоса', 924 | 'вручную', 925 | 'попутно', 926 | 'рассеянно', 927 | 'босиком', 928 | 'недоверчиво', 929 | 'незамедлительно', 930 | 'экологически', 931 | 'незаконно', 932 | 'технически', 933 | 'достоверно', 934 | 'беспомощно', 935 | 'морг', 936 | 'назавтра', 937 | 'порою', 938 | 'поневоле', 939 | 'исправно', 940 | 'как-никак', 941 | 'намеренно', 942 | 'обиженно', 943 | 'облегченно', 944 | 'наравне', 945 | 'настороженно', 946 | 'по-французски', 947 | 'сосредоточенно', 948 | 'насильно', 949 | 'почтительно', 950 | 'безразлично', 951 | 'косо', 952 | 'многозначительно', 953 | 'злобно', 954 | 'сродни', 955 | 'уныло', 956 | 'недоуменно', 957 | 'потенциально', 958 | 'неохота', 959 | 'воедино', 960 | 'подлинно', 961 | 'бесследно', 962 | 'заботливо', 963 | 'спешно', 964 | 'наивно', 965 | 'деликатно', 966 | 'вверху', 967 | 'повсеместно', 968 | 'негативно', 969 | 'радикально', 970 | 'долой', 971 | 'усиленно', 972 | 'обильно', 973 | 'ежемесячно', 974 | 'по-немецки', 975 | 'удовлетворенно', 976 | 'неминуемо', 977 | 'душно', 978 | 'звонко', 979 | 'вкусно', 980 | 'нарочито', 981 | 'безошибочно', 982 | 'инстинктивно', 983 | 'одобрительно', 984 | 'невозмутимо', 985 | 'юридически', 986 | 'поочередно', 987 | 'невзирая', 988 | 'неслышно', 989 | 'всецело', 990 | 'сочувственно', 991 | 'скептически', 992 | 'взаимно', 993 | 'вертикально', 994 | 'подле', 995 | 'примечательно', 996 | 'неуклонно', 997 | 'впору', 998 | 'враз', 999 | 'по-детски', 1000 | 'крупно', 1001 | 'нелепо', 1002 | 'внятно', 1003 | 'по-хорошему', 1004 | 'беспрерывно', 1005 | 'врасплох', 1006 | 'добродушно', 1007 | 'забавно', 1008 | 'смирно', 1009 | 'вмиг', 1010 | 'наперед', 1011 | 'ненароком', 1012 | 'трагически', 1013 | 'издавна', 1014 | 'пронзительно', 1015 | 'критически', 1016 | 'гулко', 1017 | 'вконец', 1018 | 'беспощадно', 1019 | 'интуитивно', 1020 | 'адекватно', 1021 | 'наяву', 1022 | 'легонько', 1023 | 'угрожающе', 1024 | 'всего-навсего', 1025 | 'сроду', 1026 | 'загадочно', 1027 | 'настежь', 1028 | 'таинственно', 1029 | 'тускло', 1030 | 'вглубь', 1031 | 'механически', 1032 | 'круглосуточно', 1033 | 'бешено', 1034 | 'каково', 1035 | 'посредине', 1036 | 'пусто', 1037 | 'наугад', 1038 | 'обстоятельно', 1039 | 'наскоро', 1040 | 'укоризненно', 1041 | 'обыкновенно', 1042 | 'лукаво', 1043 | 'всемирно', 1044 | 'наспех', 1045 | 'национально', 1046 | 'по-твоему', 1047 | 'надобно', 1048 | 'наглухо', 1049 | 'мощно', 1050 | 'намертво', 1051 | 'собственноручно', 1052 | 'взволнованно', 1053 | 'наотрез', 1054 | 'секретно', 1055 | 'нестерпимо', 1056 | 'ослепительно', 1057 | 'любовно', 1058 | 'понимающе', 1059 | 'разумно', 1060 | 'поразительно', 1061 | 'предположительно', 1062 | 'вдвойне', 1063 | 'взад', 1064 | 'горестно', 1065 | 'логически', 1066 | 'образно', 1067 | 'искоса', 1068 | 'трезво', 1069 | 'вскользь', 1070 | 'органично', 1071 | 'доверительно', 1072 | 'ехидно', 1073 | 'паче', 1074 | 'скок', 1075 | 'вдогонку', 1076 | 'мимоходом', 1077 | 'по-иному', 1078 | 'беспрепятственно', 1079 | 'неспешно', 1080 | 'творчески', 1081 | 'единогласно', 1082 | 'изящно', 1083 | 'наизнанку', 1084 | 'вторично', 1085 | 'сердечно', 1086 | 'гневно', 1087 | 'изумленно', 1088 | 'возмущенно', 1089 | 'вира', 1090 | 'властно', 1091 | 'наименее', 1092 | 'сколько-то', 1093 | 'возбужденно', 1094 | 'наготове', 1095 | 'дружески', 1096 | 'загодя', 1097 | 'поутру', 1098 | 'прямиком', 1099 | 'вкупе', 1100 | 'шибко', 1101 | 'рыло', 1102 | 'оживленно', 1103 | 'невзначай', 1104 | 'нечасто', 1105 | 'вкратце', 1106 | 'безоговорочно', 1107 | 'потрясающе', 1108 | 'втрое', 1109 | 'необязательно', 1110 | 'систематически', 1111 | 'счас', 1112 | 'бедно', 1113 | 'исподлобья', 1114 | 'неестественно', 1115 | 'предостаточно', 1116 | 'дословно', 1117 | 'досрочно', 1118 | 'сокрушенно', 1119 | 'вбок', 1120 | 'по-нашему', 1121 | 'генетически', 1122 | 'помаленьку', 1123 | 'безвозвратно', 1124 | 'вдоволь', 1125 | 'психически', 1126 | 'зябко', 1127 | 'маловато', 1128 | 'стабильно', 1129 | 'убежденно', 1130 | 'душевно', 1131 | 'мигом', 1132 | 'художественно', 1133 | 'чутко', 1134 | 'умеренно', 1135 | 'логично', 1136 | 'законодательно', 1137 | 'тошно', 1138 | 'битком', 1139 | 'вдребезги', 1140 | 'заочно', 1141 | 'ощутимо', 1142 | 'исподволь', 1143 | 'воочию', 1144 | 'довольно-таки', 1145 | 'элементарно', 1146 | 'богато', 1147 | 'грязно', 1148 | 'наперебой', 1149 | 'единодушно', 1150 | 'насовсем', 1151 | 'необычно', 1152 | 'поровну', 1153 | 'слепо', 1154 | 'бессознательно', 1155 | 'мало-помалу', 1156 | 'невесело', 1157 | 'поныне', 1158 | 'безмерно', 1159 | 'навечно', 1160 | 'сполна', 1161 | 'сонно', 1162 | 'живьем', 1163 | 'неспроста', 1164 | 'поодиночке', 1165 | 'стоя', 1166 | 'законно', 1167 | 'чудовищно', 1168 | 'настоятельно', 1169 | 'рядышком', 1170 | 'мило', 1171 | 'бегло', 1172 | 'невнятно', 1173 | 'неумолимо', 1174 | 'беспокойно', 1175 | 'неясно', 1176 | 'аккурат', 1177 | 'повторно', 1178 | 'ввысь', 1179 | 'мало-мальски', 1180 | 'несравненно', 1181 | 'немедля', 1182 | 'идейно', 1183 | 'увлеченно', 1184 | 'уклончиво', 1185 | 'недорого', 1186 | 'разочарованно', 1187 | 'резонно', 1188 | 'славно', 1189 | 'чертовски', 1190 | 'произвольно', 1191 | 'динамично', 1192 | 'натурально', 1193 | 'неумело', 1194 | 'наголо', 1195 | 'позднее', 1196 | 'шутливо', 1197 | 'дыбом', 1198 | 'заблаговременно', 1199 | 'итого', 1200 | 'неудержимо', 1201 | 'обреченно', 1202 | 'осознанно', 1203 | 'элегантно', 1204 | 'впрок', 1205 | 'умышленно', 1206 | 'органически', 1207 | 'испокон', 1208 | 'отдаленно', 1209 | 'вчетвером', 1210 | 'бессильно', 1211 | 'доверху', 1212 | 'средне', 1213 | 'азартно', 1214 | 'напролет', 1215 | 'блаженно', 1216 | 'отрывисто', 1217 | 'письменно', 1218 | 'ревниво', 1219 | 'хладнокровно', 1220 | 'потихонечку', 1221 | 'вспять', 1222 | 'биологически', 1223 | 'по-старому', 1224 | 'простодушно', 1225 | 'тихонечко', 1226 | 'скупо', 1227 | 'бесповоротно', 1228 | 'молчаливо', 1229 | 'нещадно', 1230 | 'подавно', 1231 | 'стратегически', 1232 | 'самолично', 1233 | 'типично', 1234 | 'доверчиво', 1235 | 'молниеносно', 1236 | 'понаслышке', 1237 | 'напоказ', 1238 | 'неверно', 1239 | 'ошибочно', 1240 | 'поголовно', 1241 | 'чинно', 1242 | 'мастерски', 1243 | 'торжествующе', 1244 | 'чудесно', 1245 | 'музыкально', 1246 | 'по-хозяйски', 1247 | 'пропорционально', 1248 | 'сдуру', 1249 | 'совестно', 1250 | 'беззаботно', 1251 | 'порядком', 1252 | 'надвое', 1253 | 'адски', 1254 | 'аспидно', 1255 | 'баснословно', 1256 | 'бдительно', 1257 | 'без задних ног', 1258 | 'без колебаний', 1259 | 'без памяти', 1260 | 'без удержу', 1261 | 'безапелляционно', 1262 | 'безбожно', 1263 | 'безгранично', 1264 | 'безжалостно', 1265 | 'беззаветно', 1266 | 'беззастенчиво', 1267 | 'безмятежно', 1268 | 'безраздельно', 1269 | 'безудержно', 1270 | 'безукоризненно', 1271 | 'безусловно', 1272 | 'безустанно', 1273 | 'безутешно', 1274 | 'бескомпромиссно', 1275 | 'беспардонно', 1276 | 'беспредельно', 1277 | 'беспрекословно', 1278 | 'бессовестно', 1279 | 'бесстыдно', 1280 | 'бесчеловечно', 1281 | 'благим матом', 1282 | 'в доску', 1283 | 'в дым', 1284 | 'в значительной мере', 1285 | 'в значительной степени', 1286 | 'в корне', 1287 | 'в кровь', 1288 | 'в совершенстве', 1289 | 'в стельку', 1290 | 'во весь голос', 1291 | 'во весь дух', 1292 | 'во весь опор', 1293 | 'во весь рот', 1294 | 'во все глаза', 1295 | 'во все горло', 1296 | 'во все лопатки', 1297 | 'во всю Ивановскую', 1298 | 'во всю мочь', 1299 | 'всей душой', 1300 | 'всем сердцем', 1301 | 'всемерно', 1302 | 'всеми фибрами души', 1303 | 'всесторонне', 1304 | 'горючими слезами', 1305 | 'горячо ', 1306 | 'диаметрально', 1307 | 'до безрассудства', 1308 | 'до безумия', 1309 | 'до бесконечности', 1310 | 'до беспамятства', 1311 | 'до бесчувствия', 1312 | 'до боли', 1313 | 'до глубины души', 1314 | 'до зарезу', 1315 | 'до зубов', 1316 | 'до изнеможения', 1317 | 'до колик', 1318 | 'до корней волос', 1319 | 'до костей', 1320 | 'до крайности', 1321 | 'до мозга костей', 1322 | 'до небес ', 1323 | 'до невероятности', 1324 | 'до невозможности', 1325 | 'до неприличия', 1326 | 'до неузнаваемости', 1327 | 'до нитки', 1328 | 'до обидного', 1329 | 'до облаков', 1330 | 'до оскомины', 1331 | 'до основания', 1332 | 'до отвала', 1333 | 'до отказа', 1334 | 'до положения риз', 1335 | 'до полусмерти', 1336 | 'до последнего вздоха', 1337 | 'до последнего дыхания', 1338 | 'до последнего патрона', 1339 | 'до последней капли крови', 1340 | 'до последней степени', 1341 | 'до потери сознания', 1342 | 'до предела', 1343 | 'до расточительности', 1344 | 'до самозабвения', 1345 | 'до седьмого пота', 1346 | 'до слез', 1347 | 'до смерти', 1348 | 'до тошноты', 1349 | 'до ужаса', 1350 | 'до умопомрачения', 1351 | 'до упаду', 1352 | 'до ушей ', 1353 | 'до фанатизма', 1354 | 'до хрипоты', 1355 | 'до чертиков', 1356 | 'до чрезвычайности', 1357 | 'досыта', 1358 | 'дьявольски', 1359 | 'жгуче', 1360 | 'железно', 1361 | 'запоем', 1362 | 'запредельно', 1363 | 'зверски', 1364 | 'злостно', 1365 | 'изумительно', 1366 | 'исступленно', 1367 | 'истово', 1368 | 'истошно', 1369 | 'исчерпывающе', 1370 | 'кардинально', 1371 | 'катастрофически', 1372 | 'клятвенно', 1373 | 'колоссально', 1374 | 'коренным образом', 1375 | 'кристально', 1376 | 'кровно', 1377 | 'круто ', 1378 | 'люто', 1379 | 'мертвецки', 1380 | 'мертвецким сном', 1381 | 'мертвым сном', 1382 | 'на редкость', 1383 | 'на удивление', 1384 | 'на чем свет стоит', 1385 | 'навзрыд', 1386 | 'наголову', 1387 | 'надрывно', 1388 | 'назубок', 1389 | 'насущно', 1390 | 'не щадя живота своего', 1391 | 'небывало', 1392 | 'невиданно', 1393 | 'невообразимо', 1394 | 'невыносимо', 1395 | 'невыразимо', 1396 | 'недопустимо', 1397 | 'неизмеримо', 1398 | 'неимоверно', 1399 | 'неистово', 1400 | 'немилосердно', 1401 | 'немыслимо', 1402 | 'необыкновенно', 1403 | 'неописуемо', 1404 | 'неопровержимо', 1405 | 'непомерно', 1406 | 'непоправимо', 1407 | 'непостижимо', 1408 | 'непримиримо', 1409 | 'непробудно', 1410 | 'непроходимо', 1411 | 'неразрывно', 1412 | 'несказанно', 1413 | 'неслыханно', 1414 | 'несметно', 1415 | 'неузнаваемо', 1416 | 'неукоснительно', 1417 | 'неустанно', 1418 | 'неусыпно', 1419 | 'неутешно', 1420 | 'оглушительно', 1421 | 'ожесточенно', 1422 | 'от души', 1423 | 'от всей души', 1424 | 'от всего сердца', 1425 | 'открыв рот', 1426 | 'отменно', 1427 | 'панически', 1428 | 'патологически', 1429 | 'пламенно', 1430 | 'по горло', 1431 | 'по уши', 1432 | 'по-собачьи', 1433 | 'подчеркнуто', 1434 | 'позарез', 1435 | 'порядочно', 1436 | 'преступно', 1437 | 'примитивно', 1438 | 'приторно', 1439 | 'разинув рот', 1440 | 'разительно', 1441 | 'редкостно', 1442 | 'рекордно', 1443 | 'свято', 1444 | 'со всех ног', 1445 | 'строго-настрого', 1446 | 'убийственно', 1447 | 'ужасающе', 1448 | 'фанатически', 1449 | 'фанатично', 1450 | 'фантастически', 1451 | 'феноменально', 1452 | 'благосклонно', 1453 | 'врассыпную', 1454 | 'вслепую', 1455 | 'галантно', 1456 | 'натужно', 1457 | 'томно', 1458 | 'шестью', 1459 | 'всяко', 1460 | 'выжидающе', 1461 | 'ненамного', 1462 | 'ободряюще', 1463 | 'токмо', 1464 | 'трепетно', 1465 | 'резво', 1466 | 'благотворно', 1467 | 'добротно', 1468 | 'дремотно', 1469 | 'еженедельно', 1470 | 'зеркально', 1471 | 'исконно', 1472 | 'ложно', 1473 | 'невкусно', 1474 | 'неразумно', 1475 | 'очертя', 1476 | 'паршиво', 1477 | 'пестро', 1478 | 'посейчас', 1479 | 'снежно', 1480 | 'сообразно', 1481 | 'сызмальства', 1482 | 'умильно', 1483 | 'хлестко', 1484 | 'хлопотно', 1485 | 'кисло', 1486 | 'дешево', 1487 | 'взаймы', 1488 | 'исподтишка', 1489 | 'отродясь', 1490 | 'позорно', 1491 | 'пропадом', 1492 | 'радушно', 1493 | 'хищно', 1494 | 'напросто', 1495 | 'героически', 1496 | 'догола', 1497 | 'кроваво', 1498 | 'наотмашь', 1499 | 'посмертно', 1500 | 'сяк', 1501 | 'некрасиво', 1502 | 'ниоткуда', 1503 | 'свирепо', 1504 | 'благоприятно', 1505 | 'вразвалку', 1506 | 'голо', 1507 | 'гречески', 1508 | 'задорно', 1509 | 'интеллектуально', 1510 | 'муторно', 1511 | 'навытяжку', 1512 | 'нарасхват', 1513 | 'насухо', 1514 | 'натянуто', 1515 | 'нечисто', 1516 | 'обыденно', 1517 | 'ответственно', 1518 | 'праздно', 1519 | 'спросонок', 1520 | 'урывками', 1521 | 'ходко', 1522 | 'благодушно', 1523 | 'преспокойно', 1524 | 'фальшиво', 1525 | 'вволю', 1526 | 'персонально', 1527 | 'преждевременно', 1528 | 'пустынно', 1529 | 'спьяну', 1530 | 'бледно', 1531 | 'впрямую', 1532 | 'замертво', 1533 | 'невысоко', 1534 | 'немудрено', 1535 | 'понемножку', 1536 | 'равносильно', 1537 | 'вдрызг', 1538 | 'вкривь', 1539 | 'вовек', 1540 | 'вполоборота', 1541 | 'вполуха', 1542 | 'втихую', 1543 | 'деланно', 1544 | 'доколе', 1545 | 'дробно', 1546 | 'дымно', 1547 | 'еврейски', 1548 | 'ежечасно', 1549 | 'живописно', 1550 | 'интимно', 1551 | 'математически', 1552 | 'намедни', 1553 | 'невтерпеж', 1554 | 'незаслуженно', 1555 | 'ниц', 1556 | 'односложно', 1557 | 'пожизненно', 1558 | 'прощально', 1559 | 'старчески', 1560 | 'талантливо', 1561 | 'узко', 1562 | 'наземь', 1563 | 'бескорыстно', 1564 | 'навряд', 1565 | 'напролом', 1566 | 'нараспев', 1567 | 'неладно', 1568 | 'отрешенно', 1569 | 'растроганно', 1570 | 'суждено', 1571 | 'аппетитно', 1572 | 'вприпрыжку', 1573 | 'гнусно', 1574 | 'корректно', 1575 | 'надсадно', 1576 | 'налегке', 1577 | 'наружно', 1578 | 'недвижно', 1579 | 'незримо', 1580 | 'преданно', 1581 | 'солнечно', 1582 | 'стойко', 1583 | 'убито', 1584 | 'почитай', 1585 | 'впросак', 1586 | 'впятером', 1587 | 'завидно', 1588 | 'классно', 1589 | 'неравномерно', 1590 | 'нескладно', 1591 | 'нощно', 1592 | 'опрятно', 1593 | 'сыто', 1594 | 'эстонски', 1595 | 'навек', 1596 | 'невинно', 1597 | 'поверху', 1598 | 'донельзя', 1599 | 'подло', 1600 | 'просторно', 1601 | 'вповалку', 1602 | 'добела', 1603 | 'легально', 1604 | 'любя', 1605 | 'молодо', 1606 | 'набекрень', 1607 | 'навеселе', 1608 | 'наутек', 1609 | 'оценивающе', 1610 | 'сносно', 1611 | 'стихийно', 1612 | 'ядовито', 1613 | 'вразвалочку', 1614 | 'денно', 1615 | 'дюже', 1616 | 'женски', 1617 | 'завороженно', 1618 | 'истерично', 1619 | 'наизготовку', 1620 | 'планомерно', 1621 | 'помногу', 1622 | 'почетно', 1623 | 'скользко', 1624 | 'суеверно', 1625 | 'хлопотливо', 1626 | 'японски', 1627 | 'серо', 1628 | 'буднично', 1629 | 'давненько', 1630 | 'наповал', 1631 | 'уставясь', 1632 | 'воистину', 1633 | 'детски', 1634 | 'взахлеб', 1635 | 'визгливо', 1636 | 'впопыхах', 1637 | 'играючи', 1638 | 'нимало', 1639 | 'свойски', 1640 | 'сдавленно', 1641 | 'тактично', 1642 | 'протяжно', 1643 | 'братски', 1644 | 'взаперти', 1645 | 'виртуозно', 1646 | 'вскачь', 1647 | 'далековато', 1648 | 'дивно', 1649 | 'идиотски', 1650 | 'кряду', 1651 | 'негаданно', 1652 | 'попарно', 1653 | 'пристойно', 1654 | 'пыльно', 1655 | 'рьяно', 1656 | 'сытно', 1657 | 'темновато', 1658 | 'удрученно', 1659 | 'устно', 1660 | 'мутно', 1661 | 'влажно', 1662 | 'впервой', 1663 | 'заживо', 1664 | 'спросонья', 1665 | 'затемно', 1666 | 'золотисто', 1667 | 'местно', 1668 | 'метко', 1669 | 'нараспашку', 1670 | 'настрого', 1671 | 'недурно', 1672 | 'неровно', 1673 | 'смолоду', 1674 | 'вразнобой', 1675 | 'гадко', 1676 | 'грациозно', 1677 | 'занятно', 1678 | 'засветло', 1679 | 'каменно', 1680 | 'невпроворот', 1681 | 'польски', 1682 | 'премного', 1683 | 'суховато', 1684 | 'сызнова', 1685 | 'успокаивающе', 1686 | 'утомительно', 1687 | 'всласть', 1688 | 'зорко', 1689 | 'нипочем', 1690 | 'сипло', 1691 | 'сумрачно', 1692 | 'отовсюду', 1693 | 'вперемежку', 1694 | 'завсегда', 1695 | 'мерзко', 1696 | 'навзничь', 1697 | 'наперевес', 1698 | 'недобро', 1699 | 'поминутно', 1700 | 'покрепче', 1701 | 'безболезненно', 1702 | 'воровато', 1703 | 'донизу', 1704 | 'доподлинно', 1705 | 'мудрено', 1706 | 'несмело', 1707 | 'рановато', 1708 | 'нечестно', 1709 | 'рысью', 1710 | 'прохладно', 1711 | 'добром', 1712 | 'анфас', 1713 | 'вдосталь', 1714 | 'вольготно', 1715 | 'впритык', 1716 | 'всмятку', 1717 | 'вширь', 1718 | 'геройски', 1719 | 'людно', 1720 | 'навыпуск', 1721 | 'насильственно', 1722 | 'отвесно', 1723 | 'похвально', 1724 | 'сказочно', 1725 | 'солдатски', 1726 | 'эдак', 1727 | 'дерзко', 1728 | 'допоздна', 1729 | 'картинно', 1730 | 'сокращенно', 1731 | 'сям', 1732 | 'неинтересно', 1733 | 'бездарно', 1734 | 'парадоксально', 1735 | 'понуро', 1736 | 'попеременно', 1737 | 'пьяно', 1738 | 'сладостно', 1739 | 'взаправду', 1740 | 'голодно', 1741 | 'дотоле', 1742 | 'единожды', 1743 | 'желчно', 1744 | 'зело', 1745 | 'зримо', 1746 | 'красочно', 1747 | 'наперво', 1748 | 'неплотно', 1749 | 'подкожно', 1750 | 'постыдно', 1751 | 'скоренько', 1752 | 'безмолвно', 1753 | 'доступно', 1754 | 'остроумно', 1755 | 'туманно', 1756 | 'методично', 1757 | 'доселе', 1758 | 'модно', 1759 | 'помалу', 1760 | 'безучастно', 1761 | 'воздушно', 1762 | 'воинственно', 1763 | 'длительно', 1764 | 'дотла', 1765 | 'призывно', 1766 | 'споро', 1767 | 'терпимо', 1768 | 'кротко', 1769 | 'нахально', 1770 | 'неодобрительно', 1771 | 'ново', 1772 | 'вредно', 1773 | 'давеча', 1774 | 'вброд', 1775 | 'включительно', 1776 | 'впотьмах', 1777 | 'наклонясь', 1778 | 'ничегошеньки', 1779 | 'предостерегающе', 1780 | 'ритмично', 1781 | 'серовато', 1782 | 'тягостно', 1783 | 'утомленно', 1784 | 'невыгодно', 1785 | 'стыдливо', 1786 | 'чудно', 1787 | 'вчетверо', 1788 | 'неосторожно', 1789 | 'опрометью', 1790 | 'капризно', 1791 | 'лестно', 1792 | 'огорченно', 1793 | 'трудновато', 1794 | 'почем', 1795 | 'десятью', 1796 | 'мертвенно', 1797 | 'начистоту', 1798 | 'неточно', 1799 | 'толсто', 1800 | 'ужо', 1801 | 'гениально', 1802 | 'обрадованно', 1803 | 'сыро', 1804 | 'бездумно', 1805 | 'накрест', 1806 | 'плашмя', 1807 | 'эк', 1808 | 'бестактно', 1809 | 'вплавь', 1810 | 'второпях', 1811 | 'вынужденно', 1812 | 'жирно', 1813 | 'навылет', 1814 | 'нагишом', 1815 | 'напропалую', 1816 | 'негоже', 1817 | 'беспечно', 1818 | 'свежо', 1819 | 'благостно', 1820 | 'гуманно', 1821 | 'диковато', 1822 | 'доходчиво', 1823 | 'заливисто', 1824 | 'зыбко', 1825 | 'коварно', 1826 | 'кучно', 1827 | 'наобум', 1828 | 'наощупь', 1829 | 'насмарку', 1830 | 'наудачу', 1831 | 'неярко', 1832 | 'плоховато', 1833 | 'понарошку', 1834 | 'привольно', 1835 | 'связно', 1836 | 'угнетающе', 1837 | 'фатально', 1838 | 'хамски', 1839 | 'хронически', 1840 | 'шустро', 1841 | 'благородно', 1842 | 'мудро', 1843 | 'толково', 1844 | 'грешно', 1845 | 'грубовато', 1846 | 'начеку', 1847 | 'шутя', 1848 | 'абхазски', 1849 | 'буйно', 1850 | 'втихомолку', 1851 | 'едко', 1852 | 'зычно', 1853 | 'иронично', 1854 | 'искренно', 1855 | 'настороже', 1856 | 'плоско', 1857 | 'злорадно', 1858 | 'цепко', 1859 | 'безвинно', 1860 | 'бессвязно', 1861 | 'божески', 1862 | 'броском', 1863 | 'вальяжно', 1864 | 'вовне', 1865 | 'восемью', 1866 | 'впроголодь', 1867 | 'всенепременно', 1868 | 'гортанно', 1869 | 'испански', 1870 | 'наперечет', 1871 | 'нескоро', 1872 | 'ориентировочно', 1873 | 'особливо', 1874 | 'плачевно', 1875 | 'сжато', 1876 | 'стократ', 1877 | 'убого', 1878 | 'умиленно', 1879 | 'хаотично', 1880 | 'накрепко', 1881 | 'раздельно', 1882 | 'сгоряча', 1883 | 'умно', 1884 | 'скорбно', 1885 | 'ошалело', 1886 | 'походя', 1887 | 'сломя', 1888 | 'церемонно', 1889 | 'пошло', 1890 | 'докрасна', 1891 | 'заслуженно', 1892 | 'натощак', 1893 | 'осуждающе', 1894 | 'подчистую', 1895 | 'пополудни', 1896 | 'потерянно', 1897 | 'предательски', 1898 | 'субъективно', 1899 | 'четырежды', 1900 | 'грузно', 1901 | 'утвердительно', 1902 | 'хозяйски', 1903 | 'блекло', 1904 | 'вприсядку', 1905 | 'гибко', 1906 | 'двадцатью', 1907 | 'дочерна', 1908 | 'издревле', 1909 | 'нестройно', 1910 | 'подспудно', 1911 | 'симпатично', 1912 | 'скудно', 1913 | 'стройно', 1914 | 'монотонно', 1915 | 'наискось', 1916 | 'победно', 1917 | 'покамест', 1918 | 'вскорости', 1919 | 'китайски', 1920 | 'порывисто', 1921 | 'пугливо', 1922 | 'страдальчески', 1923 | 'ничком', 1924 | 'изысканно', 1925 | 'лаконично', 1926 | 'молчком', 1927 | 'навыкате', 1928 | 'напористо', 1929 | 'ничтожно', 1930 | 'отрадно', 1931 | 'поделом', 1932 | 'прелестно', 1933 | 'спозаранку', 1934 | 'томительно', 1935 | 'длинно', 1936 | 'актуально', 1937 | 'близоруко', 1938 | 'грузински', 1939 | 'кишмя', 1940 | 'крыто', 1941 | 'мимолетно', 1942 | 'неискренне', 1943 | 'обалдело', 1944 | 'организованно', 1945 | 'отсюдова', 1946 | 'предпочтительно', 1947 | 'пылко', 1948 | 'разнообразно', 1949 | 'сторицей', 1950 | 'веско', 1951 | 'восвояси', 1952 | 'игриво', 1953 | 'наискосок', 1954 | 'неотрывно', 1955 | 'смачно', 1956 | 'вровень', 1957 | 'многовато', 1958 | 'прозрачно', 1959 | 'складно', 1960 | 'степенно', 1961 | 'страшновато', 1962 | 'стремглав', 1963 | 'вдумчиво', 1964 | 'втихаря', 1965 | 'жутковато', 1966 | 'наперегонки', 1967 | 'нереально', 1968 | 'нетвердо', 1969 | 'популярно', 1970 | 'сочно', 1971 | 'цинично', 1972 | 'досадно', 1973 | 'мокро', 1974 | 'наперерез', 1975 | 'бесспорно', 1976 | 'аморально', 1977 | 'ветрено', 1978 | 'всухомятку', 1979 | 'вчистую', 1980 | 'глуховато', 1981 | 'задушевно', 1982 | 'зачарованно', 1983 | 'мелодично', 1984 | 'минимально', 1985 | 'навыворот', 1986 | 'наново', 1987 | 'немо', 1988 | 'ответно', 1989 | 'понизу', 1990 | 'посередке', 1991 | 'романтично', 1992 | 'спонтанно', 1993 | 'оттуда', 1994 | 'отсюда', 1995 | 'наверно', 1996 | 'столь', 1997 | 'потом', 1998 | 'тута', 1999 | 'этак', 2000 | 'там', 2001 | 'видимо', 2002 | 'вон', 2003 | 'где', 2004 | 'сколь', 2005 | 'человечески', 2006 | 'единственно', 2007 | 'социально', 2008 | 'английски', 2009 | 'черно', 2010 | 'никак', 2011 | 'ничуть', 2012 | 'наверное', 2013 | 'действительно', 2014 | 'сюда', 2015 | 'туда', 2016 | 'откуда', 2017 | 'вперемешку', 2018 | 'книзу', 2019 | 'нудно', 2020 | 'отечески', 2021 | 'притворно', 2022 | 'поэтому', 2023 | 'несомненно', 2024 | 'всюду', 2025 | 'полгода', 2026 | 'наконец', 2027 | 'зачем', 2028 | 'так', 2029 | 'сидя', 2030 | 'русски', 2031 | 'вообще', 2032 | 'никогда', 2033 | 'нигде', 2034 | 'некогда', 2035 | 'оттого', 2036 | 'пятью', 2037 | 'куда', 2038 | 'всегда', 2039 | 'наверняка', 2040 | 'никуда', 2041 | 'отчего', 2042 | 'дорогой', 2043 | 'потому', 2044 | 'почему', 2045 | 'случайно', 2046 | 'собственно', 2047 | 'вероятно', 2048 | 'тогда', 2049 | 'здесь', 2050 | 'наоборот', 2051 | 'верно', 2052 | 'ввек', 2053 | 'вкось', 2054 | 'вкрутую', 2055 | 'внаем', 2056 | 'вничью', 2057 | 'вовеки', 2058 | 'вполоборота вполовину', 2059 | 'вприкуску', 2060 | 'впрочем', 2061 | 'вразбивку', 2062 | 'вразброд', 2063 | 'вразнос', 2064 | 'вразрез', 2065 | 'вразрядку', 2066 | 'врастяжку', 2067 | 'врукопашную', 2068 | 'всплошную', 2069 | 'втридорога', 2070 | 'вчерне', 2071 | 'довеку', 2072 | 'докуда', 2073 | 'досуха', 2074 | 'дочиста', 2075 | 'заутра', 2076 | 'иссиня', 2077 | 'исстари', 2078 | 'набело', 2079 | 'навряд ли', 2080 | 'навынос', 2081 | 'наперекор', 2082 | 'например', 2083 | 'напрокат', 2084 | 'напротив', 2085 | 'начерно', 2086 | 'невдомек', 2087 | 'невмоготу', 2088 | 'отроду', 2089 | 'поближе', 2090 | 'побоку', 2091 | 'по-делом', 2092 | 'подешевле', 2093 | 'подольше', 2094 | 'помимо', 2095 | 'поскольку', 2096 | 'постольку', 2097 | 'сверх', 2098 | 'сплеча', 2099 | 'без ведома', 2100 | 'без оглядки', 2101 | 'без отказа', 2102 | 'без просвета', 2103 | 'без разбору', 2104 | 'без спросу', 2105 | 'без умолку', 2106 | 'без устали', 2107 | 'в виде', 2108 | 'в диковинку', 2109 | 'в заключение', 2110 | 'в конце концов', 2111 | 'в меру', 2112 | 'в насмешку', 2113 | 'в обмен', 2114 | 'в обнимку', 2115 | 'в обрез', 2116 | 'в обтяжку', 2117 | 'в обхват', 2118 | 'в общем', 2119 | 'во всеоружии', 2120 | 'во избежание', 2121 | 'во сто крат', 2122 | 'в открытую', 2123 | 'в отместку', 2124 | 'в охапку', 2125 | 'в прах', 2126 | 'в противовес', 2127 | 'в рассрочку', 2128 | 'в розницу', 2129 | 'в ряд', 2130 | 'в сердцах', 2131 | 'в складчину', 2132 | 'вслед за тем', 2133 | 'в срок', 2134 | 'в старину', 2135 | 'в сторону', 2136 | 'в струнку', 2137 | 'в тиши', 2138 | 'в три погибели', 2139 | 'в тупик', 2140 | 'в упор', 2141 | 'до востребования', 2142 | 'до свидания', 2143 | 'до сих пор', 2144 | 'за глаза', 2145 | 'за границей', 2146 | 'за границу', 2147 | 'за полночь', 2148 | 'из-за границы', 2149 | 'из-под мышек', 2150 | 'из-под мышки', 2151 | 'из-под спуда', 2152 | 'как раз', 2153 | 'мал мала меньше', 2154 | 'на авось', 2155 | 'на бегу', 2156 | 'на боковую', 2157 | 'на веки вечные', 2158 | 'на вес', 2159 | 'на весу', 2160 | 'на вид', 2161 | 'виду', 2162 | 'на вкус', 2163 | 'на время', 2164 | 'на выбор', 2165 | 'на глаз', 2166 | 'на грех', 2167 | 'на диво', 2168 | 'на днях', 2169 | 'на дом', 2170 | 'на дому', 2171 | 'на дыбы', 2172 | 'на зависть', 2173 | 'на излете', 2174 | 'на измор', 2175 | 'на износ', 2176 | 'на исходе', 2177 | 'на корточках', 2178 | 'на корточки', 2179 | 'на лад', 2180 | 'на лету', 2181 | 'на манер', 2182 | 'на миг', 2183 | 'на мировую', 2184 | 'на отлете', 2185 | 'на отлично', 2186 | 'на ощупь', 2187 | 'на память', 2188 | 'на плаву', 2189 | 'на поруки', 2190 | 'на при цел', 2191 | 'на руку', 2192 | 'на рысях', 2193 | 'на скаку', 2194 | 'на славу', 2195 | 'на смех', 2196 | 'на совесть', 2197 | 'на страже', 2198 | 'на убой', 2199 | 'на ура', 2200 | 'на ходу', 2201 | 'на цыпочках', 2202 | 'на часах', 2203 | 'на четвереньках', 2204 | 'не в духе', 2205 | 'нее меру', 2206 | 'не в пример', 2207 | 'не за что', 2208 | 'не к добру', 2209 | 'нет спеху', 2210 | 'не к чему', 2211 | 'не по вкусу', 2212 | 'не под силу', 2213 | 'не по зубам', 2214 | 'не по плечу', 2215 | 'не прочь', 2216 | 'не с руки', 2217 | 'ни за что', 2218 | 'ни за грош', 2219 | 'нога в ногу', 2220 | 'один на один', 2221 | 'от мала до велика', 2222 | 'по временам', 2223 | 'под боком', 2224 | 'под вечер', 2225 | 'под гору', 2226 | 'по дешевке', 2227 | 'под конец', 2228 | 'пот ложечкой', 2229 | 'под мышками', 2230 | 'под мышки', 2231 | 'под силу', 2232 | 'под стать', 2233 | 'по двое', 2234 | 'под шумок', 2235 | 'под уздцы', 2236 | 'под уклон', 2237 | 'по крайней мере', 2238 | 'по одному', 2239 | 'по очереди', 2240 | 'по преимуществу', 2241 | 'по совести', 2242 | 'по старинке', 2243 | 'по трое', 2244 | 'про себя', 2245 | 'с боку на бок', 2246 | 'сбоку припёка', 2247 | 'с ведома', 2248 | 'с виду', 2249 | 'с глазу на глаз', 2250 | 'слово в слово', 2251 | 'с маху', 2252 | 'с налета', 2253 | 'с наскока', 2254 | 'с начала до конца', 2255 | 'со всем тем', 2256 | 'с разбегу', 2257 | 'с разгона', 2258 | 'с размаху', 2259 | 'сходу', 2260 | 'с часу на час', 2261 | 'час от часу', 2262 | 'вот', 2263 | 'вшестером', 2264 | 'всемером', 2265 | 'ввосьмером', 2266 | 'вдевятером', 2267 | 'вдесятером', 2268 | 2269 | // английские предлоги 2270 | ); 2271 | } 2272 | } 2273 | -------------------------------------------------------------------------------- /AnalyzerText/Filter/WordList/Interjection.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Filter\WordList; 9 | 10 | /** 11 | * Оставляет в списке междометья. 12 | * 13 | * @author Peter Gribanov 14 | */ 15 | class Interjection extends WordList 16 | { 17 | /** 18 | * Возвращает список слов. 19 | * 20 | * @return array 21 | */ 22 | public function getWords() 23 | { 24 | return array( 25 | // русские междометья 26 | 'ох', 27 | 'ого', 28 | 'ого', 29 | 'эй', 30 | 'эх', 31 | 'цып', 32 | 'брысь', 33 | 'aх', 34 | 'ух', 35 | 'брр', 36 | 'тпру', 37 | 'гм', 38 | 'дзинь', 39 | 'тс', 40 | 'цс', 41 | 'тьфу', 42 | 'ой', 43 | 'фу', 44 | 'фи', 45 | 'ага', 46 | 'апчи', 47 | 'браво', 48 | 'ж', 49 | 'буль', 50 | 'ку', 51 | 'хлоп', 52 | 'бац', 53 | 'бух', 54 | 'шлёп', 55 | 'бум', 56 | 'бах', 57 | 'пли', 58 | 'гав', 59 | 'мяу', 60 | 'тра', 61 | 'ишь', 62 | 'вишь', 63 | 'то-то', 64 | 'эка', 65 | 'ш', 66 | 'вот те раз', 67 | 'ну', 68 | 'типа', 69 | 'хватит', 70 | 'лады', 71 | 'ок', 72 | 'хорош', 73 | 'короче', 74 | '/^а+(\-а+)*$/ui', // ААааа Аааа-а-а 75 | 76 | // английские междометья 77 | 'ok', 78 | 'oh', 79 | 'ah', 80 | 'bravo', 81 | ); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /AnalyzerText/Filter/WordList/Particle.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Filter\WordList; 9 | 10 | /** 11 | * Оставляет в списке частицы. 12 | * 13 | * @author Peter Gribanov 14 | */ 15 | class Particle extends WordList 16 | { 17 | /** 18 | * Возвращает список слов. 19 | * 20 | * @return array 21 | */ 22 | public function getWords() 23 | { 24 | return array( 25 | // русские междометья 26 | 'пусть', 27 | 'пускай', 28 | 'давайте', 29 | 'да', 30 | 'давай', 31 | 'бы,', 32 | 'б', 33 | 'бывало', 34 | 'не', 35 | 'ни', 36 | 'ли', 37 | 'неужели', 38 | 'разве', 39 | 'вот', 40 | 'вон', 41 | 'именно', 42 | 'только', 43 | 'лишь', 44 | 'исключительно', 45 | 'единственно', 46 | 'как', 47 | 'даже', 48 | 'же', 49 | 'ведь', 50 | 'уж', 51 | 'все-таки', 52 | 'пусть', 53 | 'бишь', 54 | 'вишь', 55 | 'де', 56 | 'дескать', 57 | 'ин', 58 | 'ишь', 59 | 'мол', 60 | 'небось', 61 | 'нет', 62 | 'неужели', 63 | 'нехай', 64 | 'ну-с', 65 | 'сём', 66 | 'сем', 67 | 'таки', 68 | 'те', 69 | 'уж', 70 | 'а', 71 | 'благо', 72 | 'более', 73 | 'больше', 74 | 'буквально', 75 | 'бывает', 76 | 'бывало', 77 | 'было', 78 | 'будто', 79 | 'ведь', 80 | 'во', 81 | 'вовсе', 82 | 'вон', 83 | 'вот', 84 | 'вроде', 85 | 'всё', 86 | 'все', 87 | 'всего', 88 | 'где', 89 | 'гляди', 90 | 'да', 91 | 'давай', 92 | 'давайте', 93 | 'даже', 94 | 'дай', 95 | 'дайте', 96 | 'действительно', 97 | 'единственно', 98 | 'если', 99 | 'ещё', 100 | 'знай', 101 | 'и', 102 | 'или', 103 | 'менно', 104 | 'как', 105 | 'какое', 106 | 'куда', 107 | 'ладно', 108 | 'ли', 109 | 'лучше', 110 | 'никак', 111 | 'ничего', 112 | 'нечего', 113 | 'однако', 114 | 'окончательно', 115 | 'оно', 116 | 'поди', 117 | 'положительно', 118 | 'просто', 119 | 'прямо', 120 | 'пусть', 121 | 'пускай', 122 | 'разве', 123 | 'решительно', 124 | 'ровно', 125 | 'самое', 126 | 'себе', 127 | 'скорее', 128 | 'словно', 129 | 'совершенно', 130 | 'спасибо', 131 | 'так', 132 | 'там', 133 | 'тебе', 134 | 'тоже', 135 | 'только', 136 | 'точно', 137 | 'хоть', 138 | 'чего', 139 | 'чисто', 140 | 'что', 141 | 'чтоб', 142 | 'чтобы', 143 | 'эк', 144 | 'это', 145 | '*-ка', 146 | '*-то', 147 | '*-с', 148 | 'вовсе не', 149 | 'далеко не', 150 | 'отнюдь не', 151 | 'почти что', 152 | 'как раз', 153 | 'что за', 154 | 'вряд ли', 155 | 'едва ли', 156 | 157 | // английские междометья 158 | ); 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /AnalyzerText/Filter/WordList/Preposition.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Filter\WordList; 9 | 10 | /** 11 | * Оставляет в списке предлоги. 12 | * 13 | * @author Peter Gribanov 14 | */ 15 | class Preposition extends WordList 16 | { 17 | /** 18 | * Возвращает список слов. 19 | * 20 | * @return array 21 | */ 22 | public function getWords() 23 | { 24 | return array( 25 | // русские предлоги 26 | 'без', 27 | 'в', 28 | 'до', 29 | 'для', 30 | 'за', 31 | 'из', 32 | 'к', 33 | 'ко', 34 | 'на', 35 | 'над', 36 | 'о', 37 | 'об', 38 | 'обо', 39 | 'от', 40 | 'по', 41 | 'под', 42 | 'пред', 43 | 'при', 44 | 'про', 45 | 'с', 46 | 'у', 47 | 'через', 48 | 'со', 49 | 'из-за', 50 | 'из-под', 51 | 'около', 52 | 'близ', 53 | 54 | // английские предлоги 55 | 'at', 56 | 'on', 57 | 'in', 58 | 'about', 59 | 'above', 60 | 'below', 61 | 'during', 62 | 'after', 63 | 'before', 64 | 'by', 65 | 'for', 66 | 'from', 67 | 'of', 68 | 'since', 69 | 'to', 70 | 'till', 71 | 'with', 72 | 'up', 73 | 'down', 74 | 'off', 75 | 'onto', 76 | 'towards', 77 | 'away', 78 | 'through', 79 | 'into', 80 | 'along', 81 | 'past', 82 | 'across', 83 | 'over', 84 | 'between', 85 | 'under', 86 | 'outside', 87 | 'the', 88 | 'a', 89 | 'are', 90 | ); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /AnalyzerText/Filter/WordList/Pronoun.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Filter\WordList; 9 | 10 | /** 11 | * Оставляет в списке местоимения. 12 | * 13 | * @author Peter Gribanov 14 | */ 15 | class Pronoun extends WordList 16 | { 17 | /** 18 | * Возвращает список слов. 19 | * 20 | * @return array 21 | */ 22 | public function getWords() 23 | { 24 | return array( 25 | // русские местоимения 26 | 'я', 27 | 'меня', 28 | 'мне', 29 | 'мной', 30 | 'мною', 31 | 'обо мне', 32 | 'мы', 33 | 'нас', 34 | 'нам', 35 | 'нами', 36 | 'о нас', 37 | 'ты', 38 | 'тебя', 39 | 'тебе', 40 | 'тобой', 41 | 'тобою', 42 | 'вы', 43 | 'вас', 44 | 'вам', 45 | 'вами', 46 | 'он', 47 | 'его', 48 | 'него', 49 | 'ему', 50 | 'нему', 51 | 'им', 52 | 'ним', 53 | 'нём', 54 | 'о нём', 55 | 'нем', 56 | 'она', 57 | 'её', 58 | 'ее', 59 | 'неё', 60 | 'нее', 61 | 'ей', 62 | 'ней', 63 | 'ею', 64 | 'нею', 65 | 'оно', 66 | 'они', 67 | 'их', 68 | 'них', 69 | 'ими', 70 | 'ними', 71 | 'о них', 72 | 'себя', 73 | 'себе', 74 | 'собой', 75 | 'собою', 76 | 'мой', 77 | 'моего', 78 | 'моему', 79 | 'моё', 80 | 'мое', 81 | 'моём', 82 | 'о моём', 83 | 'моем', 84 | 'моя', 85 | 'моей', 86 | 'мою', 87 | 'мои', 88 | 'моих', 89 | 'моим', 90 | 'моими', 91 | 'наш', 92 | 'нашего', 93 | 'нашим', 94 | 'нашем', 95 | 'наша', 96 | 'нашей', 97 | 'нашу', 98 | 'наше', 99 | 'о нашем', 100 | 'наши', 101 | 'наших', 102 | 'нашими', 103 | 'твой', 104 | 'твоего', 105 | 'твоему', 106 | 'твоим', 107 | 'твоём', 108 | 'о твоём', 109 | 'твоем', 110 | 'твоя', 111 | 'твоей', 112 | 'твою', 113 | 'твое', 114 | 'ваш', 115 | 'вашего', 116 | 'вашему', 117 | 'вашим', 118 | 'вашем', 119 | 'о вашем', 120 | 'ваша', 121 | 'вашей', 122 | 'вашу', 123 | 'ваше', 124 | 'свой', 125 | 'своих', 126 | 'своим', 127 | 'своими', 128 | 'своя', 129 | 'своей', 130 | 'свою', 131 | 'своё', 132 | 'свое', 133 | 'своего', 134 | 'своему', 135 | 'своём', 136 | 'о своём', 137 | 'своем', 138 | 'свои', 139 | 'о своих', 140 | 'кто', 141 | 'что', 142 | 'каков', 143 | 'чей', 144 | 'который', 145 | 'какой', 146 | 'какое', 147 | 'какая', 148 | 'какие', 149 | 'какого', 150 | 'каких', 151 | 'какому', 152 | 'каким', 153 | 'какую', 154 | 'какою', 155 | 'какими', 156 | 'каком', 157 | 'сколько', 158 | 'столько', 159 | 'этот', 160 | 'тот', 161 | 'такой', 162 | 'таков', 163 | 'такова', 164 | 'сей', 165 | 'весь', 166 | 'всякий', 167 | 'сам', 168 | 'самый', 169 | 'каждый', 170 | 'любой', 171 | 'другой', 172 | 'иной', 173 | 'никто', 174 | 'ничто', 175 | 'некого', 176 | 'нечего', 177 | 'нисколько', 178 | 'никакой', 179 | 'ничей', 180 | 'некто', 181 | 'нечто', 182 | 'некий', 183 | 'некоторый', 184 | 'несколько', 185 | 'это', 186 | 'эта', 187 | 'эти', 188 | 'этого', 189 | 'этой', 190 | 'этих', 191 | 'этому', 192 | 'этим', 193 | 'эту', 194 | 'этою', 195 | 'этими', 196 | 'этом', 197 | 'сие', 198 | 'сия', 199 | 'сии', 200 | 'сего', 201 | 'сих', 202 | 'сему', 203 | 'сим', 204 | 'сию', 205 | 'сею', 206 | 'сиею', 207 | 'сими', 208 | 'сём', 209 | 'то', 210 | 'та', 211 | 'те', 212 | 'того', 213 | 'той', 214 | 'тех', 215 | 'тому', 216 | 'тем', 217 | 'ту', 218 | 'тою', 219 | 'теми', 220 | 'данный', 221 | 'данное', 222 | 'данная', 223 | 'данного', 224 | 'данной', 225 | 'данному', 226 | 'данную', 227 | 'данною', 228 | 'данном', 229 | 'всё', 230 | 'вся', 231 | 'все', 232 | 'всего', 233 | 'всей', 234 | 'всех', 235 | 'всему', 236 | 'всем', 237 | 'всю', 238 | 'всею', 239 | 'всеми', 240 | 'всём', 241 | 'вот', 242 | 'кому', 243 | 'этакий', 244 | 'этакое', 245 | 'этакая', 246 | 'этакие', 247 | 'этакого', 248 | 'этакой', 249 | 'этаких', 250 | 'этакому', 251 | 'этаким', 252 | 'этакую', 253 | 'этакою', 254 | 'этакими', 255 | 'этаком', 256 | 'другие', 257 | 'какой-то', 258 | 'оба', 259 | 'тот или другой', 260 | 'и тот и другой', 261 | 'мало', 262 | 'немногие', 263 | 'себя,', 264 | 'сама', 265 | 'ёё', 266 | 'само,', 267 | 'немного', 268 | 'много', 269 | 'многие', 270 | 'ни тот', 271 | 'ни другой', 272 | 'нет', 273 | 'ни один', 274 | 'друг друга', 275 | 'некоторые', 276 | 'тот же самый', 277 | 'сами', 278 | 'что бы ни', 279 | 'какой бы ни', 280 | 'кто бы ни', 281 | 'которого', 282 | 'которому', 283 | 'ваши', 284 | 'кое-*', 285 | '*-то', 286 | '*-либо', 287 | '*-нибудь', 288 | '/^том$/u', // местоимение, а не имя Том 289 | 290 | // английские местоимения 291 | 'all', 292 | 'another', 293 | 'any', 294 | 'both', 295 | 'each', 296 | 'either', 297 | 'every', 298 | 'herself', 299 | 'himself', 300 | 'he', 301 | 'she', 302 | 'it', 303 | 'him', 304 | 'her', 305 | 'we', 306 | 'you', 307 | 'they', 308 | 'us', 309 | 'them', 310 | 'this', 311 | 'thet', 312 | 'these', 313 | 'thos', 314 | 'his', 315 | 'its', 316 | 'hers', 317 | 'our', 318 | 'your', 319 | 'their', 320 | 'ours', 321 | 'yours', 322 | 'theis', 323 | 'much', 324 | 'many', 325 | 'little', 326 | 'few', 327 | 'lot', 328 | 'i', 329 | 'itself', 330 | 'me', 331 | 'mine', 332 | 'my', 333 | 'myself', 334 | 'neither', 335 | 'none', 336 | 'one another', 337 | 'oneself', 338 | 'some', 339 | 'such', 340 | 'that', 341 | 'the same', 342 | 'themselves', 343 | 'those', 344 | 'what', 345 | 'whatever', 346 | 'which', 347 | 'whichever', 348 | 'who', 349 | 'whoever', 350 | 'whom', 351 | 'whose', 352 | 'yourself', 353 | ); 354 | } 355 | } 356 | -------------------------------------------------------------------------------- /AnalyzerText/Filter/WordList/Union.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Filter\WordList; 9 | 10 | /** 11 | * Оставляет в списке союзы. 12 | * 13 | * @author Peter Gribanov 14 | */ 15 | class Union extends WordList 16 | { 17 | /** 18 | * Возвращает список слов. 19 | * 20 | * @return array 21 | */ 22 | public function getWords() 23 | { 24 | return array( 25 | 'как', 26 | 'словно', 27 | 'так', 28 | 'для', 29 | 'того', 30 | 'чтобы', 31 | 'тоже', 32 | 'зато', 33 | 'потому', 34 | 'что', 35 | 'и', 36 | 'а', 37 | 'или', 38 | 'но', 39 | 'однако', 40 | 'ни', 41 | 'если', 42 | 'то', 43 | 'да', 44 | 'не', 45 | 'только', 46 | 'или', 47 | 'либо', 48 | 'ли', 49 | 'же', 50 | 'все', 51 | 'столько', 52 | 'также', 53 | 'притом', 54 | 'причём', 55 | 'причем', 56 | 'есть', 57 | 'именно', 58 | 'когда', 59 | 'лишь', 60 | 'едва', 61 | 'будто', 62 | 'точно', 63 | 'бы', 64 | 'коли', 65 | 'ежели', 66 | 'несмотря', 67 | 'на', 68 | 'хотя', 69 | 'хоть', 70 | 'пускай', 71 | 'дабы', 72 | 'c', 73 | 'тем', 74 | 'ведь', 75 | 'чем', 76 | 'в то же время', 77 | ); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /AnalyzerText/Filter/WordList/WordList.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Filter\WordList; 9 | 10 | use AnalyzerText\Filter\Filter; 11 | use AnalyzerText\Text; 12 | use AnalyzerText\Text\Word; 13 | 14 | /** 15 | * Оставляет в списке слова из списка или удаляет их. 16 | * 17 | * Проходи по списку слов и проверяет, что они находится в списке слов которые нужно оставить 18 | * 19 | * @author Peter Gribanov 20 | */ 21 | abstract class WordList extends Filter 22 | { 23 | /** 24 | * Простые слова. 25 | * 26 | * @var array 27 | */ 28 | private $simple = array(); 29 | 30 | /** 31 | * Составные слова. 32 | * 33 | * Составные слова о части которого нам известно. 34 | * Например слово пишется через тирэ 35 | * 36 | * @var array 37 | */ 38 | private $composite = array(); 39 | 40 | /** 41 | * Последовательности из набора слов. 42 | * 43 | * @var array 44 | */ 45 | private $sequence = array(); 46 | 47 | /** 48 | * @param Text $iterator Текст 49 | */ 50 | public function __construct(Text $iterator) 51 | { 52 | parent::__construct($iterator); 53 | $this->repackWordList(); 54 | } 55 | 56 | /** 57 | * Проверяет, является ли текущее слово допустимым 58 | * 59 | * @return bool 60 | */ 61 | public function accept() 62 | { 63 | $word = $this->current(); 64 | 65 | return $this->isSequence($word) || $this->isSimple($word) || $this->isComposite($word); 66 | } 67 | 68 | /** 69 | * Это последовательность. 70 | * 71 | * @param Word $word Слово 72 | * 73 | * @return bool 74 | */ 75 | public function isSequence(Word $word) 76 | { 77 | $plain = $word->getPlain(); 78 | foreach ($this->sequence as $sequence) { 79 | if ($sequence[0] === $plain) { 80 | $sequence_length = count($sequence); 81 | for ($i = 1; $i < $sequence_length; ++$i) { 82 | if (!($next_word = $this->getNextWord($i)) || $next_word->getPlain() != $sequence[$i]) { 83 | continue 2; 84 | } 85 | } 86 | 87 | // удаляем слова из последовательности 88 | $key = $this->getText()->key(); 89 | for ($i = 1; $i < $sequence_length; ++$i) { 90 | $this->getText()->offsetUnset($key + $i); 91 | } 92 | 93 | return true; 94 | } 95 | } 96 | 97 | return false; 98 | } 99 | 100 | /** 101 | * Это простое слово. 102 | * 103 | * @param Word $word Слово 104 | * 105 | * @return bool 106 | */ 107 | public function isSimple(Word $word) 108 | { 109 | return in_array($word->getPlain(), $this->simple); 110 | } 111 | 112 | /** 113 | * Это составное слово. 114 | * 115 | * @param Word $word Слово 116 | * 117 | * @return bool 118 | */ 119 | public function isComposite(Word $word) 120 | { 121 | foreach ($this->composite as $reg) { 122 | if (preg_match($reg, $word->getWord())) { 123 | return true; 124 | } 125 | } 126 | 127 | return false; 128 | } 129 | 130 | /** 131 | * Возвращает список слов. 132 | * 133 | * Возвращает список слов которые необходимо удалить или оставить 134 | * Если слово составное и пишестся через тире, но одна из частей может менятся например: 135 | * 136 | * подай-ка, налей-ка, молоко-то сбежало, наценка-с 137 | * 138 | * то нужно писать шаблон вида: 139 | * 140 | * [ '*-ка', '*-то', '*-с' ] 141 | * 142 | * Для удаления последовательности слов ячейка слова должна представляться в виде набора слов разделенных пробелом 143 | * 144 | * [ 'вовсе не', 'несмотря на то что' ] 145 | * 146 | * Так же есть возможность указывать регулярные выражения для отлавливания сложных конструкций 147 | * 148 | * // ААааа Аааа-а-а 149 | * [ '/^а+(\-а+)*$/ui' ] 150 | * 151 | * В регулярное выражение передается оригинальное слово, а не урощенная форма 152 | * 153 | * @return array 154 | */ 155 | abstract public function getWords(); 156 | 157 | /** 158 | * Разбор набора шаблонов слов и составление условий поиска соответствий. 159 | */ 160 | private function repackWordList() 161 | { 162 | $words = $this->getWords(); 163 | // разбор на категории 164 | foreach ($words as $word) { 165 | if ($word[0] == '/') { // регулярное выражение 166 | $this->composite[] = $word; 167 | } elseif (strpos($word, ' ') !== false) { // последовательность 168 | $this->sequence[] = explode(' ', $word); 169 | } elseif (strpos($word, '*') !== false) { // псевдо регулярка 170 | // из записи *-то делаем регулярное выражение вида: /^.+?\-то$/ui 171 | $this->composite[] = '/^'.str_replace('\*', '.+?', preg_quote($word, '/')).'$/ui'; 172 | } else { // простое слово 173 | $this->simple[] = $word; 174 | } 175 | } 176 | } 177 | } 178 | -------------------------------------------------------------------------------- /AnalyzerText/Text.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText; 9 | 10 | use AnalyzerText\Text\Word; 11 | 12 | /** 13 | * Анализируемый текст 14 | * 15 | * Класс используется для абстрагирования мотодов доступа к словами в тексте, предоставляя простой интерфейс 16 | * 17 | * @author Peter Gribanov 18 | */ 19 | class Text extends \ArrayIterator 20 | { 21 | /** 22 | * Спиок всех слов в тексте в простой форме. 23 | * 24 | * @var array 25 | */ 26 | protected $plains = array(); 27 | 28 | /** 29 | * @param string $text 30 | */ 31 | public function __construct($text) 32 | { 33 | $words = array(); 34 | // слово не может начинаться с тире и не может содержать только его 35 | if (preg_match_all('/[[:alnum:]]+(?:[-\'][[:alnum:]]+)*/u', trim(strip_tags($text)), $match)) { 36 | $words = $match[0]; 37 | // получение списка слов в нижнем регистре 38 | $this->plains = explode(' ', mb_strtolower(implode(' ', $words), 'utf8')); 39 | } 40 | parent::__construct($words); 41 | } 42 | 43 | /** 44 | * Возвращает список слов. 45 | * 46 | * @return array 47 | */ 48 | public function getWords() 49 | { 50 | return $this->getArrayCopy(); 51 | } 52 | 53 | /** 54 | * Возвращает текущий элемент 55 | * 56 | * @return Word|null 57 | */ 58 | public function current() 59 | { 60 | return parent::current() ? new Word(parent::current(), $this->plains[$this->key()]) : null; 61 | } 62 | 63 | /** 64 | * @param int $index 65 | * 66 | * @return Word|null 67 | */ 68 | public function offsetGet($index) 69 | { 70 | return $this->offsetExists($index) ? new Word(parent::offsetGet($index), $this->plains[$index]) : null; 71 | } 72 | 73 | /** 74 | * Удаляет слово из текста. 75 | */ 76 | public function remove() 77 | { 78 | $this->offsetUnset($this->key()); 79 | unset($this->plains[$this->key()]); 80 | } 81 | 82 | /** 83 | * Заменяет слово в тексте. 84 | * 85 | * @param Word $word 86 | */ 87 | public function replace(Word $word) 88 | { 89 | $this->offsetSet($this->key(), $word->getWord()); 90 | $this->plains[$this->key()] = $word->getPlain(); 91 | } 92 | 93 | /** 94 | * Возвращает текст 95 | * 96 | * @return string 97 | */ 98 | public function __toString() 99 | { 100 | return implode(' ', $this->getWords()); 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /AnalyzerText/Text/Word.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | 8 | namespace AnalyzerText\Text; 9 | 10 | /** 11 | * Слово в тексте. 12 | * 13 | * @author Peter Gribanov 14 | */ 15 | class Word 16 | { 17 | /** 18 | * Слово в тексте. 19 | * 20 | * @var string 21 | */ 22 | protected $word = ''; 23 | 24 | /** 25 | * Простая форма слова в тексте. 26 | * 27 | * @var string 28 | */ 29 | protected $plain = ''; 30 | 31 | /** 32 | * @param string $word Слово в тексте 33 | * @param string $plain Простая форма слова в тексте 34 | */ 35 | public function __construct($word, $plain) 36 | { 37 | $this->word = $word; 38 | $this->plain = $plain; 39 | } 40 | 41 | /** 42 | * Возвращает слово из текста. 43 | * 44 | * @return string 45 | */ 46 | public function getWord() 47 | { 48 | return $this->word; 49 | } 50 | 51 | /** 52 | * Возвращает простую форму слова из текста. 53 | * 54 | * @return string 55 | */ 56 | public function getPlain() 57 | { 58 | return $this->plain; 59 | } 60 | 61 | /** 62 | * Возвращает слово. 63 | * 64 | * @return string 65 | */ 66 | public function __toString() 67 | { 68 | return $this->word; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Peter Gribanov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Latest Stable Version](https://img.shields.io/packagist/v/gribanov/analyzer-text.svg?maxAge=3600&label=stable)](https://packagist.org/packages/gribanov/analyzer-text) 2 | [![PHP from Travis config](https://img.shields.io/travis/php-v/peter-gribanov/AnalyzerText.svg?maxAge=3600)](https://packagist.org/packages/gribanov/analyzer-text) 3 | [![Build Status](https://img.shields.io/travis/peter-gribanov/AnalyzerText.svg?maxAge=3600)](https://travis-ci.org/peter-gribanov/AnalyzerText) 4 | [![Coverage Status](https://img.shields.io/coveralls/peter-gribanov/AnalyzerText.svg?maxAge=3600)](https://coveralls.io/github/peter-gribanov/AnalyzerText?branch=master) 5 | [![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/peter-gribanov/AnalyzerText.svg?maxAge=3600)](https://scrutinizer-ci.com/g/peter-gribanov/AnalyzerText/?branch=master) 6 | [![StyleCI](https://styleci.io/repos/9087072/shield?branch=master)](https://styleci.io/repos/9087072) 7 | [![License](https://img.shields.io/packagist/l/gribanov/analyzer-text.svg?maxAge=3600)](https://github.com/peter-gribanov/AnalyzerText) 8 | 9 | Анализатор текста 10 | ================= 11 | 12 | Инструмент для анализа произвольного текста и получения из него максимум информации 13 | 14 | Текс 15 | ---- 16 | 17 | Текс в приложени представляется в виде объектна-итератора и соответственно ячейкой итератора является объект слова. 18 | 19 | ```php 20 | $text = '...'; // некоторый текст 21 | $text_obj = new \AnalyzeText\Text($text); 22 | // @var $word \AnalyzeText\Text\Word 23 | $word = $text_obj->current(); 24 | ``` 25 | 26 | Получив слово можно получить как его оригинальную форму так и форму в нижнем регистре для анализа. 27 | 28 | *Текст на входе ожидается в кодировке UTF-8* 29 | 30 | Анализаторы 31 | ----------- 32 | 33 | Для анализа можно использовать предустановленные анализаторы передавая им объект текса. 34 | 35 | * `Frequency` - подсчитывает частоту появления слова в тексте и процентное отнашение частоту появления к самому популярному слову. 36 | 37 | Фильтры 38 | ------- 39 | 40 | Набор фильтров для чистки текста содержащие более чем 3000 слов в библиотеке. 41 | 42 | * `Adverb` - наречия 43 | * `Interjection` - междометья 44 | * `Particle` - частицы 45 | * `Preposition` - предлоги 46 | * `Pronoun` - местоимения 47 | * `Union` - союзы 48 | * `Informative` - информационные слова(фильтрует все описынные выше) 49 | 50 | Использование 51 | ------------- 52 | 53 | Пример реализации анализа естественности текста для SEO оптимизации. 54 | 55 | ```php 56 | $frequency = new Frequency(); 57 | $frequency->setText(new Text($text)); 58 | 59 | // анализируем весь список слов 60 | $graph = array_slice(array_merge_recursive($frequency->getFrequency(), $frequency->getPercent()), 0, 20); 61 | 62 | // фильтруем и получаем только информационные слова 63 | $frequency->applyFilters()->Informative(); 64 | $graph_filter = array_slice(array_merge_recursive($frequency->getFrequency(), $frequency->getPercent()), 0, 20); 65 | ``` 66 | 67 | 68 | 69 | Производительность 70 | 71 | Для анализа производительности использовался следующий код 72 | 73 | ```php 74 | $i = $ii = 1000; 75 | $start = microtime(1); 76 | while ($i--) { 77 | $frequency = new Frequency(); 78 | $frequency->setText(new Text($text))->applyFilters()->Informative(); 79 | $frequency->getFrequency(); 80 | $frequency->getPercent(); 81 | } 82 | echo (microtime(1) - $start) / $ii; 83 | ``` 84 | 85 | Для теста взят текст в 15190 символов, 2707 слов. 86 | 87 | Результат: ~0.29 c. 88 | 89 | Лицензия 90 | -------- 91 | 92 | Этот пакет находится под [лицензией MIT](https://opensource.org/licenses/MIT). Смотрите полную лицензию в файле: LICENSE 93 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gribanov/analyzer-text", 3 | "license": "MIT", 4 | "type": "library", 5 | "description": "Analyzer text", 6 | "homepage": "https://github.com/peter-gribanov/AnalyzerText", 7 | "authors": [ 8 | { 9 | "name": "Peter Gribanov", 10 | "email": "info@peter-gribanov.ru" 11 | } 12 | ], 13 | "autoload": { 14 | "psr-4": { 15 | "AnalyzerText\\": "AnalyzerText/" 16 | } 17 | }, 18 | "autoload-dev": { 19 | "psr-4": { 20 | "AnalyzerText\\Tests\\": "tests/" 21 | } 22 | }, 23 | "require": { 24 | "php": ">=5.3.0" 25 | }, 26 | "require-dev": { 27 | "phpunit/phpunit": "^4.8.36", 28 | "scrutinizer/ocular": "~1.2", 29 | "php-coveralls/php-coveralls": "^1.0" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /example.php: -------------------------------------------------------------------------------- 1 | setText(new Text($text)); 41 | 42 | echo 'Анализируем весь список слов'.PHP_EOL; 43 | print_r(array_slice($frequency->getFrequency(), 0, 20)); 44 | print_r(array_slice($frequency->getPercent(), 0, 20)); 45 | 46 | echo 'Фильтруем и получаем только информационные слова'.PHP_EOL; 47 | $frequency->applyFilters()->Informative(); 48 | print_r(array_slice($frequency->getFrequency(), 0, 20)); 49 | print_r(array_slice($frequency->getPercent(), 0, 20)); 50 | -------------------------------------------------------------------------------- /example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peter-gribanov/AnalyzerText/5e03150c0d0eb8a0ef22f6c84d8441f53750793c/example.png -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 16 | ./tests 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | ./AnalyzerText 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /tests/Analyzer/FrequencyTest.php: -------------------------------------------------------------------------------- 1 | frequency = new Frequency(); 19 | } 20 | 21 | protected function tearDown() 22 | { 23 | $this->frequency->clear(); 24 | } 25 | 26 | public function testGetSetText() 27 | { 28 | $this->assertNull($this->frequency->getText()); 29 | 30 | $text = new Text('foo bar'); 31 | 32 | $this->assertEquals($this->frequency, $this->frequency->setText($text)); 33 | $this->assertEquals($text, $this->frequency->getText()); 34 | } 35 | 36 | /** 37 | * @depends testGetSetText 38 | */ 39 | public function testClear() 40 | { 41 | $this->assertNull($this->frequency->getText()); 42 | 43 | $text = new Text('foo bar'); 44 | $this->frequency->setText($text); 45 | 46 | $this->assertEquals($text, $this->frequency->getText()); 47 | 48 | $this->frequency->clear(); 49 | 50 | $this->assertNull($this->frequency->getText()); 51 | } 52 | 53 | public function testApplyFilters() 54 | { 55 | $this->assertInstanceOf('AnalyzerText\Filter\Factory', $this->frequency->applyFilters()); 56 | } 57 | 58 | /** 59 | * @return array 60 | */ 61 | public function getFrequency() 62 | { 63 | return array( 64 | array('foo Foo FOO bar Bar baz', array( 65 | 'foo' => 3, 66 | 'bar' => 2, 67 | 'baz' => 1, 68 | )), 69 | array('baz FOO bar foo Bar Foo BAZ', array( 70 | 'foo' => 3, 71 | 'bar' => 2, 72 | 'baz' => 2, 73 | )), 74 | ); 75 | } 76 | 77 | /** 78 | * @dataProvider getFrequency 79 | * @depends testGetSetText 80 | * 81 | * @param string $text 82 | * @param array $frequency 83 | */ 84 | public function testGetFrequency($text, $frequency) 85 | { 86 | $text = new Text($text); 87 | $this->frequency->setText($text); 88 | 89 | $this->assertEquals($frequency, $this->frequency->getFrequency()); 90 | } 91 | 92 | /** 93 | * @return array 94 | */ 95 | public function getPercent() 96 | { 97 | return array( 98 | array('foo foo Foo FOO bar Bar baz', array( 99 | 'foo' => 100.0, 100 | 'bar' => 50.0, 101 | 'baz' => 25.0, 102 | )), 103 | array('baz FOO bar foo Bar Foo BAZ foo', array( 104 | 'foo' => 100.0, 105 | 'bar' => 50.0, 106 | 'baz' => 50.0, 107 | )), 108 | ); 109 | } 110 | 111 | /** 112 | * @dataProvider getPercent 113 | * @depends testGetSetText 114 | * 115 | * @param string $text 116 | * @param array $percent 117 | */ 118 | public function testGetPercent($text, $percent) 119 | { 120 | $text = new Text($text); 121 | $this->frequency->setText($text); 122 | 123 | $this->assertEquals($percent, $this->frequency->getPercent()); 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /tests/Filter/FactoryTest.php: -------------------------------------------------------------------------------- 1 | analyzer = new Frequency(); 26 | $this->factory = $this->analyzer->applyFilters(); 27 | } 28 | 29 | protected function tearDown() 30 | { 31 | $this->analyzer->clear(); 32 | } 33 | 34 | public function testUnion() 35 | { 36 | $this->analyzer->setText(new Text('Так словно НиКак')); 37 | $this->factory->Union(); 38 | 39 | $this->assertEquals('Так словно', (string) $this->analyzer->getText()); 40 | } 41 | 42 | public function testPronoun() 43 | { 44 | $this->analyzer->setText(new Text('Я говорю о сЕбе')); 45 | $this->factory->Pronoun(); 46 | 47 | $this->assertEquals('Я сЕбе', (string) $this->analyzer->getText()); 48 | } 49 | 50 | public function testPreposition() 51 | { 52 | $this->analyzer->setText(new Text('Я буду Через час')); 53 | $this->factory->Preposition(); 54 | 55 | $this->assertEquals('Через', (string) $this->analyzer->getText()); 56 | } 57 | 58 | public function testAdverb() 59 | { 60 | $this->analyzer->setText(new Text('аКкуратно распилить')); 61 | $this->factory->Adverb(); 62 | 63 | $this->assertEquals('аКкуратно', (string) $this->analyzer->getText()); 64 | } 65 | 66 | /** 67 | * @return array 68 | */ 69 | public function getInformativeText() 70 | { 71 | return array( 72 | array('Так словно НиКак', ''), 73 | array('Я говорю о сЕбе', 'говорю'), 74 | array('Я буду Через час или два', 'буду час два'), 75 | array('аКкуратно распИлить', 'распИлить'), 76 | array('Аааа-а-а сказал Василичь', 'сказал Василичь'), 77 | array('со всей силы', ''), 78 | array('Петрович ударил со всей силы кулаком по столу', 'Петрович ударил кулаком столу'), 79 | array( 80 | 'Шел дождь и в то же время снег. И тот и другой были крайне неприятными', 81 | 'Шел дождь снег были неприятными', 82 | ), 83 | ); 84 | } 85 | 86 | /** 87 | * @dataProvider getInformativeText 88 | * 89 | * @param string $text 90 | * @param string $expected 91 | */ 92 | public function testInformative($text, $expected) 93 | { 94 | $this->analyzer->setText(new Text($text)); 95 | $this->factory->Informative(); 96 | 97 | $this->assertEquals($expected, (string) $this->analyzer->getText()); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /tests/Text/WordTest.php: -------------------------------------------------------------------------------- 1 | assertEquals('foo', $word->getWord()); 15 | $this->assertEquals('bar', $word->getPlain()); 16 | $this->assertEquals('foo', (string) $word); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tests/TextTest.php: -------------------------------------------------------------------------------- 1 | $word) { 40 | $this->assertInstanceOf('AnalyzerText\Text\Word', $word); 41 | $this->assertInternalType('int', $key); 42 | $this->assertEquals($words[$key], $word->getWord()); 43 | $this->assertEquals(mb_strtolower($words[$key], 'utf8'), $word->getPlain()); 44 | } 45 | 46 | $this->assertEquals($words, $obj->getWords()); 47 | $this->assertEquals(implode(' ', $words), (string) $obj); 48 | } 49 | 50 | public function testRemove() 51 | { 52 | $text = new Text('foo bar baz'); 53 | $text->next(); // go to "bar" 54 | $text->remove(); 55 | 56 | $this->assertEquals('foo baz', (string) $text); 57 | } 58 | 59 | public function testReplace() 60 | { 61 | $text = new Text('foo bar baz'); 62 | $text->next(); // go to "bar" 63 | $text->replace(new Word('Tor', 'tor')); 64 | 65 | $this->assertEquals('Tor', $text->current()->getWord()); 66 | $this->assertEquals('tor', $text->current()->getPlain()); 67 | $this->assertEquals('foo Tor baz', (string) $text); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 |