Stream 프로 그래 밍 의 N - gram 구현
package nlp.ngram;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Ngram {
private static Map trainingData;
static {
String path = ".zhuxian.txt";
trainingData = initTrainingData(path);// ,
}
/**
*
* @param sentence
* @param n N-gram N
* @return
*/
private static float getProbability(String sentence, int n) {
final String sen = "@" + sentence + "#";
return Stream
.iterate(0, i -> ++i)
.limit(sen.length() - n + 1)
.map(start -> sen.substring(start, start + n))
.map(s -> {
float nu = (float) (null == trainingData.get(s) ? 1 : trainingData.get(s).get() + 1);
float de = (float) (null == trainingData.get(s.substring(0, s.length() - 1)) ? 1 : trainingData.get
(s.substring(0, s.length() - 1)).get() + 1);
System.out.println(s + "/" + s.substring(0, s.length() - 1) + " " + nu / de);
return nu / de;
})
.reduce(1f, (f1, f2) -> f1 * f2);
}
/**
* ,
* @param path
* @return map
*/
private static Map initTrainingData(String path) {
return readFileOrDir(path)
.map(s -> s.replaceAll("[”“\\w\\s《》.::*‘’、\"<>\\[\\]^`~]", ""))// ,
.flatMap(s -> Stream.of(s.split("[,,。;;!!??]")))//
.filter(s -> !"".equals(s))//
// .peek(System.out::println)
.map(s -> "@" + s + "#")//
.flatMap(s -> Stream
.iterate(1, i -> ++i)// N-gram N 1、2、3、4
.limit(s.length() > 4 ? 4 : s.length())//N-gram N 4, , 4
.parallel()
.flatMap(n -> Stream
.iterate(0, i -> ++i)
.limit(s.length() - n + 1)
.parallel()
.map(start -> s.substring(start, start + n))// n
)
)
.collect(Collectors.toConcurrentMap(o -> o,
o -> new AtomicInteger(1), (e1, e2) -> {
e1.incrementAndGet();
return e1;
}));
}
/**
* ,
* @param path
* @return Stream lines
*/
private static Stream readFileOrDir(String path) {
File file = new File(path);
if (file.isDirectory()) {
String[] paths = file.list((dir, name) -> !name.startsWith("."));
assert paths != null;
return Arrays.stream(paths)
.flatMap(p -> readFileOrDir(path + File.separator + p));
} else {
try {
return new BufferedReader(new java.io.FileReader(path)).lines();
} catch (Exception e) {
System.err.println("read file " + path + " error!" + e.getMessage());
return Stream.empty();
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.lines().forEach(s -> System.out.println(getProbability(s, 3)));
}
}
여기 서 자바 스 트림 프로 그래 밍 을 사용 하면 코드 의 양 을 크게 줄 일 수 있 습 니 다. 한 방법 으로 언어 자 료 를 처리 할 수 있 습 니 다. 한 방법 으로 확률 을 계산 하면 끝 납 니 다. cpu 밀집 형 작업 에 대해 서 는 다 중 스 레 드 (parallel) 로 처리 속 도 를 가속 화 할 수 있 지만 동시에 발생 하 는 구 덩이 는 스스로 채 워 야 합 니 다.여기 서 의 실현 은 상당 한 기초 가 있 고 단어 가 없 으 면 정확성 이 많이 낮 을 것 이 며 최적화 할 수 있 는 공간 이 매우 크다. 그리고 데이터 의 부 드 러 운 (smoothing) 처 리 는 여기 서 토론 을 하지 않 는 다. 여기 서 의 실현 은 나타 나 지 않 은 단어 가 나타 나 는 횟수 를 간단하게 1 로 설정 하고 실제 사용 할 때 실제 디자인 데이터 의 부 드 러 운 알고리즘 을 결합 시 켜 최적화 된 부분 을 다시 채 울 시간 이 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.