Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/backend/emolog add #42

Merged
merged 5 commits into from
Aug 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/main/java/com/example/demo/DemoApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;


//public class DemoApplication implements CommandLineRunner {
@SpringBootApplication
@EnableScheduling
public class DemoApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
Expand Down
33 changes: 33 additions & 0 deletions src/main/java/com/example/demo/ScheduledTasks.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.example.demo;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.example.demo.service.EmologService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Autowired
EmologService emologService;

// @Scheduled
// fixedDelay: taskの実行完了時点から指定時間後に次のtaskを実行する. 単位はms.
// fixedRate: taskの実行開始時点から指定時間後に次のtaskを実行する. 単位はms.
// initialDelay: 指定時間後に最初のtaskを開始する. 単位はms. fixedDelay又はfixedRateと組み合わせて使用する.
// cron: cronで指定した周期でtaskを実行する.
// zone: cronの起動時間のタイムゾーンを指定する. 未指定時はデフォルトのtimezoneを使用する.
@Scheduled(fixedRate = 30000)
public void createEmolog() throws ParseException {
emologService.createEmolog();
}
}
151 changes: 151 additions & 0 deletions src/main/java/com/example/demo/common/EmologOutput.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
package com.example.demo.common;

import com.ibm.cloud.sdk.core.security.IamAuthenticator;
import com.ibm.watson.natural_language_understanding.v1.NaturalLanguageUnderstanding;
import com.ibm.watson.natural_language_understanding.v1.model.*;
import com.ibm.watson.visual_recognition.v3.VisualRecognition;
import com.ibm.watson.visual_recognition.v3.model.*;
import com.vdurmont.emoji.Emoji;
import com.vdurmont.emoji.EmojiManager;
import org.apache.commons.lang3.StringUtils;
import twitter4j.*;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

