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

时间:2017-01-31 21:08:45

标签: python pandas nltk

我有来自数千个网站的原始内容(文本和HTML标记)。最终目标是探索topic modelingclustering。有很多例子说明如何使用Python过滤掉非英语单词,但不幸的是,大部分内容并不适用于我正在使用的语料库。原因如下:

  • 数据集中不包含地理信息,因此无法按English-speaking countries
  • 进行过滤
  • 即使可以推断某些地理数据(例如,.in顶级域名),仍然有可能从该网站提取的文档将包含英文

这就是为什么以下帖子在我的案例中不起作用的原因:

In python, extracting non-English words是一个好的开始,特别是因为它还删除了标点符号,但它仍然包含非英语单词:

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

Extract non-content English language words string - python更多的是关于使用停止词,我已经计划使用,例如:

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

这里有一种可能性...... Python NLTK显示了创建list of all English-language words

的示例
wordlist = [w for w in nltk.corpus.words.words('en') if w.islower()]

然后可以用来过滤令牌......但是,给定的数据量似乎是次优选项。类似的方法是Removing non-english words from a sentence in pythondropping row containing non-english words in pandas dataframe,但同样,使用英语词典逐字逐句匹配似乎过分。

来自notebook demonstrating clustering的示例函数也允许使用非英语语言。

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

在这种情况下,像Etusivu这样的芬兰语单词会通过过滤器。

理想情况下,任何解决方案都不会采用检查语料库中每个单词的方法;话虽如此,我对其他经验丰富的人开放(包括逐字检查): - )

0 个答案:

没有答案