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 expression
和 join
可能会有所帮助:
对长字符串使用 my_text
:len(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 expression
与 join
一起使用:
%%timeit
' '.join(stemmer.stem(token) for token in nltk.word_tokenize(my_text))
结果:
1 loop, best of 3: 2.93 s per loop
我需要对葡萄牙语字符串进行词干提取。为此,我使用 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 expression
和 join
可能会有所帮助:
对长字符串使用 my_text
:len(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 expression
与 join
一起使用:
%%timeit
' '.join(stemmer.stem(token) for token in nltk.word_tokenize(my_text))
结果:
1 loop, best of 3: 2.93 s per loop