OpenNLP ngram n元语法模型(简介)

来源:互联网 发布:降调软件哪个好 编辑:程序博客网 时间:2024/05/19 16:35

n元语法模型在这里不进行介绍,大家可以根据这两篇博客了解下:关于N-Gram模型或者自然语言处理中的N-Gram。

写这篇博客主要是要用到OpenNLP中的ngram模型(我用的opennlp-tools-1.7.0,版本,opennlp.tools.ngram包中),在这里对里面的类和方法的功能简要介绍。


一、NGramGenerator 类

1.功能:对给定的序列使用自定义的分隔符生成一个ngram,并将所有的ngram存储在String类型的List中

2.方法:

(1)public static List<String> generate(List<String> input, int n, String separator){...}

String类型的List作为输入input,用户根据n自定义要生成几元语法类型(n = 2,3 为bigram或者trigram),并且根据separator自定义字符分割标签

(2)public static List<String> generate(char[] input, int n, String separator){...}

该方法除了输入类型为char型数组外,与上一方法用法一样


3.例子:

public class App {    public static void main( String[] args )    {    String setence = "我爱自然语言处理。";    char[] ch = setence.toCharArray();        List<String> trigram = NGramGenerator.generate(ch, 3, "/");                System.out.println(trigram);    }}

该程序运行的结果为:[我/爱/自, 爱/自/然, 自/然/语, 然/语/言, 语/言/处, 言/处/理, 处/理/。]


二、NGramModel类

1.功能:用来生成ngrams 和 character ngrams


2.方法:

(1)public int getCount(StringList ngram){...}

统计给定的ngram的数量


(2)public void setCount(StringList ngram, int count){...}

设置某个已存在的ngram的数量


(3)public void add(StringList ngram){...}

新增一个给定的ngram,若已存在,将其数量递增一次


(4)public void add(StringList ngram, int minLength, int maxLength){...}

将Ngrams中特定长度的ngram添加到当前实例中


(5)public void add(String chars, int minLength, int maxLength){...}

新增一个character Ngram到当前实例


(6)public void remove(StringList tokens){...}

从当前Ngram模型中移除特定tokens


(7)public boolean contains(StringList tokens){...}

当前实例中是否存在给定的tokens


(8)public int size(){...}

返回当前实例中不同ngram的数量


(9)public int numberOfGrams(){...}

返回所有Ngrams的总数量


(10)public void cutoff(int cutoffUnder, int cutoffOver){...}

对NGrams进行删减,删除出现次数少于cutoffUnder和多于cutoffUnderOver的ngram


(11)public Dictionary toDictionary(){...}

根据当前NGramModel中所有的StringList创建一个Dictionary


(12)public void serialize(OutputStream out) throws IOException {...}

将ngram实例写入到OutputStream

三、NGramUtils类

1.功能

该类提供了使用拉普拉斯平滑算法、最大似然估计算法、线性内插算法等等计算NGram的概率的方法


2.方法

(1)public static double calculateLaplaceSmoothingProbability(StringList ngram, Iterable<StringList> set, int size, Double k) {...}

使用拉普拉斯平滑算法计算一个ngram在词汇表中的概率

ngram——待计算概率的ngram

set——词汇表

size——词汇表的长度

k——平滑因子


(2)public static double calculateUnigramMLProbability(String word, Collection<StringList> set) {...}

使用最大似然估计计算一个unigram在词汇表中的概率

word——待计算概率的unigram中唯一的一个词(字)

set——词汇表


(3)public static double calculateBigramMLProbability(String x0, String x1, Collection<StringList> set) {...}

使用最大似然估计计算一个bigram在词汇表中的概率

x0,x1——待计算概率的bigram中的第一第二两个词(字)

set——词汇表


(4)public static double calculateTrigramMLProbability(String x0, String x1, String x2, Iterable<StringList> set) {...}

使用最大似然估计计算一个trigram在词汇表中的概率

x0,x1,x2——待计算概率的bigram中的第一第二和第三的词(字)

set——词汇表


(5)public static double calculateNgramMLProbability(StringList ngram, Iterable<StringList> set) {...}

使用最大似然估计计算一个ngram在词汇表中的概率

ngram——待计算概率的ngram

set——词汇表


(6)public static double calculateBigramPriorSmoothingProbability(String x0, String x1, Collection<StringList> set, Double k) {...}

使用先验拉普拉斯平滑算法计算一个bigram在词汇表中的概率


(7)public static double calculateTrigramLinearInterpolationProbability(String x0, String x1, String x2, Collection<StringList> set, 

Double lambda1, Double lambda2, Double lambda3) {...}

使用线性内插算法计算一个trigram在词汇表中的概率

lambda1——trigram内插因子

lambda2——bigram内插因子

lambda3——unigram内插因子


(8)public static double calculateMissingNgramProbabilityMass(StringList ngram, Double discount, Iterable<StringList> set) {...}

使用missing probability mass algorithm计算一个ngram在词汇表中的概率

discount——折扣因子


(9)public static StringList getNMinusOneTokenFirst(StringList ngram) {...}

将ngram中最后一个词(字)去掉,得到(n-1)gram,n=1时返回null


(10)public static StringList getNMinusOneTokenLast(StringList ngram) {...}

将ngram中一个词(字)去掉,得到(n-1)gram,n=1时返回null


(11)public static Collection<StringList> getNGrams(StringList sequence, int size) {...}

给定序列sequence和维数size,生成ngram集合,n=size

1 0