맞 춤 법 검사 기(자바 버 전)를 어떻게 씁 니까?
http://blog.youxu.info/spell-correct.html
전체 맞 춤 법 검사 기의 기 초 는 베 이 루스 확률 모델 이다.
나 는 간단하게 그것 의 작업 원 리 를 소개 합 니 다.단 어 를 정 하 는 것 입 니 다.우리 의 임 무 는 그것 과 가장 비슷 한 맞 춤 법 이 정확 한 단 어 를 선택 하 는 것 입 니 다.(이 단어 자체 가 맞 춤 법 이 맞다 면 가장 비슷 한 것 은 바로 그것 자신 입 니 다)물론 비슷 한 단 어 를 절대적 으로 찾 을 수 없습니다.예 를 들 어 주어진 lates 라 는 단 어 는...얘 는 late 로 정정 하지 말 아야 되 나 요,latest 로 정정 하지 말 아야 되 나 요?이러한 어려움 은 우리 에 게 규칙 에 기초 한 판단 이 아니 라 확률론 을 사용 해 야 한 다 는 것 을 알려 준다.우 리 는 한 단어 w 를 정 하고 모든 정확 한 맞 춤 법 단어 중에서 우 리 는 정확 한 단어 c 를 찾 아 w 에 대한 조건 확률 이 가장 크다 고 말한다.즉,
argmax
c P(
c|
w)
대로 베 일 스 이론
위의 식 은 다음 과 같다.
argmax
c P(
w|
c) P(
c) / P(
w)
사용자 가 모든 단 어 를 잘못 질 수 있 기 때문에 모든 c 에 있어 서 w 가 나타 날 확률 P(w)는 똑 같 습 니 다.그래서 우 리 는 위 에서 이 단 어 를 무시 하고 다음 과 같이 씁 니 다.
argmax
c P(
w|
c) P(
c)
이 식 은 세 부분 이 있 는데 오른쪽 에서 왼쪽으로 각각 다음 과 같다.
1.P(c),문장 에 정확 한 맞 춤 법 단어 c 가 나타 날 확률,즉 영어 문장 에서 c 가 나타 날 확률 은 얼마나 됩 니까?이 확률 은 완전히 영어 라 는 언어 에 의 해 결정 되 기 때문에 우 리 는 그것 을 한다 고 부른다.
언어 모델 P('the')는 상대 적 으로 높 아서 나타난다. P('zxzxzyy')의 확률 은 0 에 가깝다(후자 도 한 단어 라 고 가정 하면).
2.P(w|c)는 사용자 가 c 를 입력 하고 싶 은 상황 에서 w 로 칠 확률 입 니 다.이것 은 사용자 가 얼마나 큰 확률 로 c 를 w 로 잘못 칠 수 있 는 지 를 나타 내 는 것 이기 때문에 이것 은
오차 모델.
3. argmax
c.모든 가능 한 c 를 매 거 하고 확률 이 가장 높 은 것 을 선택 하 는 데 사용 합 니 다.왜냐하면 우 리 는 하나의(정확 한)단어 가 나타 나 는 빈도 가 높 고 사용자 가 그것 을 다른 잘못된 단어 로 두 드 리 기 쉽다 고 믿 을 이유 가 있 기 때 문 입 니 다.그러면 그 잘못된 단 어 는 이 정확 한 것 으로 수정 되 어야 합 니 다.
누 군 가 는 반드시 물 어 볼 것 이다.너 는 멍청 하 다.왜 가장 간단 한 P(
c
|
w
)두 가지 복잡 한 식 으로 계산 합 니까?답 은 본질 적 으로 P(c|w)는 이 두 가지 와 동시에 관련 되 어 있 기 때문에 두 가지 로 나 누 면 오히려 처리 하기 쉽다.예 를 들 어 하나의 단어 인 thew 가 틀 렸 다.보기에 thaw 는 정확 해 야 한다.왜냐하면 a 를 e 로 쳤 기 때문이다.그러나 사용자 가 원 하 는 것 은 the 일 수도 있다.the 는 영어 에서 흔히 볼 수 있 는 단어 이기 때문이다.또한 타 자 를 칠 때 손 이 부주의 로 e 에서 w 로 미 끄 러 졌 을 가능성 이 높다.따라서 이런 상황 에서 우 리 는 계산 하고 싶다. P(
c
|
w
)c 가 나타 날 확률 과 c 에서 w 까지 의 확률 을 동시에 고려 해 야 한다.하 나 를 두 가지 로 나 누 면 오히려 이 문 제 를 더욱 명확 하 게 할 수 있다.
사용 한 언어 자료 라 이브 러 리:big.txt.
코드 github:https://github.com/dreamboy127/Spell_java
자바 코드 는 다음 과 같 습 니 다:
import java.util.*;
import java.io.*;
public class SpellCorrect{
public static void readLines(String file, ArrayList<String> lines) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(new File(file)));
String line = null;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private static String readText(File file) {
String text = null;
try
{
InputStreamReader read = new InputStreamReader(new FileInputStream(file));
BufferedReader br = new BufferedReader(read);
StringBuffer buff = new StringBuffer();
while((text = br.readLine()) != null)
{
buff.append(text + "\r
");
}
br.close();
text = buff.toString();
}
catch(FileNotFoundException e)
{
System.out.println(e);
}
catch(IOException e)
{
System.out.println(e);
}
return text;
}
public static void tokenizeAndLowerCase(String line, ArrayList<String> tokens) {
// TODO Auto-generated method stub
StringTokenizer strTok = new StringTokenizer(line,"\r
\t/\\\':\" ()[]{};.,#-_=!@$%^&*+1234567890");
while (strTok.hasMoreTokens()) {
String token = strTok.nextToken();
tokens.add(token.toLowerCase().trim());
}
}
public static void trainPrior(ArrayList<String> str,Map<String,Integer> map)
{
for(int i=0;i<str.size();i++)
{
if(map.containsKey(str.get(i)))
{
int tmp=map.get(str.get(i));
map.put(str.get(i),1+tmp);
}
else
map.put(str.get(i),1);
}
}
public static Set<String> Edit1(String str){
Set<String> array=new HashSet<String>();
for(int i=0;i<str.length();i++)//delete
{
String tmpstr=str.substring(0,i)+str.substring(i+1,str.length());
array.add(tmpstr);
}
for(int i=0;i<str.length();i++)//insert
{
for(char x='a';x<='z';x++)
{
String tmpstr=str.substring(0,i)+x+str.substring(i,str.length());
array.add(tmpstr);
}
}
for(int i=0;i<str.length()-1;i++)//trans
{
String tmpstr=str.substring(0,i)+str.charAt(i+1)+str.charAt(i)+str.substring(i+2,str.length());
array.add(tmpstr);
}
for(int i=0;i<str.length();i++)//convert
{
for(char x='a';x<='z';x++)
{
String tmpstr=str.substring(0,i)+x+str.substring(i+1,str.length());
array.add(tmpstr);
}
}
return array;
}
public static Set<String> Edit2(String str){
Set<String> array=new HashSet<String>();
array=Edit1(str);
Set<String> array2=new HashSet<String>();
Iterator<String> iter=array.iterator();
while(iter.hasNext())
{
String str1=iter.next();
array2.addAll(Edit1(str1));
}
return array2;
}
public static boolean kowns(Set<String> checkset,Set<String> wordset)
{
Iterator<String> iter=checkset.iterator();
while(iter.hasNext())
{
String str=iter.next();
if(!wordset.contains(str))
iter.remove();
}
return checkset.size()>0;
}
public static void main(String[] args){
String text=readText(new File("big.txt"));
ArrayList<String> s=new ArrayList<String>();
tokenizeAndLowerCase(text,s);
Map<String,Integer> map=new HashMap<String,Integer>();
trainPrior(s,map);
Set<String> keys=map.keySet();
// System.out.println(map.size());
Scanner scan=new Scanner(System.in);
System.out.println("spell correct starting");
while(true)
{
System.out.println("please input a term:");
String str=scan.next();
if("q".equals(str))
break;
Set<String> edit1=Edit1(str);
Set<String> edit2=Edit2(str);
boolean flag=kowns(new HashSet<String>(Arrays.asList(str)),keys);
if(flag)
return;
Set<String> edit=edit1;
flag=kowns(edit,keys);
if(!flag)
{
edit=edit2;
flag=kowns(edit,keys);
}
Iterator<String> iter=edit.iterator();
int max=0;
int tmp=1;
String maxStr=null;
while(iter.hasNext())
{
String tmpStr = iter.next();
// System.out.println(tmpStr);
tmp=map.get(tmpStr);
if(max<tmp)
{
maxStr=tmpStr;
max=tmp;
}
}
System.out.println(maxStr);
}
System.out.println("spell correct ending");
// Set<Map.Entry<String,Integer>> allSet=null;
// allSet=map.entrySet();
// for(Map.Entry<String,Integer> me : allSet)
// System.out.println(me.getKey()+"-->"+me.getValue());
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.