如何加快一系列文档中键的存在总和? - 熊猫,nltk

Posted

技术标签:

【中文标题】如何加快一系列文档中键的存在总和? - 熊猫,nltk【英文标题】:How to speed up the sum of presence of keys in the series of documents? - Pandas, nltk 【发布时间】:2018-03-22 00:04:02 【问题描述】:

我有一个数据框列,其中包含类似

的文档 38909 酒店是老式的红屋顶,没有蜂... 38913 我永远不会再住在这家酒店了。一世 ... 38914 在公共汽车上待了几个小时,最后...... 38918 我们对在 Blu Aqua 的住宿感到很兴奋... 38922 这家酒店地理位置优越,如果您想... 名称:描述,数据类型:对象

我有一袋像keys = ['Hotel','old','finally']这样的词,但keys = 44312的实际长度

目前正在使用

df.apply(lambda x : sum([i in x for i in keys ]))

根据示例键给出以下输出

38909 2 38913 2 38914 3 38918 0 38922 1 名称:描述,数据类型:int64

当我将它应用于实际数据仅 100 行时,它给出了

1 loop, best of 3: 5.98 s per loop

我有 50000 行。在 nltk 或 pandas 中是否有更快的方法来做同样的事情。

编辑: 万一寻找文档数组

array([ 'Hotel is an old style Red Roof and has not been renovated up to the new standard, but the price was also not up to the level of the newer style Red Roofs. So, in overview it was an OK stay, and a safe',
   'I will never ever stay at this Hotel again. I stayed there a few weeks ago, and I had my doubts the second I checked in. The guy that checked me in, I think his name was Julio, and his name tag read F',
   "After being on a bus for -- hours and finally arriving at the Hotel Lawerence at - am, I bawled my eyes out when we got to the room. I realize it's suppose to be a boutique hotel but, there was nothin",
   "We were excited about our stay at the Blu Aqua. A new hotel in downtown Chicago. It's architecturally stunning and has generally good reviews on TripAdvisor. The look and feel of the place is great, t",
   'This hotel has a great location if you want to be right at Times Square and the theaters. It was an easy couple of blocks for us to go to theater, eat, shop, and see all of the activity day and night '], dtype=object)

【问题讨论】:

在你的实际情况下keys有多少个元素? 我补充说大约有45000键 那么,对于 EDIT 示例,输出将是:[2, 1, 2, 0, 0],对吗?您在寻找区分大小写的输出吗? 是的。并且不太担心区分大小写不区分大小写也可以。 什么是键?喜欢词汇? 【参考方案1】:

以下代码并不完全等同于您的(慢)版本,但它展示了这个想法:

keyset = frozenset(keys)
df.apply(lambda x : len(keyset.intersection(x.split())))

差异/限制:

    在您的版本中,即使某个单词作为子字符串包含在文档中的某个单词中,它也会被计算在内。例如,如果您的 keys 包含单词 tyl,则由于在您的第一个文档中出现了“样式”,它会被计算在内。 我的解决方案没有考虑文档中的标点符号。例如,第二个文档中的单词again 来自split(),并附有句号。这可以通过使用删除标点符号的函数预处理文档(或对split() 的结果进行后处理)来解决。

【讨论】:

TBH 我正在使用 set。让我试试frozenset版本。 @Bharathshetty 我不认为 setfrozenset 会产生太大差异,如果有的话 忘了说我的方法失败了。你的方法超级快。 是的。如果您只是像您问题中的代码那样迭代集合的元素,那么使用setkeys 是没有意义的。这个解决方案是要走的路。【参考方案2】:

看来你可以用np.char.count -

[np.count_nonzero(np.char.count(i, keys)) for i in arr]

提供一个布尔数组进行计数可能会更好 -

[np.count_nonzero(np.char.count(i, keys)!=0) for i in arr]

【讨论】:

我认为 numpy 在字符串方面很慢。虽然我学到了一些新东西 @Bharathshetty 是的,就是这样。【参考方案3】:

如果只需要检查列表的当前值:

from numpy.core.defchararray import find

v = df['col'].values.astype(str)
a = (find(v[:, None], keys) >= 0).sum(axis=1)
print (a)
[2 1 1 0 0]

或者:

df = pd.concat([df['col'].str.contains(x) for x in keys], axis=1).sum(axis=1)
print (df)
38909    2
38913    1
38914    1
38918    0
38922    0
dtype: int64

【讨论】:

我的内核在尝试我的方法时崩溃了。重新启动它。很快就会拿出速度比较。 我不明白你。键作为列表列表? 不不不,所有单词都是单动词,用空格分隔。没有短语 我已经把它放在了 45000 左右的问题中 嗯,可能像第一行一样重复 Hotel is an old style Red Hotel and has not bee.

以上是关于如何加快一系列文档中键的存在总和? - 熊猫,nltk的主要内容,如果未能解决你的问题,请参考以下文章

子文档 MongoDB 中键的不同值(1 亿条记录)

取熊猫系列中每 N 行的总和

熊猫系列的部分总和

如何更新嵌套字典中键的值?

如何替换 Python 中键的值?

如何获取 couchdb 中键的值