最简单的方法或最轻的库来获取Java中的bigrams和trigrams?

时间:2010-09-27 19:39:27

标签: java text

如果可能的话,我宁愿不必启动lingpipe,这让我想知道在java中是否有任何快速,简单的方法从一串文本中提取所有的bigrams和trigrams?

感谢

3 个答案:

答案 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)

Bigrams解决方案

字符串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