parent
8abe63b1fc
commit
c94423ace7
@ -0,0 +1,10 @@
|
||||
package org.wlld.naturalLanguage;
|
||||
|
||||
public class IOConst {
|
||||
public static final byte TYPE_Symbol = 0x23;//#号键
|
||||
public static final byte STOP_END = 10;
|
||||
public static final byte STOP_NEXT = 13;
|
||||
public static final byte WIN = 1;//windows系统
|
||||
public static final byte NOT_WIN = 2;//非Windows系统
|
||||
public static final byte CORE_Number = 6;//核心数
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package org.wlld.naturalLanguage;
|
||||
|
||||
public class KeyWord {
|
||||
private Word word;//关键字
|
||||
private boolean isOk;//是否完成此关键字
|
||||
|
||||
public Word getWord() {
|
||||
return word;
|
||||
}
|
||||
|
||||
public void setWord(Word word) {
|
||||
this.word = word;
|
||||
}
|
||||
|
||||
public boolean isOk() {
|
||||
return isOk;
|
||||
}
|
||||
|
||||
public void setOk(boolean ok) {
|
||||
isOk = ok;
|
||||
}
|
||||
}
|
@ -0,0 +1,73 @@
|
||||
package org.wlld.naturalLanguage;
|
||||
|
||||
import org.omg.Messaging.SYNC_WITH_TRANSPORT;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author lidapeng
|
||||
* @description
|
||||
* @date 8:01 上午 2020/2/23
|
||||
*/
|
||||
public class Sentence {
|
||||
private Word firstWord;
|
||||
private List<Word> waitWords = new ArrayList<>();//词
|
||||
private List<String> keyWords;//分词结果下标按照时间序列排序
|
||||
private int key;
|
||||
|
||||
public List<String> getKeyWords() {
|
||||
return keyWords;
|
||||
}
|
||||
|
||||
public void setKeyWords(List<String> keyWords) {
|
||||
this.keyWords = keyWords;
|
||||
}
|
||||
|
||||
public List<Word> getWaitWords() {
|
||||
return waitWords;
|
||||
}
|
||||
|
||||
public Word getFirstWord() {
|
||||
return firstWord;
|
||||
}
|
||||
|
||||
public Sentence() {
|
||||
|
||||
}
|
||||
|
||||
public Sentence(int key) {
|
||||
if (key > -1) {
|
||||
this.key = key;
|
||||
}
|
||||
}
|
||||
|
||||
public int getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
public void setKey(int key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
private void lineWord(Word word, Word wordSon) {//给词连线
|
||||
if (firstWord != null) {
|
||||
if (word.getSon() != null) {//右连接不是空的
|
||||
lineWord(word.getSon(), wordSon);
|
||||
} else {//右连接是空的
|
||||
wordSon.setLv(word.getLv() + 1);
|
||||
word.setSon(wordSon);
|
||||
}
|
||||
} else {
|
||||
firstWord = wordSon;
|
||||
firstWord.setLv(1);
|
||||
}
|
||||
}
|
||||
|
||||
public void setWord(String word) {//编号
|
||||
Word word1 = new Word();
|
||||
word1.setWord(word);
|
||||
lineWord(firstWord, word1);//词之间做连线
|
||||
waitWords.add(word1);
|
||||
}
|
||||
}
|
@ -0,0 +1,81 @@
|
||||
package org.wlld.naturalLanguage;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.*;
|
||||
|
||||
public class TemplateReader {//模板读取类
|
||||
private Map<Integer, List<String>> model = new HashMap<>();//训练模板
|
||||
private String charsetName;
|
||||
|
||||
public void read(String url, String charsetName, byte sys) throws Exception {
|
||||
this.charsetName = charsetName;
|
||||
File file = new File(url);
|
||||
InputStream is = new FileInputStream(file);
|
||||
int i;
|
||||
LinkedList<Byte> span = new LinkedList<>();
|
||||
int hang = 0;
|
||||
int again = 0;
|
||||
int upNub = 0;
|
||||
boolean isSymbol = false;//是否遇到分隔符
|
||||
while ((i = is.read()) > -1) {
|
||||
if (i == IOConst.TYPE_Symbol) {//遇到分隔符号
|
||||
isSymbol = true;
|
||||
} else {
|
||||
if (i == IOConst.STOP_END || i == IOConst.STOP_NEXT) {
|
||||
isSymbol = false;
|
||||
again = again << 1 | 1;
|
||||
if (again == 1) {//第一次进入
|
||||
List<String> lr = model.get(upNub);
|
||||
//addEnd(span);
|
||||
if (lr != null) {
|
||||
lr.add(LinkToString(span));
|
||||
} else {
|
||||
List<String> lis = new ArrayList<>();
|
||||
lis.add(LinkToString(span));
|
||||
model.put(upNub, lis);
|
||||
}
|
||||
upNub = 0;
|
||||
hang++;
|
||||
if (sys != IOConst.WIN) {
|
||||
again = 0;
|
||||
}
|
||||
} else {
|
||||
again = 0;
|
||||
}
|
||||
} else {
|
||||
if (isSymbol) {
|
||||
int type = i;
|
||||
if (type >= 48 && type <= 57) {
|
||||
type = type - 48;
|
||||
if (upNub == 0) {
|
||||
upNub = type;
|
||||
} else {
|
||||
upNub = upNub * 10 + type;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
span.add((byte) i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
word();
|
||||
}
|
||||
|
||||
public void word() {
|
||||
Tokenizer tokenizer = new Tokenizer();
|
||||
tokenizer.start(model);
|
||||
}
|
||||
|
||||
public String LinkToString(LinkedList<Byte> mod) throws UnsupportedEncodingException {
|
||||
int b = mod.size();
|
||||
byte[] be = new byte[b];
|
||||
for (int i = 0; i < b; i++) {
|
||||
be[i] = mod.poll();
|
||||
}
|
||||
return new String(be, charsetName);
|
||||
}
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
package org.wlld.naturalLanguage;
|
||||
|
||||
|
||||
public class Word {
|
||||
private String word;
|
||||
private Word son;
|
||||
private int wordFrequency;//词频
|
||||
private int lv;//该词的时间序列
|
||||
|
||||
public int getLv() {
|
||||
return lv;
|
||||
}
|
||||
|
||||
public void setLv(int lv) {
|
||||
this.lv = lv;
|
||||
}
|
||||
|
||||
public String getWord() {
|
||||
return word;
|
||||
}
|
||||
|
||||
public void setWord(String word) {
|
||||
this.word = word;
|
||||
}
|
||||
|
||||
public Word getSon() {
|
||||
return son;
|
||||
}
|
||||
|
||||
public void setSon(Word son) {
|
||||
this.son = son;
|
||||
}
|
||||
|
||||
public int getWordFrequency() {
|
||||
return wordFrequency;
|
||||
}
|
||||
|
||||
public void setWordFrequency(int wordFrequency) {
|
||||
this.wordFrequency = wordFrequency;
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package org.wlld.naturalLanguage;
|
||||
|
||||
public class WordConst {
|
||||
public static double Word_Noise = 0.7;//收缩程度
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package org.wlld.naturalLanguage;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author lidapeng
|
||||
* @description分词模版
|
||||
* @date 4:15 下午 2020/2/23
|
||||
*/
|
||||
public class WordTemple {
|
||||
private static WordTemple Word_Temple = new WordTemple();
|
||||
private List<Sentence> sentences = new ArrayList<>();//所有断句
|
||||
private List<WorldBody> allWorld = new ArrayList<>();//所有词集合
|
||||
|
||||
private WordTemple() {
|
||||
}
|
||||
|
||||
public static WordTemple get() {
|
||||
return Word_Temple;
|
||||
}
|
||||
|
||||
public List<Sentence> getSentences() {
|
||||
return sentences;
|
||||
}
|
||||
|
||||
public void setSentences(List<Sentence> sentences) {
|
||||
this.sentences = sentences;
|
||||
}
|
||||
|
||||
public List<WorldBody> getAllWorld() {
|
||||
return allWorld;
|
||||
}
|
||||
|
||||
public void setAllWorld(List<WorldBody> allWorld) {
|
||||
this.allWorld = allWorld;
|
||||
}
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package org.wlld.naturalLanguage;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class WorldBody {
|
||||
private String wordName;//词
|
||||
private int wordFrequency;//词频
|
||||
private List<WorldBody> worldBodies;//辐射集合
|
||||
private Word word;
|
||||
private int type = 0;
|
||||
|
||||
public String getWordName() {
|
||||
return wordName;
|
||||
}
|
||||
|
||||
public void setWordName(String wordName) {
|
||||
this.wordName = wordName;
|
||||
}
|
||||
|
||||
public int getWordFrequency() {
|
||||
return wordFrequency;
|
||||
}
|
||||
|
||||
public void addNub(int type) {
|
||||
if (this.type != 0) {
|
||||
this.type = type;
|
||||
}
|
||||
wordFrequency++;
|
||||
}
|
||||
|
||||
public List<WorldBody> getWorldBodies() {
|
||||
return worldBodies;
|
||||
}
|
||||
|
||||
public void setWorldBodies(List<WorldBody> worldBodies) {
|
||||
this.worldBodies = worldBodies;
|
||||
}
|
||||
|
||||
public Word getWord() {
|
||||
return word;
|
||||
}
|
||||
|
||||
public void setWord(Word word) {
|
||||
this.word = word;
|
||||
}
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
package org.wlld.tools;
|
||||
|
||||
public abstract class Frequency {//统计频数
|
||||
|
||||
public double average(double... m) {//计算平均值
|
||||
int len = m.length;
|
||||
double allNub = 0;
|
||||
for (int i = 0; i < len; i++) {
|
||||
allNub = allNub + m[i];
|
||||
}
|
||||
allNub = ArithUtil.div(allNub, len);
|
||||
return allNub;
|
||||
}
|
||||
|
||||
public double getPointLength(double x, double y, double i, double j) {//获取两个二维坐标之间的欧式距离
|
||||
return Math.sqrt(ArithUtil.add(Math.pow(ArithUtil.sub(x, i), 2), Math.pow(ArithUtil.sub(y, j), 2)));
|
||||
}
|
||||
|
||||
public double variance(double... m) {//计算方差
|
||||
double ave = average(m);//先计算出平均值
|
||||
double allNub = 0;
|
||||
for (int i = 0; i < m.length; i++) {
|
||||
allNub = allNub + Math.pow(m[i] - ave, 2);
|
||||
}
|
||||
double var = ArithUtil.div(allNub, m.length);
|
||||
return var;
|
||||
}
|
||||
|
||||
public double sd(double... m) {//计算标准差
|
||||
double var = variance(m);
|
||||
return Math.sqrt(var);
|
||||
}
|
||||
|
||||
public double dc(double... m) {//计算离散系数
|
||||
double ave = average(m);//先计算出平均值
|
||||
double allNub = 0;
|
||||
for (int i = 0; i < m.length; i++) {
|
||||
allNub = allNub + Math.pow(m[i] - ave, 2);
|
||||
}
|
||||
double dc = ArithUtil.div(Math.sqrt(ArithUtil.div(allNub, m.length)), ave);//离散系数
|
||||
return dc;
|
||||
}
|
||||
|
||||
public double softMax(int t, double... m) {//下标和数组
|
||||
double my = Math.exp(m[t]);
|
||||
double all = 0.0;
|
||||
int allLength = m.length;
|
||||
for (int i = 0; i < allLength; i++) {
|
||||
all = all + Math.exp(m[i]);
|
||||
}
|
||||
return ArithUtil.div(my, all);
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package org.wlld;
|
||||
|
||||
import org.wlld.naturalLanguage.IOConst;
|
||||
import org.wlld.naturalLanguage.Talk;
|
||||
import org.wlld.naturalLanguage.TemplateReader;
|
||||
|
||||
/**
|
||||
* @author lidapeng
|
||||
* @description
|
||||
* @date 2:07 下午 2020/2/23
|
||||
*/
|
||||
public class LangTest {
|
||||
public static void main(String[] args) throws Exception {
|
||||
test();
|
||||
}
|
||||
|
||||
public static void test() throws Exception {
|
||||
TemplateReader templateReader = new TemplateReader();
|
||||
templateReader.read("/Users/lidapeng/Desktop/myDocment/a.txt", "UTF-8", IOConst.NOT_WIN);
|
||||
Talk talk = new Talk();
|
||||
talk.talk("我要吃面包");
|
||||
}
|
||||
}
|
Loading…
Reference in new issue