在csv中检查语言的快速方法

时间:2018-01-31 13:11:00

标签: python-3.x pandas csv nltk

我有一个巨大的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

1 个答案:

答案 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,或者只是删除有问题的名词/动词以获得更准确的读数。这些是你需要自己测试的东西。