diff --git a/app/Events/ExtractKeywordsEvent.php b/app/Events/ExtractKeywordsEvent.php new file mode 100644 index 0000000..79743d0 --- /dev/null +++ b/app/Events/ExtractKeywordsEvent.php @@ -0,0 +1,33 @@ +params = $params; + } + + /** + * Get the channels the event should be broadcast on. + * + * @return array + */ + public function broadcastOn() + { + return []; + } +} diff --git a/app/Helpers/ExtractKeywords.php b/app/Helpers/ExtractKeywords.php new file mode 100644 index 0000000..6d19186 --- /dev/null +++ b/app/Helpers/ExtractKeywords.php @@ -0,0 +1,23 @@ +params; + + $type = $params['type']; + $content = $params['content']; + $id = $params['id']; + + try { + switch ($type) { + case 1: + $this->storeTimelineKeywords($content, $id); + break; + case 2: + $this->storeTopicKeywords($content, $id); + break; + } + } catch (Exception $e) { + \Log::error($e->getMessage()); + } + } + + private function storeTimelineKeywords($content, $id) + { + $keywords = \App\Helpers\ExtractKeywords::getKeywords($content); + + foreach ($keywords as $keyword => $score) { + $timelineKeyword = new TimelineKeyWords; + $timelineKeyword->timeline_id = $id; + $timelineKeyword->keyword = $keyword; + $timelineKeyword->score = $score; + $timelineKeyword->save(); + } + } + + private function storeTopicKeywords($content, $id) + { + $keywords = \App\Helpers\ExtractKeywords::getKeywords($content); + + foreach ($keywords as $keyword => $score) { + $topicKeyword = new TopicKeywords; + $topicKeyword->topic_id = $id; + $topicKeyword->keyword = $keyword; + $topicKeyword->score = $score; + $topicKeyword->save(); + } + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 316e331..bb0afab 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -16,6 +16,9 @@ class EventServiceProvider extends ServiceProvider 'App\Events\TriggerNoticeEvent' => [ 'App\Listeners\TriggerNoticeListener', ], + 'App\Events\ExtractKeywordsEvent' => [ + 'App\Listeners\ExtractKeywordsListener', + ], ]; /** diff --git a/app/TimelineKeywords.php b/app/TimelineKeywords.php new file mode 100644 index 0000000..8377fc9 --- /dev/null +++ b/app/TimelineKeywords.php @@ -0,0 +1,16 @@ +belongsToMany(Timeline::clsss , 'timeline_keywords', 'timeline_id', 'timeline_keyword_id'); + } +} diff --git a/app/TopicKeywords.php b/app/TopicKeywords.php new file mode 100644 index 0000000..02cea96 --- /dev/null +++ b/app/TopicKeywords.php @@ -0,0 +1,16 @@ +belongsToMany(Timeline::clsss , 'timeline_keywords', 'timeline_id', 'timeline_keyword_id'); + } +} diff --git a/composer.json b/composer.json index 21ea86c..ca58e9c 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,8 @@ "zgldh/qiniu-laravel-storage": "^0.6.2", "jpush/jpush": "v3.5.*", "barryvdh/laravel-cors": "^0.8.6", - "asm89/stack-cors": "^1.0.0" + "asm89/stack-cors": "^1.0.0", + "fukuball/jieba-php": "dev-master" }, "require-dev": { "fzaninotto/faker": "~1.4", diff --git a/composer.lock b/composer.lock index e1b097f..c1b9016 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "fdf4517378636b3936ba961b87b3c9a5", + "content-hash": "f80ee52e8d74c59eb07224921d4cc767", "packages": [ { "name": "alchemy/binary-driver", @@ -588,6 +588,56 @@ ], "time": "2012-11-02T14:49:47+00:00" }, + { + "name": "fukuball/jieba-php", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/fukuball/jieba-php.git", + "reference": "8668b7b1a58bb167c52ff3ef24b7839e5ad4a4d7" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/fukuball/jieba-php/8668b7b1a58bb167c52ff3ef24b7839e5ad4a4d7.zip", + "reference": "8668b7b1a58bb167c52ff3ef24b7839e5ad4a4d7", + "shasum": "" + }, + "require": { + "php": ">= 5.3" + }, + "require-dev": { + "phpunit/phpunit": "4.4.1", + "satooshi/php-coveralls": "dev-master", + "squizlabs/php_codesniffer": "1.5.6" + }, + "type": "library", + "autoload": { + "files": [ + "src/class/Jieba.php", + "src/class/JiebaAnalyse.php", + "src/class/Finalseg.php", + "src/class/Posseg.php", + "src/vendor/multi-array/MultiArray.php", + "src/vendor/multi-array/Factory/MultiArrayFactory.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "fukuball", + "email": "fukuball@gmail.com" + } + ], + "description": "結巴中文分詞(PHP 版本):做最好的 PHP 中文分詞、中文斷詞組件", + "keywords": [ + "Jieba", + "php" + ], + "time": "2017-05-06 15:20:05" + }, { "name": "guzzlehttp/guzzle", "version": "6.2.3", @@ -4842,7 +4892,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "fukuball/jieba-php": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/database/migrations/2017_05_13_021718_create_timeline_keywords_table.php b/database/migrations/2017_05_13_021718_create_timeline_keywords_table.php new file mode 100644 index 0000000..fc1cdc7 --- /dev/null +++ b/database/migrations/2017_05_13_021718_create_timeline_keywords_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->integer('timeline_id')->index()->unsigned(); + $table->string('keyword')->comment('关键词'); + $table->double('score')->comment('权重'); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('timeline_keywords'); + } +} diff --git a/database/migrations/2017_05_13_021853_create_topic_keywords_table.php b/database/migrations/2017_05_13_021853_create_topic_keywords_table.php new file mode 100644 index 0000000..42b38a5 --- /dev/null +++ b/database/migrations/2017_05_13_021853_create_topic_keywords_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->integer('topic_id')->index()->unsigned(); + $table->string('keyword')->comment('关键词'); + $table->double('score')->comment('权重'); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('topic_keywords'); + } +}