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做什么:
您如何看待我的应用方法,特别是最后一个?
我希望你能帮助我.提前致谢!
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中删除停用词会有所改善.