如何在带有短句的大型数据集中有效地使用spacy?

王力:

我选择spacy来处理各种文本,因为与nltk相比,它具有lemmatation的性能。但是,当我处理数百万个短文本时,它总是消耗掉我所有的内存(32G)并崩溃了。没有它,仅需几分钟,而消耗的内存不足10G。

使用此方法有问题吗?有没有更好的解决方案来提高性能?谢谢!

def tokenizer(text):
    try:
        tokens = [ word for sent in sent_tokenize(text) for word in word_tokenize(sent)]
        tokens = list(filter(lambda t: t.lower() not in stop_words, tokens))
        tokens = list(filter(lambda t: t not in punctuation, tokens))
        tokens = list(filter(lambda t: len(t) > 4, tokens))
        filtered_tokens = []
        for token in tokens:
            if re.search('[a-zA-Z]', token):
                filtered_tokens.append(token)

        spacy_parsed = nlp(' '.join(filtered_tokens))
        filtered_tokens = [token.lemma_ for token in spacy_parsed]
        return filtered_tokens
    except Exception as e:
        raise e

达拉斯并行计算

ddata = dd.from_pandas(res, npartitions=50)
def dask_tokenizer(df):
    df['text_token'] = df['text'].map(tokenizer)
    return df
%time res_final = ddata.map_partitions(dask_tokenizer).compute(get=get)

有关spaCy的信息

spaCy version      2.0.5          
Location           /opt/conda/lib/python3.6/site-packages/spacy
Platform           Linux-4.4.0-103-generic-x86_64-with-debian-stretch-sid
Python version     3.6.3          
Models             en, en_default 
pmbaumgartner:

您可以在杂乱中使用多线程来创建快速的令牌化和数据接收管道。

使用该nlp.pipe方法重写代码块和功能将如下所示:

import spacy
nlp = spacy.load('en')

docs = df['text'].tolist()

def token_filter(token):
    return not (token.is_punct | token.is_space | token.is_stop | len(token.text) <= 4)

filtered_tokens = []
for doc in nlp.pipe(docs):
    tokens = [token.lemma_ for token in doc if token_filter(token)]
    filtered_tokens.append(tokens)

这种方式将您所有的过滤都放到token_filter函数中,该函数接收一个spacy令牌,并且True仅当它不是标点,空格,停用词和4个或更少的字符时才返回然后,在遍历每个文档中的每个标记时使用此函数,只有在满足所有这些条件的情况下,该标记才返回引理。然后,filtered_tokens是您的标记化文档的列表。

定制此管道的一些有用参考将是:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在数据集中有效地重命名列(Spark 2.0)

如何在使用ecto变更集中有效地重命名属性之前

如何使用leanback库在Android TV中有效地实现大型单个列表

如何有效地从大型数据集中获取指定窗口内数据的平均值?

如何在熊猫中有效地加入/合并/连接大数据框?

如何在Python中有效地将参数解译到数据库

如何在C ++ 11中有效地返回大数据

如何在matlab中有效地对数据进行bin

如何在 Neo4j 中有效地摄取数据

有效地计算大型数据集中的共现

如何使用 PySpark 将这么多 csv 文件(大约 130,000 个)有效地合并到一个大型数据集中?

如何使用python在pandas数据帧中有效地迭代行

如何在Java中有效地使用常量值初始化数组

如何在 Cython 中有效地使用 Python 风格的整数?

如何在测验中有效地使用结构?

如何在Dask分布式环境中有效地提交带有大参数的任务?

有效地重塑大型数据集

如何在python中有效地合并两个具有容差的数据帧

如何有效地训练具有大型图像数据集的 CNN 模型

如何有效地操作大型numpy数组

如何有效地按组汇总(具有多个输出)数据集中的列?

如何最有效地从大型 SQLite 数据库中提取数据?

如何有效地分辨ga_sessions_intraday_中有可用的新数据

如何在 Matlab 中有效地计算单个有限差分?

如何在R中有效地附加列表的所有元素

如何在R中有效地联接具有多个主键的表?

如何在熊猫数据框中有效地存储分数列表和按日期分组

如何在mysql DB中有效地存储和搜索每分钟数据?

如何在Python中有效地在多个线程和进程之间共享数据?