python - 使用 Python 在数百万个文档中查找最常见的句子/短语
问题描述
我有大约 500 万份文件。一份文件由许多句子组成,可能有 1 到 5 页长。每个文档都是一个文本文件。
我必须在所有文档中找到最常见的句子/短语(至少 5 个单词)。我应该如何实现这一目标?
解决方案
对于 5 字长的短语,这是相对简单的 Python(可能需要大量内存)。对于可变长的短语,它有点复杂 - 并且可能需要额外说明您想要找到什么样的更长的短语。
对于 5 个单词(又名“5-gram”)的情况:
在一次遍历语料库中,您生成所有 5-grams,并计算它们的出现次数(比如进入 a Counter
),然后报告前 N 个。
例如,假设docs
是所有标记化文本的 Python 序列,其中每个单独的项目都是字符串单词列表。然后大致:
from collections import Counter
ngram_size = 5
tallies = Counter()
for doc in docs:
for i in range(0, len(doc)-4):
ngram = tuple(doc[i:i+5])
tallies[ngram] += 1
# show the 10 most-common n-grams
print(tallies.most_common(10))
如果您随后还想考虑可变长的短语,那就有点棘手了——但请注意,任何这样的短语都必须以您已经找到的一些 5-gram 开头。
因此,您可以考虑逐步重复上述内容,例如 6 克、7 克等。
但是为了优化内存/工作量,您可以添加一个步骤来忽略所有尚未以您从之前的运行中选择的前 N 个候选者之一开始的 n-gram。(例如,在 6-gram 运行中,+=
上面的行将以 6-gram 开头为条件——从您已经认为感兴趣的少数 5-gram 之一开始。)
此外,当(例如)前 8-gram 的计数已经低于较短 n-gram 的相关 top-N 计数时,您将停止寻找更长的 n-gram。(也就是说,当确保任何更长的 n-gram 的频率低于您感兴趣的前 N 个时。)
推荐阅读
- reactjs - Visual Studio 和 ReactJS 缺少文件错误;我怎么知道什么文件需要它?
- scala - 与 take(10) 与 limit(10).collect() 的性能比较
- javascript - 在 Node.js 中加密文本并从 iOS 应用程序中解密
- windows - Windows 上的 github 身份验证令牌存储在哪里?
- r - 如何在 R 中导入和绑定( rbindlist )之前定义第一列
- angular - 使用 Dropbox 导航
- r - 查找所有列组合的所有因子组合的频率
- php - 如何制作动态css路径?
- python-3.x - python中的矩形框模式
- android - 检查每个活动的用户身份验证