我有一个巨大的csv文件,一列包含不同语言的摘要行。我的目标是整理那些不是用英文写的段落。 我不介意一些单词是否排序错误。
我目前的代码正在运作,但我仍然是初学者,我担心..这不是真正的速度。这意味着它需要很长时间,因为我有大约8万行,我想我下周还会坐在这里等待。 我已经检查了解决方案,但没有发现任何对我有用的东西,因为使用的langdetections似乎只是为了少量数据。
import langdetect
import nltk
import pandas as pd
from nltk.corpus import stopwords
from nltk.corpus import gutenberg
from nltk.tokenize import word_tokenize
test = pd.read_csv("file.csv", sep='\t',header=0,index_col=False, quoting=csv.QUOTE_NONE, usecols = ("TI","AB","PY","DI"),dtype = str)
stop_e = stopwords.words('english')
worte = gutenberg.words()
for line in test["AB"]:
if type(line) == str:
tokens = word_tokenize(line)
for token in tokens:
if token.isalpha()and token not in stop_e and not in worte:
在此之后,我目前正在打印东西以检查我的代码到目前为止是否正常工作。
编辑。这已经快了,因为我跳过纯粹英语的行。但正如评论中指出的那样:我仍在逐字删除,因为我不知道如何删除整个段落。
for line in alle["AB"]:
if type(line) == str:
if detect(line) == 'en':
pass
else:
tokens = word_tokenize(line)
for token in tokens:
if token.isalpha()and token not in stop_e and token not in worte:
#del word
你有任何改进的想法吗?我想我的问题是每个单词都用整个Gutenberg-corpus检查。但是有更快的方法吗?
使用from nltk.corpus import words
作为语料库代替Gutenberg似乎更快但不显着。
我的数据框示例。 AB中的摘要在这里都是英文,但我想抛弃任何德国/西班牙语/其他成为csv的人。
TI AB PY DI
83009 Disability and inclusive education in times of... When communities fall into decline, disabled p... 2014 10.1080/01425692.2014.919845
83010 Transforming marginalised adult learners' view... Adult learners on Access to Higher Education c... 2014 10.1080/01425692.2014.919842
83011 Home education, school, Travellers and educati... The difficulties Traveller pupils experience i... 2014 10.1080/01425692.2014.919840
83012 Promoting online deliberation quality: cogniti... This research aims to contribute to the theory... 2014 10.1080/1369118X.2014.899610
83013 Living in an age of online incivility: examini... Communication scholars have examined the poten... 2014 10.1080/1369118X.2014.899609
答案 0 :(得分:2)
你提到的评论想要删除整个段落。我将如何处理它。在您的第一个代码段中import langdetect
,但实际上并未使用它。 langdetect.dectect()
可以占用整个字符串。你不需要拆分单词。例如:
langdetect.detect('using as example')
# output
'en'
通过不将整个字符串分成单个单词,这将减少时间。这是由于detect()
没有为每个字调用。以下是我将如何处理它的一个小样本:
import pandas as pd
import langdetect
# creating a sample dataframe
df1 = pd.DataFrame({'Sentence':['es muy bueno','run, Forest! Run!','Ήξερα ότι θα εξετάζατε τον Μεταφραστή Google', 'This is Certainly en']})
# calling detect on each sentence
df1['Language'] = df1['Sentence'].apply(lambda x: langdetect.detect(x))
# filtering the entire dataset for only english
filtered_for_english = df1.loc[df1['Language'] == 'en']
# output
Sentence Language
3 This is Certainly en en
但这是使用langdetect
的缺点......它是Google从Java到Python According to the Docs的语言检测端口。译者并不总是正确的:
查看通过langdetect.detect('run, Forest! Run!')
传递的英国电影 Forest Gump 中的流行短语。这将为罗马尼亚语返回ro
。您可以尝试删除标点符号,停用词,stemming and lemmatizing,或者只是删除有问题的名词/动词以获得更准确的读数。这些是你需要自己测试的东西。