working on prefixes hypotities

git-svn-id: https://russianmorphology.googlecode.com/svn/trunk@86 d817d54c-26ab-11de-abc9-2f7d1455ff7a
This commit is contained in:
Alexander.A.Kuznetsov 2009-11-11 22:21:14 +00:00
parent 97fa8fa868
commit 6246f020fd
10 changed files with 577 additions and 15 deletions

0
1.txt Normal file
View File

View File

@ -1,18 +1,20 @@
package org.apache.lucene.morphology.dictionary;
import org.apache.lucene.morphology.PrefixRule;
import java.util.*;
import java.io.IOException;
import java.io.BufferedReader;
public class PrefixesHypotises extends DictonaryReader {
public class PrefixesRulesBuilder extends DictonaryReader {
private Map<FlexiaModel,Set<FlexiaModel>> rules = new HashMap<FlexiaModel,Set<FlexiaModel>>();
public PrefixesHypotises(String fileName, Set<String> ingnoredForm) {
public PrefixesRulesBuilder(String fileName, Set<String> ingnoredForm) {
super(fileName, ingnoredForm);
}
public PrefixesHypotises(String fileName, String fileEncoding, Set<String> ingnoredForm) {
public PrefixesRulesBuilder(String fileName, String fileEncoding, Set<String> ingnoredForm) {
super(fileName, fileEncoding, ingnoredForm);
}
@ -23,6 +25,22 @@ public class PrefixesHypotises extends DictonaryReader {
System.out.println(rules);
}
public List<PrefixRule> getPrefixRules(){
List<PrefixRule> prefixRules = new ArrayList<PrefixRule>();
for(FlexiaModel key:rules.keySet()){
PrefixRule prefixRule = new PrefixRule();
prefixRule.setPrefix(key.getPrefix());
prefixRule.setLastLetter(key.getSuffix().charAt(0));
HashSet<String> map = new HashSet<String>();
for(FlexiaModel fm:rules.get(key)){
map.add(fm.getCode());
}
prefixRule.setForms(map);
prefixRules.add(prefixRule);
}
return prefixRules;
}
@Override
protected void readWords(BufferedReader reader, WordProccessor wordProccessor) throws IOException {
sckipBlock(reader);

View File

@ -17,7 +17,6 @@
package org.apache.lucene.morphology.generator;
import org.apache.lucene.morphology.dictionary.*;
import org.apache.lucene.morphology.russian.RussianLetterDecoderEncoder;
import java.io.IOException;
import java.util.HashSet;
@ -26,7 +25,7 @@ import java.util.HashSet;
public class RussianPrefixesBuilder {
public static void main(String[] args) throws IOException {
GrammaReader grammaInfo = new GrammaReader("dictonary/Dicts/Morph/rgramtab.tab");
PrefixesHypotises dictonaryReader = new PrefixesHypotises("dictonary/Dicts/SrcMorph/RusSrc/morphs.mrd", new HashSet<String>());
PrefixesRulesBuilder dictonaryReader = new PrefixesRulesBuilder("dictonary/Dicts/SrcMorph/RusSrc/morphs.mrd", new HashSet<String>());
//RussianLetterDecoderEncoder decoderEncoder = new RussianLetterDecoderEncoder();
//StatiticsCollector statiticsCollector = new StatiticsCollector(grammaInfo, decoderEncoder);

View File

@ -0,0 +1,372 @@
[ ть
у
ем
ешь
ете
ет
ут
ла
ло
ли
я
ши
ем
емте
по ай
ь
по айте
ьте
ущий
ущего
ущему
ущего
ущий
ущим
ущем
ущая
ущей
ущей
ущую
ущей
ущею
ущей
ущее
ущего
ущему
ущее
ущим
ущем
ущие
ущих
ущим
ущих
ущие
ущими
ущих
ший
шего
шему
шего
ший
шим
шем
шая
шей
шей
шую
шей
шею
шей
шее
шего
шему
шее
шим
шем
шие
ших
шим
ших
шие
шими
ших]
[ большой
большого
большому
большого
большой
большим
большом
большая
большой
большой
большую
большой
большою
большой
большое
большого
большому
большое
большим
большом
большие
больших
большим
больших
большие
большими
больших
велик
велика
велико
велики
больше
по больше
наи больший
наи большего
наи большему
наи большего
наи больший
наи большим
наи большем
наи большая
наи большей
наи большей
наи большую
наи большей
наи большею
наи большей
наи большее
наи большего
наи большему
наи большее
наи большим
наи большем
наи большие
наи больших
наи большим
наи больших
наи большие
наи большими
наи больших]
[ вероятный
вероятного
вероятному
вероятного
вероятный
вероятным
вероятном
вероятная
вероятной
вероятной
вероятную
вероятной
вероятною
вероятной
вероятное
вероятного
вероятному
вероятное
вероятным
вероятном
вероятные
вероятных
вероятным
вероятных
вероятные
вероятными
вероятных
вероятен
вероятна
вероятно
вероятны
вероятнее
вероятней
по вероятнее
по вероятней
вероятнейший
наи невероятнейший
вероятнейшего
наи невероятнейшего
вероятнейшему
наи невероятнейшему
вероятнейшего
наи невероятнейшего
вероятнейший
наи невероятнейший
вероятнейшим
наи невероятнейшим
вероятнейшем
наи невероятнейшем
вероятнейшая
наи невероятнейшая
вероятнейшей
наи невероятнейшей
вероятнейшей
наи невероятнейшей
вероятнейшую
наи невероятнейшую
вероятнейшей
вероятнейшею
наи невероятнейшей
наи невероятнейшею
вероятнейшей
наи невероятнейшей
вероятнейшее
наи невероятнейшее
вероятнейшего
наи невероятнейшего
вероятнейшему
наи невероятнейшему
вероятнейшее
наи невероятнейшее
вероятнейшим
наи невероятнейшим
вероятнейшем
наи невероятнейшем
вероятнейшие
наи невероятнейшие
вероятнейших
наи невероятнейших
вероятнейшим
наи невероятнейшим
вероятнейших
наи невероятнейших
вероятнейшие
наи невероятнейшие
вероятнейшими
наи невероятнейшими
вероятнейших
наи невероятнейших]
[ аленький
аленького
аленькому
аленького
аленький
аленьким
аленьком
аленькая
аленькой
аленькой
аленькую
аленькой
аленькою
аленькой
аленькое
аленького
аленькому
аленькое
аленьким
аленьком
аленькие
аленьких
аленьким
аленьких
аленькие
аленькими
аленьких
ал
ала
ало
алы
еньше
по еньше
алейший
наи еньший
алейшего
наи еньшего
алейшему
наи еньшему
алейшего
наи еньшего
алейший
наи еньший
алейшим
наи еньшим
алейшем
наи еньшем
алейшая
наи еньшая
алейшей
наи еньшей
алейшей
наи еньшей
алейшую
наи еньшую
алейшей
алейшею
наи еньшей
наи еньшею
алейшей
наи еньшей
алейшее
наи еньшее
алейшего
наи еньшего
алейшему
наи еньшему
алейшее
наи еньшее
алейшим
наи еньшим
алейшем
наи еньшем
алейшие
наи еньшие
алейших
наи еньших
алейшим
наи еньшим
алейших
наи еньших
алейшие
наи еньшие
алейшими
наи еньшими
алейших
наи еньших]
[ ьный
ьного
ьному
ьного
ьный
ьным
ьном
ьная
ьной
ьной
ьную
ьной
ьною
ьной
ьное
ьного
ьному
ьное
ьным
ьном
ьные
ьных
ьным
ьных
ьные
ьными
ьных
ен
ьна
ьно
ьны
ьны
ьнее
ьней
по ьнее
по ьней
наи ьнейший
наи ьнейшего
наи ьнейшему
наи ьнейшего
наи ьнейший
наи ьнейшим
наи ьнейшем
наи ьнейшая
наи ьнейшей
наи ьнейшей
наи ьнейшую
наи ьнейшей
наи ьнейшею
наи ьнейшей
наи ьнейшее
наи ьнейшего
наи ьнейшему
наи ьнейшее
наи ьнейшим
наи ьнейшем
наи ьнейшие
наи ьнейших
наи ьнейшим
наи ьнейших
наи ьнейшие
наи ьнейшими
наи ьнейших]

View File

@ -34,14 +34,8 @@ public class LuceneMorphology extends Morphology {
}
@Override
public List<String> getMorhInfo(String s) {
ArrayList<String> result = new ArrayList<String>();
int[] ints = decoderEncoder.encodeToArray(revertWord(s));
int ruleId = findRuleId(ints);
for (Heuristic h : rules[rulesId[ruleId]]) {
result.add(h.transofrmWord(s));
}
return result;
protected String createForm(String form, String grammaInfo) {
return form;
}
protected void readRules(BufferedReader bufferedReader) throws IOException {

View File

@ -68,11 +68,15 @@ public class Morphology {
int[] ints = decoderEncoder.encodeToArray(revertWord(s));
int ruleId = findRuleId(ints);
for (Heuristic h : rules[rulesId[ruleId]]) {
result.add(h.transofrmWord(s) + "|" + grammaInfo[h.getFormMorphInfo()]);
result.add(createForm(h.transofrmWord(s),grammaInfo[h.getFormMorphInfo()]));
}
return result;
}
protected String createForm(String form,String grammaInfo){
return form+"|"+grammaInfo;
}
protected int findRuleId(int[] ints) {
int low = 0;
int high = separators.length - 1;

View File

@ -0,0 +1,52 @@
package org.apache.lucene.morphology;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.List;
import java.util.HashMap;
import java.util.ArrayList;
public class MorphologyWithPrefix extends Morphology {
private Map<String, PrefixRule> prefixRuleMap = new HashMap<String, PrefixRule>();
public MorphologyWithPrefix(String fileName, LetterDecoderEncoder decoderEncoder) throws IOException {
super(fileName, decoderEncoder);
}
public MorphologyWithPrefix(InputStream inputStream, LetterDecoderEncoder decoderEncoder) throws IOException {
super(inputStream, decoderEncoder);
}
public MorphologyWithPrefix(int[][] separators, short[] rulesId, Heuristic[][] rules, String[] grammaInfo) {
super(separators, rulesId, rules, grammaInfo);
}
@Override
public List<String> getMorhInfo(String s) {
if (s.length() < 4) {
return super.getMorhInfo(s);
}
String ruleIndex = "" + s.charAt(0) + s.charAt(s.length() - 1);
PrefixRule prefixRule = prefixRuleMap.get(ruleIndex);
if (prefixRule == null) {
return super.getMorhInfo(s);
}
if (s.startsWith(prefixRule.getPrefix())) {
return super.getMorhInfo(s);
}
String sWithoutPrefix = s.substring(prefixRule.getPrefix().length());
int[] ints = decoderEncoder.encodeToArray(revertWord(sWithoutPrefix));
int ruleId = findRuleId(ints);
ArrayList<String> result = new ArrayList<String>();
for (Heuristic h : rules[rulesId[ruleId]]) {
String morphInfo = grammaInfo[h.getFormMorphInfo()];
if(prefixRule.getForms().contains(morphInfo)){
result.add(createForm(h.transofrmWord(sWithoutPrefix),"pr"));
}
}
return result.size() > 0 ? result : super.getMorhInfo(s);
}
}

View File

@ -0,0 +1,61 @@
package org.apache.lucene.morphology;
import java.io.Serializable;
import java.util.HashSet;
public class PrefixRule implements Serializable {
private Character lastLetter;
private String prefix;
private HashSet<String> forms;
public Character getLastLetter() {
return lastLetter;
}
public void setLastLetter(Character lastLetter) {
this.lastLetter = lastLetter;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public HashSet<String> getForms() {
return forms;
}
public void setForms(HashSet<String> forms) {
this.forms = forms;
}
public String getHashString() {
return "" + prefix.charAt(0) + lastLetter;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PrefixRule that = (PrefixRule) o;
if (forms != null ? !forms.equals(that.forms) : that.forms != null) return false;
if (lastLetter != null ? !lastLetter.equals(that.lastLetter) : that.lastLetter != null) return false;
if (prefix != null ? !prefix.equals(that.prefix) : that.prefix != null) return false;
return true;
}
@Override
public int hashCode() {
int result = lastLetter != null ? lastLetter.hashCode() : 0;
result = 31 * result + (prefix != null ? prefix.hashCode() : 0);
result = 31 * result + (forms != null ? forms.hashCode() : 0);
return result;
}
}

View File

@ -0,0 +1,60 @@
/**
* Copyright 2009 Alexander Kuznetsov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.lucene.morphology.russian;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Token;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
/**
* Created by IntelliJ IDEA.
* User: akuznetsov
* Date: 31.10.2009
* Time: 14:01:11
* To change this template use File | Settings | File Templates.
*/
public class TestSpeed {
public static void main(String[] args) throws IOException {
RussianAnalayzer russianAnalayzer = new RussianAnalayzer();
bookProccess(russianAnalayzer, "C:/tmp/_Aleksandr_Suhov_Tanets_na_raskalennyih_uglyah1.fb2");
Long stat = System.currentTimeMillis();
bookProccess(russianAnalayzer, "C:/tmp/_Aleksandr_Suhov_Tanets_na_raskalennyih_uglyah1.fb2");
System.out.println("Done in " + (System.currentTimeMillis() - stat));
}
private static void bookProccess(RussianAnalayzer russianAnalayzer, String bookName) throws IOException {
FileInputStream inputStream = new FileInputStream(bookName);
TokenStream tokenStream = russianAnalayzer.tokenStream(null,new InputStreamReader(inputStream,"UTF-8"));
final Token reusableToken = new Token();
long count = 0;
Token nextToken;
for (; ;) {
nextToken = tokenStream.next(reusableToken);
// System.out.println(" " + nextToken.term());
count++;
if (nextToken == null) {
break;
}
}
//System.out.println("Words " + count);
}
}

View File

@ -18,4 +18,6 @@
на на
тест тест тесто
спам спам
спама спам
спама спам
наигранный наигранный
наивный наивный