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