2

我很抱歉发布这个,但我已经浪费了很多时间来解决这个问题。因此,一个正则表达式 + Python 挑战是一个和所有的:

我正在处理大多数定期格式化的数据。公司列表组合成一个字符串,如

`Company Inc,Company, LLC,Company` 

没有引号来描述条目。使用上面的常规示例,我可以执行以下操作:

>>> re.split(r',\b', 'Company Inc,Company, LLC,Company')                                                                                                                                                                                    
['Company Inc', 'Company, LLC', 'Company']

不幸的是,一些字符串的格式不规则,例如:

`IBP, Inc,Tyson Foods,Inc.`

其中不被空格,Inc隔开。Foods所以,使用r',\b',我得到这个:

>>> re.split(r',\b', 'IBP, Inc,Tyson Foods,Inc.')
['IBP, Inc', 'Tyson Foods', 'Inc.']

我想得到这个:

['IBP, Inc', 'Tyson Foods,Inc.']

在这个情况下,你会怎么做?

4

4 回答 4

5

如果知道,您可以将拆分预防字符串添加到负前瞻

r',\b(?!Inc\.)'
于 2013-02-22T23:04:05.353 回答
1

I would make a first split on the comma to get lists such as:

['IBP', 'Inc', 'Tyson Foods', 'Inc.']

and then do a second pass through the data where highly improbable company names such as 'Inc', 'Inc.', 'LLC', 'GmbH', etc. get combined with the previous entry in the list:

badList = originalData.split(',')
goodList = []
rejectList = ['Inc', 'Inc.', 'LLC', 'GmbH'] # etc.

for pseudoName in badList:
   pseudoName = pseudoName.strip()
   if pseudoName in rejectList:
      goodList[-1] = goodList[-1] + ", " + pseudoName
   else:
      goodList.append(pseudoName)

This method would also let you do more sophisticated manipulations if you later find that your data has entries such as "Farmers Group, The" and put the articles in the right place.

于 2013-02-22T23:34:55.777 回答
1

用稍微不同的术语来表达 Mike M 的回答,如果您可以构建一个可靠的非相关标记列表,例如“Inc.”、“Inc”和“LLC”,那么您可能有一种解析方法。即使那样,您也可能不会得到像 split() 这样的自动功能来为您工作。你可能不得不自己动手。

于 2013-02-22T23:09:19.350 回答
0

这取决于您必须弄清楚的条目数。基本上,就高质量数据而言,你被搞砸了。这意味着您尝试应用的任何自动化都将在处理您的数据时遇到问题。

您将不得不手动修复此问题,以恢复数据质量。数据质量问题是计算机很难处理的问题之一。

我个人会做的是编写一个快速而肮脏的启发式方法来尝试确定不符合预期结果的条目。例如,在您的示例中,我会查找“Inc”或“LLC”加上或减去几个字符的拆分条目。这将捕获似乎没有提供比公司类型更多的条目。你会赶上“公司”。并且知道真实的公司名称必须在附近。

完成后,您可以手动清理数据并重新处理。当您可以证明将此类纠正措施作为程序的一部分编写时,这是对数以百万计的条目的最佳选择。但是,除非你是谷歌,否则几乎可以保证你会发现它是最快最容易看到它的。

于 2013-02-22T22:52:05.140 回答