如果可能的话,我宁愿不必启动lingpipe,这让我想知道在java中是否有任何快速,简单的方法从一串文本中提取所有的bigrams和trigrams?
感谢
答案 0 :(得分:3)
public class NGramIterator implements Iterator<String> {
String[] words;
int pos = 0, n;
public NGramIterator(int n, String str) {
this.n = n;
words = str.split(" ");
}
public boolean hasNext() {
return pos < words.length - n + 1;
}
public String next() {
StringBuilder sb = new StringBuilder();
for (int i = pos; i < pos + n; i++)
sb.append((i > pos ? " " : "") + words[i]);
pos++;
return sb.toString();
}
public void remove() {
throw new UnsupportedOperationException();
}
}
答案 1 :(得分:2)
字符串str用单词“我是示例字符串并将在空间上标记化”初始化。然后使用StringTokenizer将字符串分解为令牌,该令牌返回字符串数组,例如“ I”,“ am”,“ sample”等...
进行检查以确保字符串数组至少包含2个单词,因为一个单词不能构成一个双字。因此,然后遍历字符串数组,如果第一次是在while循环中运行,则,将字符串s1初始化为字符串数组中的第一个元素。然后将字符串s2初始化为数组中的第二个元素,并将s1和s2连接在一起以形成s3,将其推到arrayList中。
s1 = "I";
s2 = "am"
s3 = s1 + " " + s2; //makes s3 = "I am"
之后,将s2中的值设置为s1,并将s2设置为空String。这使二元组中的last(second)元素移动到第一个位置,从而为另一个元素在下一次迭代中占据s2留出空间。现在,当您遍历其余数组时,只会为s2分配一个值。
import java.util.*;
class Test
{
public static void main(String [] args)
{
String str = "I am sample string and will be tokenized on space";
ArrayList<String> bigrams = new ArrayList<String>();
StringTokenizer itr = new StringTokenizer(str);
if(itr.countTokens() > 1)
{
System.out.println("String array size : " + itr.countTokens());
String s1 = "";
String s2 = "";
String s3 = "";
while (itr.hasMoreTokens())
{
if(s1.isEmpty())
s1 = itr.nextToken();
s2 = itr.nextToken();
s3 = s1 + " " + s2;
bigrams.add(s3);
s1 = s2;
s2 = "";
}
}
else
System.out.println("Tokens is 1 or 0");
int i = 0;
while (i < bigrams.size())
{
System.out.println(bigrams.get(i));
i++;
}
}
}
答案 2 :(得分:0)
始终最简单的方法是使用现有的库。您可以查看simmetrics库。您也可以使用lucene NgramTokenizer。您也可以自己实现此算法。首先,您必须在文本中找到所有单词(使用StringTokenizer),然后生成所需的n-grams。