public class EmologOutput {

/** text to keyword
//input: (username, tweet_id)
//output: ArrayList keywords
*/
public List<String> calcNLUKeywords(String username, long tweet_id) throws TwitterException, FileNotFoundException {
QueryResult result = querySearch(username, tweet_id);
ArrayList<String> textKeywords = new ArrayList<>();
ArrayList<String> imageKeywords = new ArrayList<>();
ArrayList<String> keywords = new ArrayList<>();

for (Status status : result.getTweets()) {
if(status.getMediaEntities().length > 0) {
String tmp = watsonImage(status.getMediaEntities()[0].getMediaURL());
if (!StringUtils.isBlank(tmp)) {
// System.out.println(tmp);
imageKeywords.add(tmp);
keywords.add(tmp);
}
}
String tmp = watsonNLU(status.getText());
if(!StringUtils.isBlank(tmp)) {
// System.out.println(tmp);
textKeywords.add(tmp);
keywords.add(tmp);
}
}
return keywords;
}


/** ユーザ名とidからツイート検索
//input: String username
//input: long tweet_id
//output: QueryResult
*/
private QueryResult querySearch(String username, long tweet_id) throws TwitterException {
// 初期化
Twitter twitter = new TwitterFactory().getInstance();
Query query = new Query();

//ユーザーネームで指定.sinceId以降のtweetから15個取ってくる.最新のツイートから時系列順に取ってくるっぽい。
query.setQuery("from:" + username);
query.setSinceId(tweet_id);

return twitter.search(query);
}


/** 文字列からキーワードを抽出する
//input: String text
//output: String keyword
*/
private String watsonNLU(String text) {
IamAuthenticator authenticator = new IamAuthenticator("fVfaYMA7tCh4zInWBhTBb5t69xQryK7ObKl42nampynG");
NaturalLanguageUnderstanding naturalLanguageUnderstanding = new NaturalLanguageUnderstanding("2019-07-12", authenticator);
naturalLanguageUnderstanding.setServiceUrl("https://api.jp-tok.natural-language-understanding.watson.cloud.ibm.com/instances/ac3df365-93f6-4255-beb8-620d66041251");

CategoriesOptions categories= new CategoriesOptions.Builder()
.limit(3)
.build();

Features features = new Features.Builder()
.categories(categories)
.build();

AnalyzeOptions parameters = new AnalyzeOptions.Builder()
.text(text)
.features(features)
.build();

AnalysisResults response = naturalLanguageUnderstanding
.analyze(parameters)
.execute()
.getResult();
List<String> resultCategories = new ArrayList<>();
for (CategoriesResult r : response.getCategories()) {
if (r.getScore() > 0.7) {
String[] splitword = r.getLabel().split("/");
resultCategories.add(splitword[splitword.length - 1]);
}
}
// return resultCategories.toString();
return response.getCategories().get(0).getLabel();
}

//
/** 画像urlからキーワードを抽出する
//input: String imageUrl
//output: String keyword
*/
private String watsonImage(String url) throws FileNotFoundException {
IamAuthenticator authenticator = new IamAuthenticator("8nwN0eKp7eZ73So4DLdPndp_yv-vtlI27pN1wK2TjVg1");
VisualRecognition visualRecognition = new VisualRecognition("2019-07-12", authenticator);

ClassifyOptions options = new ClassifyOptions.Builder()
.url(url)
.build();
ClassifiedImages result = visualRecognition.classify(options).execute().getResult();
System.out.println(result);

List<ClassifiedImage> images = result.getImages();

ClassifiedImage image = images.get(0);
ClassifierResult r = image.getClassifiers().get(0);
ClassResult c = r.getClasses().get(0);
return c.getXClass();
}


/** emoji-javaを使ってキーワードから絵文字に変換
//input: String keyword
//output: emoji (Unicode)
*/
public String convertEmoji(String keyword) {
keyword = keyword.replace(" ", "_"); //空白を_に置換
keyword = ":" + keyword + ":";
Emoji emoji;
try {
emoji = EmojiManager.getForAlias(keyword);
System.out.println(emoji);
return emoji.getUnicode();
} catch(java.lang.NullPointerException n) {
//キーワードがエイリアスとして存在していないときは?を返す
System.out.println(n);
emoji = EmojiManager.getForAlias("grey_question");
return emoji.getUnicode();
}
}
}




Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.example.demo.controller;

