N-gram:解释+ 2个申请

caw*_*caw 18 php nlp analysis n-gram

我想用n-gram(最好用PHP)实现一些应用程序.


哪种类型的n-gram更适合大多数用途?单词级别或字符级别n-gram?你怎么能在PHP中实现一个n-gram-tokenizer?


首先,我想知道N-gram到底是什么.它是否正确?这就是我理解n-gram的方式:

句子:"我住在纽约."

单词级别的双字母(n为2):"#I","我活着","住在纽约","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识别文本的语言?
  • 即使您没有双语语料库,是否可以使用n-gram进行机器翻译?
  • 如何构建垃圾邮件过滤器(垃圾邮件,火腿)?将n-gram与贝叶斯滤波器相结合?
  • 如何进行主题定位?例如:关于篮球还是狗的文字?我的方法(用维基百科文章"狗"和"篮球"做下面的内容):为两个文档构建n-gram向量,对它们进行标准化,计算曼哈顿/欧几里德距离,结果越接近1,越高的是相似

您如何看待我的应用方法,特别是最后一个?


我希望你能帮助我.提前致谢!

bdk*_*bdk 26

对于你提到的大多数文本分析应用程序来说,单词n-gram通常会更有用,除了语言检测之外,字符三元组可能会提供更好的结果.实际上,您可以为您感兴趣的每种语言中的文本语料库创建n-gram向量,然后将每个语料库中的三元组频率与您正在分类的文档中的三元组进行比较.例如,英语中三元组的the出现频率可能高于德语,并且可以提供某种程度的统计相关性.一旦您的文档采用n-gram格式,您就可以选择许多算法进行进一步分析,Baysian过滤器,N-Nearest Neighbor,支持向量机等.

在你提到的应用程序中,机器翻译可能是最牵强的,因为单独的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-gram加上支持向量机以极好的方式执行主题定位,但是你需要一个大的文本语料库,预先分类为"on topic"和"off topic"来训练分类器.你会发现大量的研究论文在citeseerx这样的网站上解释了解决这个问题的各种方法.我不会推荐的欧氏距离的方法解决这个问题,因为它基于统计学意义不重量个别正克,这样两个文件既包括the,a,is,和of将被认为比两个文件,这两个包含更好的匹配Baysian.从你感兴趣的n-gram中删除停用词会有所改善.

  • 使用单词作为特征对于基于单词的n-gram是等效的,其中n = 1.增加n的优点是可以增加功能的上下文.例如,知道两个文件都包含n-gram"The Who"可能比知道它们分别包括"The"和"Who"更有用. (4认同)
  • 这是我在SO上的任何主题上看到的最佳答案之一. (3认同)
  • 另外,请注意,如果构造n = 3(例如)n-gram的向量,我还会包括n = 2和n = 1 ngrams.我不确定这是否是规范的,但过去我曾经做过的项目经常这样做.增加n的优点是附加上下文,但缺点是较小的样本集(任何给定的3个单词短语在语料库中不会像2个单词短语那样出现).包括n = 1,2,3 n-gram在内,为您提供了两全其美的优势,并且存在额外的存储和计算需求 (2认同)