我有新闻数据集,其中包含过去3年内近10,000条新闻。 我还有一份在纽约证券交易所注册的公司名单(公司名称)。现在我想检查列表中的公司名称列表是否已出现在新闻数据集中。 例如:
company Name: 'E.I. du Pont de Nemours and Company'
News: 'Monsanto and DuPont settle major disputes with broad patent-licensing deal, with DuPont agreeing to pay at least $1.75 billion over 10 years for rights to technology for herbicide-resistant soybeans.'
现在,如果确切的公司名称在新闻中,我可以发现新闻包含公司名称,但从上面的例子可以看出情况并非如此。 我还尝试了另一种方式,即我在公司的全名中使用了整体名称,即在上面的例子中' Pont'当这个公司名称被调用时,这个词应该是文本的一部分。所以它在大多数时间都有效,但在下面的例子中会出现问题:
Company Name: Ennis, Inc.
News: L D`ennis` Kozlowski, former chief executive convicted of looting nearly $100 million from Tyco International, has emerged into far more modest life after serving six-and-a-half year sentence and probation; Kozlowski, who became ultimate symbol of corporate greed in era that included scandals at Enron and WorldCom, describes his personal transformation and more humble pleasures that have replaced his once high-flying lifestyle.
现在,您可以在文字中看到Ennis
与Dennis
匹配,因此它会提供无关的新闻结果。
有人可以帮忙说出正确的方法吗?感谢。
答案 0 :(得分:1)
使用带有boundaries的正则表达式进行完全匹配,无论您选择全名还是某些您认为唯一的部分部分都取决于您,但使用字词边界D'ennis'
将不匹配{{1} }:
Ennis
根据每个新闻项目的匹配数量,您可能需要使用companies = ["name1", "name2",...]
companies_re = re.compile(r"|".join([r"\b{}\b".format(name) for name in companies]))
或companies_re.search(artice)
。
对于不区分大小写的匹配,也会将companies_re.find_all(article)
传递给编译。
如果您要检查的唯一行也始终是以公司re.I
开头的行,您可以缩小搜索范围:
company Name:
答案 1 :(得分:1)
听起来你需要Aho-Corasick算法。这里有一个很好的快速实现python:https://pypi.python.org/pypi/pyahocorasick/
它只会进行精确匹配,所以你需要索引"杜邦"和"杜邦",例如。但这并不太难,您可以使用维基数据来帮助您找到别名:例如,查看Dupont's entry的别名:它包括" Dupont"和"杜邦"。
好的,让我们假设您有公司名称及其别名列表:
import ahocorasick
A = ahocorasick.Automaton()
companies = ["google", "apple", "tesla", "dupont", "du pont"]
for idx, key in enumerate(companies):
A.add_word(key, idx)
接下来,制作自动机(有关算法的详细信息,请参阅上面的链接):
A.make_automaton()
大!现在,您只需在某些文本中搜索所有公司:
your_text = """
I love my Apple iPhone. Do you know what a Googleplex is?
I ate some apples this morning.
"""
for end_index, idx in A.iter(your_text.lower()):
print(end_index, companies[idx])
这是输出:
15 apple
49 google
74 apple
这些数字对应于文本中公司名称的最后一个字符的索引。
简单,对吗?而且超快,这个算法被GNU grep的一些变种使用。
保存/加载自动机
如果有很多公司名称,创建自动机可能需要一些时间,因此您可能只想创建一次,将其保存到磁盘(使用pickle),然后在每次需要时加载它:
# create_company_automaton.py
# ... create the automaton (see above)
import pickle
pickle.dump(A, open('company_automaton.pickle', 'wb'))
在将使用此自动机的程序中,首先加载自动机:
# use_company_automaton.py
import ahocorasick
import pickle
A = pickle.load(open("company_automaton.pickle", "rb"))
# ... use the automaton
希望这有帮助! :)
奖励详情
如果你想匹配" Apple"在" Apple发布新的iPhone"但是没有在"我今天早上吃了一个苹果",你将会遇到困难。但它是可行的:例如,你可以收集一组包含" apple"关于公司,以及一系列与公司无关的文章,然后确定更有可能与公司有关的单词(或n-gram)(例如" iPhone")。不幸的是,你需要为每个名字不明确的公司做这件事。
答案 2 :(得分:-1)
你可以尝试
difflib.get_close_matches
以完整的公司名称。