从CSV - NLTK中删除非英语单词



我对Python和NLTK比较陌生,并且持有存储在CSV中的Flickr数据,并且希望从标签列中删除非英语单词。我一直得到错误说"期望一个字符串或一个类似字节的对象"。我有一种感觉,这与标签列目前是Pandas Series数据类型而不是String有关。但是,当转换为字符串时,我在Stack上看到的相关解决方案都不起作用。

我有这样的代码:

#converting pandas df to string
filtered_new = df_filtered_english_only.applymap(str)
#check it's converted to string
from pandas.api.types import is_string_dtype
is_string_dtype(filtered_new['tags'])
filtered_new['tags'].dropna(inplace=True)
tokens = filtered_new['tags'].apply(word_tokenize)
#print(tokens)
#remove non-English tags
#initialise corpus of englihs word from nltk
words = set(nltk.corpus.words.words())
" ".join(w for w in nltk.word_tokenize(df_filtered_english_only["tags"]) 
if w.lower() in words or not w.isalpha())

有什么办法解决这个问题吗?

一般来说:你应该给出你的数据集的一个例子。

列"标签"的前一个内容是什么?标签是如何分开的?"无标签"是怎么回事?表示和"空列表"有区别吗?和"NAN" ?

我认为标签可以包含多个单词,所以这很重要,当它涉及到删除非英语单词时也是如此。

但是为了简单起见,我们假设只有一个单词的标记,并且它们之间用空格分隔,因此每行内容都是一个字符串。另外,让我们假设空行(没有标记)具有熊猫(numpy.NaN)的默认NA值。由于您可能使用pandas读取文件,因此一些值可能已自动转换为数字。

设置:

import numpy
import pandas
import nltk
df = pandas.DataFrame({"tags": ["bird dog cat xxxyyy", numpy.NaN, "Vogel Hund Katze xxxyyy", 123]})
>                       tags
0      bird dog cat xxxyyy
1                      NaN
2  Vogel Hund Katze xxxyyy
3                      123

删除NA行并标记:

df.dropna(inplace=True)
tokens = df["tags"].astype(str).apply(nltk.word_tokenize)
> 0        [bird, dog, cat, xxxyyy]
2    [Vogel, Hund, Katze, xxxyyy]
3                           [123]
Name: tags, dtype: object

按已知单词过滤,始终允许非alpha:

words = set(nltk.corpus.words.words())
filtered = [" ".join(w for w in row if w.lower() in words or not w.isalpha()) for row in tokens]
> ['bird dog cat', '', '123']

代码中的主要问题可能是由于您对嵌套列表进行了平面迭代(您已经进行了标记,因此现在pandas Series中的每一行都是一个列表)。如果您像我在示例中那样将迭代修改为嵌套,则代码应该运行。

在删除NAs之前,你也不应该做字符串转换(无论是.astype(str)还是任何其他方式),因为这样NAs会变成类似'nan'的东西,不会被删除。首先放下NA来处理空单元格,然后转换为处理其他东西,如数字等。

最新更新