Ruby 一个拖延了一年多的问题

ma_fan · 2017年11月17日 · 最后由 116447729 回复于 2017年11月18日 · 1838 次阅读

举例描述

一篇文章如下:

四季 草芽尖尖,他对小鸟说:“我是春天。”荷叶圆圆,他对青蛙说:“我是夏天。”谷穗弯弯,他鞠着躬说:“我是秋天。”雪人大肚子一挺,他顽皮地说:“我就是冬天。”

第一步操作:把里面的文字切成单字,并统计出现的次数:

  1. 四 1;2. 季 1,3. 草 1,4. 芽 1,5. 小 1,6. 鸟 1,7. 春 1,8. 荷 1,9. 叶 1,10. 青 1,11. 蛙 1,12. 夏 1,13. 谷 1,14. 穗 1,15. 鞠 1,16. 着 1,17. 躬 1,18. 秋 1,19. 雪 1,20. 人 1,21. 大 1,22. 肚 1,23. 子 1,24. 一 1,25. 挺 1,26. 顽 1,27. 皮 1,28. 地 1,29. 就 1,30. 冬 1,31. 尖 2,32. 对 2,33. 圆 2,34. 弯 2,35. 他 4,36. 说 4,37. 我 4,38. 是 4,39. 天 4

第二部操作:接下来统计每个字出现的次数、出现的位置之和,经过排序,可以得出一个字序表:

  1. 他;2. 说;3. 我;4. 是;5. 天;6. 尖;7. 对;8. 圆;9. 弯;10. 四;11. 季;12. 草;13. 芽;14. 小;15. 鸟;16. 春;17. 荷;18. 叶;19. 青;20. 蛙;21. 夏;22. 谷;23. 穗;24. 鞠;25. 着;26. 躬;27. 秋;28. 雪;29. 人;30. 大;31. 肚;32. 子;33. 一;34. 挺;35. 顽;36. 皮;37. 地;38. 就;39. 冬;

纠结出现

问题正是这个字序表:所有的次数差异和位置差异,都被简化了。

所以需要取消排序。可是如果取消排序,该怎么表达字间的差异呢?

次数差异可以用 Z 分数表示,

位置差异呢?应该用什么数字来表示呢?

有什么方法可以次数差异和位置差异统一起来,用一个数字来表达呢?

最后,有没有什么 gem 好处理这种问题呢?

问到这个程度,真觉得自己有些猥琐了 :) 大家不要见怪。

实际的需求是什么?还是你只是单纯的想把次数差异和位置差异统一起来,用一个数字来表达

一般做全文搜索都不用计算顺序的,纯粹用 bag of words (BOW) 做索引. 你可以看看常用的 TF-IDF 函数怎么做的 (TF-IDF 很多变种,据说 TF 和 IDF 都换成 information gain 效果最好).

中文其实都不用分词,直接以字和 n-gram 为单位做。n-gram 代替分词的好处是能把词之间的关系都记录下来。

对于如何表达句和句之间甚至更广的顺序,可以考虑 skip-gram 和 CBOW.

还是要学习一个。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号