我想用n元语法实现一些应用程序(最好是用PHP)。
哪种类型的n-gram更适合大多数用途?词级还是字符级n-gram?如何在PHP中实现n-gram-tokenizer?
首先,我想知道N-gram到底是什么。这是正确的吗?这就是我对n-gram的理解:
句子:“我住在纽约。”
词级二元组(2代表n):"# i“,"I live","live in","in NY",'NY #‘
字符级二元组(2表示n):"#I","I#","#l","li","iv","ve","e#","#i","in","n#","#N","NY","Y#“
当你有了这个n元语法部分的数组时,你去掉重复的部分,并为每个部分添加一个计数器,给出频率:
词级二元组: 1,1,1,1,1
字符级二元语法: 2,1,1,...
这是正确的吗?
此外,我想了解更多关于n-gram可以做什么的信息:
就越高
你对我的应用程序方法有什么看法,特别是最后一种?
我希望你能帮助我。提前感谢!
发布于 2009-06-23 13:17:09
对于您提到的大多数文本分析应用程序,Word n-gram通常更有用,但可能的例外是语言检测,在这种情况下,像字符trigram这样的东西可能会提供更好的结果。实际上,您可以为您感兴趣的每种语言的文本语料库创建n-gram向量,然后将每个语料库中三元语法的频率与您要分类的文档中的三元语法进行比较。例如,三元语法the
在英语中的出现频率可能比在德语中高得多,并提供了某种程度的统计相关性。一旦您有了n元语法格式的文档,您就可以选择许多算法进行进一步分析,如贝叶斯过滤器、N近邻、支持向量机等。
在你提到的应用中,机器翻译可能是最牵强的,因为n-gram本身不会带你走很远的路。将输入文件转换为n元语法表示只是将数据转换为用于进一步特征分析的格式的一种方法,但由于您丢失了大量上下文信息,因此可能对翻译没有用。
需要注意的一件事是,如果维度不匹配,为一个文档创建向量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 'feature selection‘以获取更多信息。
基于单词的n-gram加上支持向量机是进行主题识别的一种很好的方法,但是你需要一个大的文本语料库来训练分类器,这些文本被预先分类为“主题上”和“主题外”。在像citeseerx这样的网站上,你会发现大量的研究论文解释了解决这个问题的各种方法。我不建议使用欧几里得距离方法来解决这个问题,因为它不会根据统计意义对单个n元语法进行加权,因此两个都包含the
、a
、is
和of
的文档将被认为比两个都包含Baysian
的文档更匹配。从你感兴趣的n-gram中删除停用词会在一定程度上改善这一点。
发布于 2009-06-23 12:49:45
你对n-gram的定义是正确的。
您可以将词级n-gram用于搜索类型应用程序。字符级n-gram可以更多地用于文本本身的分析。例如,为了识别文本的语言,我将使用字母的频率与该语言的既定频率进行比较。也就是说,文本应该大致匹配该语言中字母的出现频率。
PHP中单词的n-gram标记器可以使用strtok来完成:
http://us2.php.net/manual/en/function.strtok.php
对于字符,使用split:
http://us2.php.net/manual/en/function.str-split.php
然后,您只需将数组拆分为任意数量的n元语法即可。
贝叶斯过滤器需要经过训练才能用作垃圾邮件过滤器,它可以与n-gram结合使用。然而,为了让它学习,你需要给它大量的输入。
就学习页面的上下文而言,您的最后一种方法听起来还不错……然而,这仍然是相当困难的,但n-gram听起来是一个很好的起点。
https://stackoverflow.com/questions/1032288
复制相似问题