package org.wlld.naturalLanguage.languageCreator;
import org.wlld.entity.DyStateModel;
import org.wlld.entity.KeyWordForSentence;
import org.wlld.gameRobot.Action;
import org.wlld.gameRobot.DynamicProgramming;
import org.wlld.gameRobot.DynamicState;
import java.util.*;
public class CatchKeyWord {//抓取关键词
private DynamicProgramming dynamicProgramming = new DynamicProgramming();//保存它的状态集合
private List<String> keyWords = new ArrayList<>();//保存词列表
private List<String> finishWords = new ArrayList<>();//终结态词集合
private Set<String> noList = new HashSet<>();//禁止词集合
private double proTh = 0.1;//收益阈值
public void setProTh(double proTh) {
this.proTh = proTh;
}
public void study(List<KeyWordForSentence> keyWordForSentenceList) {
int size = keyWordForSentenceList.size();
List<DynamicState> dynamicStateList = dynamicProgramming.getDynamicStateList();
DynamicState dynamicState0 = new DynamicState(new int[]{0});
dynamicState0.setFinish(true);
dynamicStateList.add(dynamicState0);
for (int i = 0; i < size; i++) {//添加禁止词
KeyWordForSentence keyWords = keyWordForSentenceList.get(i);
noList.add(keyWords.getKeyWord());
}
for (int i = 0; i < size; i++) {
KeyWordForSentence keyWords = keyWordForSentenceList.get(i);
String sentence = keyWords.getSentence();//句子
String keyWord = keyWords.getKeyWord();//关键词
int startIndex = getIndex(sentence, keyWord);
if (startIndex >= 0) {
creatID(sentence, startIndex, startIndex + keyWord.length() - 1);
}
}
Map<Integer, Action> actionMap = dynamicProgramming.getActionMap();
WordRight wordRight = new WordRight(keyWords, finishWords);
WordLeft wordLeft = new WordLeft(keyWords, finishWords);
wordRight.setActionId(1);
wordLeft.setActionId(2);
actionMap.put(1, wordRight);
actionMap.put(2, wordLeft);
dynamicProgramming.gameStart();//探索中奖
dynamicProgramming.strategyStudy();//研究策略中奖
}
private WordsValue isContinuity(int start1, int end1, int start2, int end2) {
boolean isContinuity = false;
WordsValue wordsValue = null;
if (end1 + 1 == start2 || end2 + 1 == start1) {//相接
isContinuity = true;
} else if ((start2 >= start1 && start2 <= end1) || (end2 >= start1 && end2 <= end1) ||
(start1 >= start2 && start1 <= end2) || (end1 >= start2 && end1 <= end2)) {//相交
isContinuity = true;
}
if (isContinuity) {
wordsValue = new WordsValue();
wordsValue.isMerge = false;
if (start1 > start2) {
wordsValue.startIndex = start2;
} else {
wordsValue.startIndex = start1;
}
if (end1 > end2) {
wordsValue.endIndex = end1;
} else {
wordsValue.endIndex = end2;
}
}
return wordsValue;
}
private void mergeWord(List<WordsValue> myDyList) {//合并状态
for (int i = 0; i < myDyList.size(); i++) {
WordsValue dynamicState = myDyList.get(i);
if (!dynamicState.isMerge) {
for (int j = 0; j < myDyList.size(); j++) {
if (j != i) {
int startIndex = dynamicState.startIndex;//开始下标
int endIndex = dynamicState.endIndex;//结束下标
boolean isFinish = dynamicState.isFinish;
double value = dynamicState.value;
WordsValue dynamic = myDyList.get(j);
int myStart = dynamic.startIndex;
int myEnd = dynamic.endIndex;
WordsValue wordsValue = isContinuity(startIndex, endIndex, myStart, myEnd);
if (wordsValue != null) {//可进行合并
dynamic.isMerge = true;
if (isFinish || dynamic.isFinish) {
wordsValue.isFinish = true;
} else {
wordsValue.isFinish = false;
}
if (wordsValue.isFinish) {
wordsValue.value = 10;
} else {
if (dynamic.value > value) {
wordsValue.value = dynamic.value;
} else {
wordsValue.value = value;
}
}
dynamicState = wordsValue;
}
}
}
myDyList.set(i, dynamicState);//替换合并后的结果
}
}
for (int i = 0; i < myDyList.size(); i++) {
if (myDyList.get(i).isMerge) {
myDyList.remove(i);
i--;
}
}
}
public KeyWordModel getModel() {
KeyWordModel keyWordModel = new KeyWordModel();
List<DyStateModel> dyStateModels = new ArrayList<>();
List<DynamicState> dynamicStateList = dynamicProgramming.getDynamicStateList();
int size = dynamicStateList.size();
for (int i = 0; i < size; i++) {
DynamicState dynamicState = dynamicStateList.get(i);
DyStateModel dyStateModel = new DyStateModel();
dyStateModel.setId(dynamicState.getStateId()[0]);
dyStateModel.setFinish(dynamicState.isFinish());
dyStateModel.setValue(dynamicState.getValue());
dyStateModels.add(dyStateModel);
}
keyWordModel.setDynamicStateList(dyStateModels);
keyWordModel.setKeyWords(keyWords);
return keyWordModel;
}
public void insertModel(KeyWordModel keyWordModel) {
List<String> myKeyWords = keyWordModel.getKeyWords();
List<DyStateModel> dynamicStates = keyWordModel.getDynamicStateList();
List<DynamicState> dynamicStateList = dynamicProgramming.getDynamicStateList();
int size = myKeyWords.size();
for (int i = 0; i < size; i++) {
keyWords.add(myKeyWords.get(i));
}
int s = dynamicStates.size();
for (int i = 0; i < s; i++) {
DyStateModel modelDy = dynamicStates.get(i);
DynamicState dynamicState = new DynamicState(new int[]{modelDy.getId()});
dynamicState.setValue(modelDy.getValue());
dynamicState.setFinish(modelDy.isFinish());
dynamicStateList.add(dynamicState);
}
}
private void insertValue(WordsValue wordsValue, DynamicState dynamicState, int startIndex, int endIndex) {//传输数值
wordsValue.isFinish = dynamicState.isFinish();
wordsValue.value = dynamicState.getValue();
wordsValue.startIndex = startIndex;
wordsValue.endIndex = endIndex;
wordsValue.id = dynamicState.getStateId()[0];
wordsValue.isMerge = false;
}
private List<WordsValue> getBestDyRight(String sentence) {
List<WordsValue> myDyList = new ArrayList<>();
List<DynamicState> dynamicStateList = dynamicProgramming.getDynamicStateList();
int size = sentence.length() - 1;
for (int i = size; i >= 0; i--) {
WordsValue maxDy = null; //0,1,2,3
for (int j = i; j >= 0; j--) {//我是好人
String word = sentence.substring(j, i + 1);//对该词进行收益判定
DynamicState dynamicState = getDynamicState(word, dynamicStateList);
if (dynamicState != null && dynamicState.getValue() > proTh) {