Python 上的完整字符串

Stemming full strings on Python

我需要对葡萄牙语字符串进行词干提取。为此,我使用 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)

抱歉英语不好,谢谢!

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

您也可以使用 multiprocessing module.

字符串对象在 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)

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

有用的链接:

  • Why are Python strings immutable? Best practices for using them
  • Explain Python .join()

string 是不可变的,所以如果字符串很长,每次都更新字符串不是一个好习惯。 link here explains various ways to concatenate string and shows performance analysis. And since, the iteration is done only once, it is good to choose generator expression over list comprehension. For details you can look into 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