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

Removing Non-English Words from CSV - NLTK

我对 Python 和 NLTK 比较陌生,并且拥有存储在 CSV 中的 Flickr 数据,并且想从标签列中删除非英语单词。我不断收到错误提示“需要一个字符串或一个类似字节的对象”。我感觉这与标签列当前属于 Pandas 系列数据类型而不是字符串有关。但是,none 我在 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”有区别吗?

我假设标签可以包含多个词,所以这很重要,在删除 non-english 个词时也是如此。

但为了简单起见,我们假设只有 one-word-tags 并且它们由空格分隔,因此每行内容都是一个字符串。我们还假设空行(无标签)具有 pandas (numpy.NaN) 的默认 NA 值。并且由于您可能阅读了带有 pandas 的文件,因此某些值可能是 auto-converted 到数字。

设置:

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

按已知词过滤,始终允许 non-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 系列中的每一行都是一个列表)。如果您像我在示例中所做的那样将迭代修改为嵌套,则代码应该 运行.

此外,在删除 NA 之前,您永远不应该进行字符串转换(无论是 .astype(str) 还是任何其他方式),因为那样 NA 将变成 'nan' 之类的东西并且不会被删除。首先删除 NA 以处理空单元格,然后转换以处理其他内容,如数字等。