我正在开发一个项目,该项目涉及搜索许多文件以查找我所拥有的公司名称列表并对其进行计数。
目前我正在使用urllib从Web检索并将文件存储为字符串。然后,我使用python的count函数来计算找到公司列表中每个公司的次数。
但是我遇到了一些问题:
由于我正在处理大量数据,因此该程序需要一段时间才能完成。
我还有准确计算档案中公司的问题。
例如,在一个文件中,“摩根士丹利”可以被计算在内,“Stanley”将被计算在内,因为它们都是我名单中的公司,即使没有提到“Stanley”。此外,一些公司名称是名词。因此即使没有提及它们,它们也可能被计算在内。
到目前为止我所研究的内容: 处理名词问题的一个简单方法是,我正在搜索首字母大写的公司。所以这涉及一些问题。
我尝试过使用NLTK和命名实体识别。但是,NLTK将所有实体分类,而不仅仅是公司。所以这可能需要很长时间,因为我处理的不仅仅是一些数据。
我看到here有其他库会有用,但它们不能用于公司。
Iteritems有一个function组我,但是1.我不知道如何将它用于公司2.它将邻居组合在一起。
那么,只计算许多文本文件中提到的公司的好方法是什么,这不会很慢?
编辑:我不是在寻找代码。我正在寻找人们建议我应该研究的库或方法
答案 0 :(得分:1)
您是否尝试过使用正则表达式?如果不对实际数据进行测试,就很难对此进行计时,但您可以尝试以下方法:
from collections import Counter
import re
text = "Today 'Microsoft' accused Facebook of ignoring Stanley from Morgan Stanley. Microsoft denies it."
companies = ['Morgan Stanley', 'Microsoft', 'Facebook']
search = '|'.join(r'\b{}\b'.format(c.replace(' ', r'\s+')) for c in companies)
re_comp = re.compile(r'({})'.format(search))
counts = Counter(re.sub(r'\s+', ' ', c) for c in re_comp.findall(text))
print(counts)
对于这个简单的例子,将给出:
Counter({'Microsoft': 2, 'Morgan Stanley': 1, 'Facebook': 1})
此方法会从目录中一次加载每个文件,并在单个findall()
调用中搜索所有公司。这比尝试对每个公司名称使用count()
要快得多。
所以要扩展为一组.txt
个文件:
from collections import Counter
import re
import glob
total_counts = Counter()
companies = ['Morgan Stanley', 'Microsoft', 'Facebook']
search = '|'.join(r'\b{}\b'.format(c.replace(' ', r'\s+')) for c in companies)
re_comp = re.compile(r'({})'.format(search))
for filename in glob.glob('comp*.txt'):
with open(filename) as f_input:
text = f_input.read()
counts = Counter(re.sub(r'\s+', ' ', c) for c in re_comp.findall(text))
total_counts.update(counts)
for company, count in sorted(total_counts.items()):
print('{:30} {}'.format(company, count))