我对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来处理空单元格,然后转换为处理其他东西,如数字等。