从 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 以处理空单元格,然后转换以处理其他内容,如数字等。
我对 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 以处理空单元格,然后转换以处理其他内容,如数字等。