我将从一个例子开始:
结束了。我会结束你。
我想消除字符串" end"使用n-gram。所以我现在拥有的是:
abstract class Ngram {...}
public class Bigram extends Ngram {...}
public class Trigram extends Ngram {...}
Bigram :[the,end],[end,is]; [会,结束],[结束,你] Trigram :[the,end,is],[end,near]; [我,将,结束],[将,结束,你]
然而,现在我认为不仅可以计算Bigrams,Trigrams等一般,而且还可以区分Bigrams与位置= 0处的模糊词AW和AW的位置。在位置= 1,Trigrams与AW在pos = 0,1,2等,
这意味着我可以创建其他类:而不是一个代表文本中找到的所有Bigrams的Bigram类,我可以拥有
abstract class Bigram {...}
public class BigramWithAmbigWordAt0 extends Bigram {...}
public class BigramWithAmbigWordAt1 extends Bigram {...}
现在,我的问题:
答案 0 :(得分:3)
单个课程就足够了。你只需要该类中的变量:
public class Ngram
{
public int n;
public int ambiguousWordPosition;
public String sentence;
public Ngram(int n, int ambiguousWordPosition, String sentence)
{
this.n = n;
this.ambiguousWordPosition = ambiguousWordPosition;
this.sentence = sentence;
}
}
然后你可以消除歧义:
public ArrayList<ArrayList<String>> disambiguate(String word)
{
ArrayList<ArrayList<String>> outer = new ArrayList<ArrayList<String>>();
String[] words = sentence.split("\\s+");
int cutoff = n-1;
for (int i = 0; i < words.length - cutoff; i++) {
if(words[i + ambiguousWordPosition].equals(word)) {
ArrayList<String> inner = new ArrayList<String>();
for(int j = i; j < i + cutoff; j++){
inner.add(words[j]);
}
outer.add(inner);
}
}
return outer;
}
注意:将此视为伪代码。我自己还没有测试过,但是你应该能够得到这个想法
答案 1 :(得分:2)
我不完全确定你在做什么,但听起来最好可能使用N-gram类并将N(整数)和AW作为参数发送给构造函数。如果您计划扩展或重复使用,那将是一个更好的设计。