如何使用 nltk 从大文本语料库中仅提取英文单词?

Posted

技术标签:

【中文标题】如何使用 nltk 从大文本语料库中仅提取英文单词?【英文标题】:How to extract only English words from a from big text corpus using nltk? 【发布时间】:2018-05-24 17:00:38 【问题描述】:

我想从文本语料库中删除所有非字典英语单词。我已经删除了停用词,对数据进行了标记化和计数向量化。我只需要提取英文单词并将它们附加回数据框。

data['Clean_addr'] = data['Adj_Addr'].apply(lambda x: ' '.join([item.lower() for item in x.split()]))
        data['Clean_addr']=data['Clean_addr'].apply(lambda x:"".join([item.lower() for item in x if  not  item.isdigit()]))
        data['Clean_addr']=data['Clean_addr'].apply(lambda x:"".join([item.lower() for item in x if item not in string.punctuation]))
        data['Clean_addr'] = data['Clean_addr'].apply(lambda x: ' '.join([item.lower() for item in x.split() if item not in (new_stop_words)]))
        cv = CountVectorizer( max_features = 200,analyzer='word')
        cv_addr = cv.fit_transform(data.pop('Clean_addr'))

我正在使用的文件的示例转储

https://www.dropbox.com/s/allhfdxni0kfyn6/Test.csv?dl=0

【问题讨论】:

你如何定义英语?应该删除像 Zaaba 和 Robeco 这样的专有名称吗?您需要多大的英语词典(OED 有几十万字,英语***有几百万个独特的标记,其中一些可能不是英语)? @tripleee 我要删除专有名称和中文名称 @pankaj,为了让你的算法识别一个单词是中文还是英文,你需要定义一个包含英文/中文单词的数据库,你的算法可以在它找到的单词之间进行比较数据库中的单词。请注意,如果不定义什么是中文单词,什么是英文单词,您的算法无法自行计算出这些内容。 @Flika205,我们可以在 NLTK 中为您提供英文单词语料库 【参考方案1】:

在你第一次标记你的文本语料库之后,你可以改为stem单词标记

import nltk
from nltk.stem.snowball import SnowballStemmer

stemmer = SnowballStemmer(language="english")

SnowballStemmer

正在执行算法stemming 词干只是将单词分解成词根的过程。 通过argument 'english'   ↦   porter2 stemming 算法 更准确地说,这个“英语”参数   ↦   stem.snowball.EnglishStemmerporter2 词干分析器被认为是 better than 原来的 porter 词干分析器)

stems = [stemmer.stem(t) for t in tokenized]  

上面,我定义了一个列表推导式,执行如下:

    列表理解循环遍历我们的标记化输入list 标记化tokenized 也可以是任何其他可迭代的输入实例) 列表理解的作用是使用SnowballStemmer 实例对每个标记化的单词执行.stem 方法stemmer 列表理解然后收集英语词干集 即,它是一个应该收集词干英语单词标记的列表

警告:  列表理解可能包括某些 相同 其他语言中的屈折词,因为 porter2 会错误地认为它们是英语单词

【讨论】:

词干会将英文单词分解为词根。在我的情况下,我只想保留英文单词而不是分解成词根。示例 Xan high secondary school 应输出为higher secondary school 在这种情况下,您可以只嵌套列表理解的操作。即,循环标记化的单词并布尔检查词干分析器实例是否确实返回了某些内容,然后将相应的原始单词添加到某个列表/容器中。有机会时会尝试编写代码。 ,我试过了,但没用,如果它对你有用。你能更新代码吗? 我尝试了建议的代码,但非英语单词并没有逃脱,它们的词干本身就是初始词@user188466【参考方案2】:

深入本质

我也有非常相似的需求。您的问题出现在我的搜索中。觉得我需要进一步看,我找到了THIS。我针对我的特定需求做了一些修改(只有大量技术数据表中的英文单词 = 没有数字或测试标准或值或单位等)。经过其他方法的痛苦之后,以下方法奏效了。我希望它可以成为您和其他人的一个很好的起点。

import nltk
from nltk.corpus import stopwords
words = set(nltk.corpus.words.words())
stop_words = stopwords.words('english')


file_name = 'Full path to your file'
with open(file_name, 'r') as f:
    text = f.read()
    text = text.replace('\n', ' ')

new_text = " ".join(w for w in nltk.wordpunct_tokenize(text)
                    if w.lower() in words
                    and w.lower() not in stop_words
                    and len(w.lower()) > 1)

print(new_text)

【讨论】:

以上是关于如何使用 nltk 从大文本语料库中仅提取英文单词?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NLTK 检查不可读的 OCRed 文本

识别文本中的重要单词和短语

在 scikit-learn 中使用 nltk 搭配作为特征

自然语言处理——NLTK文本语料库

python+NLTK 自然语言学习处理四:获取文本语料和词汇资源

NLTK学习笔记:文本语料资源和WordNet汇总