我想用n-gram实现一些应用程序(最好在PHP中)。
哪种n-gram最适合大多数用途?单词级别或字符级别的n-gram?您如何在PHP中实现n-gram-tokenizer?
首先,我想知道N-gram到底是什么。这样对吗?这就是我理解n-gram的方式:
句子:“我住在纽约。”
单词级双字母(2表示n):“#I”,“I live”,“in live in”,“in NY”,“NY#”
字符级双字母(n为2):“#I”,“I#”,“#l”,“li”,“iv”,“ve”,“e#”,“#i”,“in”,“n#”,“#N”,“NY”,“Y#”
当您具有n-gram-parts的数组时,请删除重复的部分,并为每个给出频率的部分添加一个计数器:
单词级双字母组:[1、1、1、1、1]
字符级双字母组:[2、1、1,...]
这样对吗?
此外,我想了解更多有关n-gram可以做什么的信息:
您如何看待我的应用程序方法,尤其是最后一种?
我希望你能帮助我。提前致谢!
最佳答案
单词n-gram通常对于您提到的大多数文本分析应用程序更有用,但语言检测可能会异常(exception),在这种情况下,字符三叉戟可能会带来更好的结果。有效地,您将为您要检测的每种语言的文本语料库创建n-gram向量,然后将每个语料库中的卦的频率与您要分类的文档中的卦的频率进行比较。例如,trigram the
在英语中可能比在德语中出现频率更高,并且会提供一定程度的统计相关性。一旦您拥有n-gram格式的文档,便可以选择许多算法进行进一步分析,包括贝叶斯过滤器,N最近邻算法,支持向量机等。
在您提到的应用程序中,机器翻译可能是最牵强的,因为仅使用n-gram不会使您走得很远。将输入文件转换为n-gram表示形式只是将数据转换为用于进一步特征分析的格式的一种方法,但是由于您丢失了许多上下文信息,因此对于翻译可能没有用。
需要注意的一件事是,如果一个文档创建一个矢量[1,1,1,2,1]和另一个文档创建一个矢量[2,1,2,4]是不够的。尺寸不匹配。也就是说,向量中的第一个条目不能是一个文档中的the
和另一个文档中的is
,否则算法将不起作用。您将得到[0,0,0,0,1,1,0,0,2,0,0,1]之类的向量,因为大多数文档将不包含您感兴趣的大多数n-gram。功能是至关重要的,它要求您“预先”确定要在分析中包括的ngram。通常,这是通过两次通过算法实现的,首先确定各种n-gram的统计显着性,以决定要保留什么。 Google的“功能选择”以获取更多信息。
基于单词的n-grams和Support Vector Machines以出色的方式执行主题发现,但是您需要大量的文本库,这些文本库已预先分类为“在主题上”和“在主题外”,以训练分类器。您可以在citeseerx这样的网站上找到大量的研究论文,解释该问题的各种方法。我不建议使用欧几里德距离方法,因为它不会基于统计显着性对单个n-gram加权,因此两个都包含the
,a
,is
和of
的文档将被认为比两个文档更匹配。都包括Baysian
。从您感兴趣的n-gram中删除停用词会有所改善。
关于php - N-grams : Explanation + 2 applications,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1032288/