import com.example.demo.entity.Emolog;
import com.example.demo.entity.Friend;
import com.example.demo.entity.Sample;
import com.example.demo.service.EmologService;
import com.example.demo.service.FriendService;
import com.example.demo.service.SampleService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
Expand All @@ -23,12 +25,17 @@ public class EmologController {
@Autowired
EmologService service;

@Autowired
FriendService friendService;

@RequestMapping(value="/{userid}/{friendid}",method=RequestMethod.GET)
public String selectAll(@PathVariable("userid") String userid, @PathVariable("friendid") String friendid, Model model) {
int userId = Integer.parseInt(userid);
int friendId = Integer.parseInt(friendid);
List<Emolog> emologs = service.selectAll(userId, friendId);
Friend friend = friendService.select(userId, friendId);
model.addAttribute("emologs", emologs);
model.addAttribute("friend", friend);
return "emologlist";
}

Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/example/demo/dao/EmologDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.example.demo.entity.Emolog;
import com.example.demo.entity.Sample;
import org.seasar.doma.BatchInsert;
import org.seasar.doma.Dao;
import org.seasar.doma.Insert;
import org.seasar.doma.Select;
Expand All @@ -27,4 +28,7 @@ public interface EmologDao {

@Insert
int insert(Emolog e);

@BatchInsert
int[] insertAll(List<Emolog> e);
}
11 changes: 11 additions & 0 deletions src/main/java/com/example/demo/dao/FriendDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import com.example.demo.entity.Emolog;
import com.example.demo.entity.Friend;
import org.seasar.doma.BatchUpdate;
import org.seasar.doma.Dao;
import org.seasar.doma.Select;
import org.seasar.doma.Update;
import org.seasar.doma.boot.ConfigAutowireable;

import java.util.List;
Expand All @@ -14,4 +16,13 @@ public interface FriendDao {

@Select
List<Friend> selectAll(int userid);

@Select
List<Friend> selectAllRecord();

@BatchUpdate
int[] updateAll(List<Friend> friends);

@Select
Friend select(int userid, int friendid);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.example.demo.dao.SampleDao;
import com.example.demo.entity.Emolog;
import com.example.demo.entity.Sample;
import org.seasar.doma.BatchInsert;
import org.seasar.doma.Insert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
Expand Down Expand Up @@ -35,4 +36,9 @@ public Emolog selectByDay(int userid, int friendid, LocalDateTime created_at){
public int insert(Emolog e) {
return dao.insert(e);
}

@BatchInsert
public int[] insertAll(List<Emolog> emologs){
return dao.insertAll(emologs);
}
}
14 changes: 14 additions & 0 deletions src/main/java/com/example/demo/repository/FriendRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.example.demo.dao.FriendDao;
import com.example.demo.entity.Friend;
import org.seasar.doma.BatchUpdate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

Expand All @@ -16,4 +17,17 @@ public class FriendRepository {
public List<Friend> selectAll(int user) { // (4)
return dao.selectAll(user);
}

public List<Friend> selectAllRecord(){
return dao.selectAllRecord();
}

@BatchUpdate
public int[] updateAll(List<Friend> friends){
return dao.updateAll(friends);
}

public Friend select(int userid, int friendid){
return dao.select(userid, friendid);
}
}
47 changes: 36 additions & 11 deletions src/main/java/com/example/demo/service/EmologService.java
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
package com.example.demo.service;

import com.example.demo.entity.Emolog;
import com.example.demo.entity.Sample;
import com.example.demo.entity.Friend;
import com.example.demo.repository.EmologRepository;
import com.example.demo.repository.SampleRepository;
import com.example.demo.repository.FriendRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;

import com.example.demo.entity.Emolog;

@Service
public class EmologService {

@Autowired
EmologRepository repository;
EmologRepository emologRepository;

@Autowired
FriendRepository friendRepository;


public Emolog selectById(int friendemologId){
return repository.selectById(friendemologId);
Expand All @@ -31,7 +30,7 @@ public Emolog selectByDay(Emolog friendEmolog){
}

public List<Emolog> selectAll(int user, int friend){
return repository.selectAll(user, friend);
return emologRepository.selectAll(user, friend);
}

public List<Emolog> insert(int user, int friend, String contents) throws ParseException {
Expand All @@ -42,8 +41,34 @@ public List<Emolog> insert(int user, int friend, String contents) throws ParseEx
LocalDateTime created_at = LocalDateTime.now();
e.setCreated_at(created_at);
e.setContents(contents);
repository.insert(e);
return repository.selectAll(user, friend);
emologRepository.insert(e);
return emologRepository.selectAll(user, friend);
}

public void createEmolog() throws ParseException {
List<Friend> friends = friendRepository.selectAllRecord();

//TODO ここにEmolog生成処理記述
List<Emolog> newEmologs = new ArrayList<Emolog>();
LocalDateTime created_at = LocalDateTime.now();
int count = 0;
for (Friend friend : friends) {
String emologStr = "/*[ ここにEmologを生成する処理 ]*/";
friend.setLatestemolog(emologStr);
friend.setUpdated_at(created_at);
Emolog e = new Emolog();
e.setContents(emologStr);
e.setFriendid(friend.getId());
e.setUserid(friend.getUserid());
e.setCreated_at(created_at);
e.setId((int) Calendar.getInstance().getTimeInMillis() + count);
newEmologs.add(e);
count++;
}

friendRepository.updateAll(friends);
emologRepository.insertAll(newEmologs);

}

}
Loading