从语料库中去除非英语单词

mea*_*ngs 5 python nltk pandas

我有来自数千个网站的原始内容(文本和 HTML 标记)。最终目标是探索主题建模聚类。有很多关于如何使用 Python 过滤掉非英语单词的示例,但不幸的是,大多数示例都不适用于我正在使用的语料库。几个原因:

  • 数据集中不包含地理信息,因此不能仅按英语国家过滤
  • 即使可以推断出某些地理数据(例如,.in顶级域),从该站点提取的文档仍有可能包含英文

这就是为什么以下帖子在我的情况下不太适用的原因:

在python中,提取非英语单词是一个好的开始,特别是因为它也去除了标点符号,但它仍然包含非英语单词:

import pandas as pd
from pandas import Series, DataFrame

In  [1]: test_str = Series(['?', 'hello','?????','Yo!','??? ???','+44 designer','{{appDetails.title}} {{"TERM','The Pen Company ?',np.nan,' Shopping Cart:0 Log In/Register'])

In  [2]: test_str.str.findall('[^\W]+')
Out [2]:
0                                       [?]
1                                   [hello]
2                                   [?????]
3                                      [Yo]
4                                [???, ???]
5                            [44, designer]
6                 [appDetails, title, TERM]
7                       [The, Pen, Company]
8                                       NaN
9    [Shopping, Cart, 0, Log, In, Register]
dtype: object
Run Code Online (Sandbox Code Playgroud)

提取非内容的英语单词字符串——python更多地是关于使用停用词,我已经计划使用,例如:

from nltk.corpus import stopwords
english_stops = stopwords.words('english')
vect = CountVectorizer(max_features=10000,max_df=.2,stop_words=english_stops)
Run Code Online (Sandbox Code Playgroud)

不过这里有一种可能性……Python NLTK 显示了一个创建所有英语单词列表的示例:

wordlist = [w for w in nltk.corpus.words.words('en') if w.islower()]
Run Code Online (Sandbox Code Playgroud)

然后可以使用它来过滤令牌……但是,考虑到数据量似乎是次优选项。类似的方法是从 python 中的句子中删除非英语单词在 pandas 数据框中删除包含非英语单词的行,但同样,使用英语词典逐字匹配似乎过度。

演示集群笔记本中的示例函数也允许通过非英语语言。

def tokenize_only(text):
    # first tokenize by sentence, then by word to ensure that punctuation is caught as it's own token
    tokens = [word.lower() for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)]
    filtered_tokens = []
    # filter out any tokens not containing letters (e.g., numeric tokens, raw punctuation)
    for token in tokens:
        if re.search('[a-zA-Z]', token):
            filtered_tokens.append(token)
    return filtered_tokens
Run Code Online (Sandbox Code Playgroud)

在这种情况下,芬兰语单词 likeEtusivu将通过过滤器。

理想情况下,任何解决方案都不会采用检查语料库中每个单词的方法;话虽如此,我愿意接受其他有更多经验的人所采取的任何方式(包括逐字检查):-)