【问题标题】:Stemming full strings on Python在 Python 上提取完整的字符串
【发布时间】:2017-12-24 01:17:31
【问题描述】:

我需要对葡萄牙语字符串执行词干提取。为此,我使用 nltk.word_tokenize() 函数对字符串进行标记,然后分别对每个单词进行词干处理。之后,我重建字符串。它工作正常,但表现不佳。我怎样才能让它更快?字符串长度约为200万字。

    tokenAux=""
    tokens = nltk.word_tokenize(portugueseString)
        for token in tokens:
            tokenAux = token
            tokenAux = stemmer.stem(token)    
            textAux = textAux + " "+ tokenAux
    print(textAux)

抱歉英语不好,谢谢!

【问题讨论】:

    标签: python nlp nltk stemming


    【解决方案1】:

    string 是不可变的,所以如果字符串很长,每次都更新字符串不是一个好习惯。 link here 解释了连接字符串的各种方法并显示了性能分析。因为迭代只进行一次,所以最好选择generator expression 而不是list comprehension。有关详细信息,您可以查看discussion here 。在这种情况下,使用 generator expressionjoin 会有所帮助:

    对长字符串使用my_textlen(my_text) -> 444399

    使用timeit进行比较:

    %%timeit
    tokenAux=""
    textAux=""
    tokens = nltk.word_tokenize(my_text)
    for token in tokens:
        tokenAux = token
        tokenAux = stemmer.stem(token)    
        textAux = textAux + " "+ tokenAux
    

    结果:

    1 loop, best of 3: 6.23 s per loop
    

    generator expressionjoin 一起使用:

    %%timeit 
    ' '.join(stemmer.stem(token) for token in nltk.word_tokenize(my_text))
    

    结果:

    1 loop, best of 3: 2.93 s per loop
    

    【讨论】:

    • @yuridamata 太好了! Happy Coding.
    【解决方案2】:

    字符串对象在 Python 中是不可变的。查看您的代码:

    textAux = ""
    for token in tokens:
        # something important ...
        textAux = textAux + " "+ tokenAux
    

    每次您在循环中创建一个新字符串并将其分配给textAux 变量时。这效率不高。

    我会将tokenAux 元素存储在一个列表中,最后加入它们。看例子:

    tokenAux = []  # we declare list for storing tokens
    tokens = nltk.word_tokenize(portugueseString)
    for token in tokens:
        tokenAux = token
        tokenAux = stemmer.stem(token)    
        textAux.append(tokenAux)  # we add new token into the resulting list
    
    result = " ".join(textAux)  # join list using space as separator
    print(result)
    

    比较性能并与我们分享:)

    有用的链接:

    【讨论】:

      【解决方案3】:

      您可以将字符串作为文本文件读入,然后使用PySpark 执行必要的操作来阻止每个单词。这将允许您并行执行操作。

      您也可以使用multiprocessing module

      【讨论】:

      • PySpark 真的有内置的葡萄牙语词干分析器吗?
      • 我不确定。 PySpark 没有理由不能与 NLTK 结合使用。 @lenz
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 2021-05-19
      • 1970-01-01
      相关资源
      最近更新 更多