当前位置: 首页 > 面试题库 >

通过从熊猫数据框中检查来替换单词

曹泉
2023-03-14
问题内容

我有一个数据框如下。

ID  Word       Synonyms
------------------------
1   drove      drive
2   office     downtown
3   everyday   daily
4   day        daily
5   work       downtown

我正在阅读一个句子,并想用上面定义的同义词替换该句子中的单词。这是我的代码:

import nltk
import pandas as pd
import string

sdf = pd.read_excel('C:\synonyms.xlsx')
sd = sdf.apply(lambda x: x.astype(str).str.lower())
words = 'i drove to office everyday in my car'

#######

def tokenize(text):
    text = ''.join([ch for ch in text if ch not in string.punctuation])
    tokens = nltk.word_tokenize(text)
    synonym = synonyms(tokens)
    return synonym

def synonyms(words):
    for word in words:
        if(sd[sd['Word'] == word].index.tolist()):
            idx = sd[sd['Word'] == word].index.tolist()
            word = sd.loc[idx]['Synonyms'].item()
        else:
            word
    return word

print(tokenize(words))

上面的代码将输入句子标记化。我想实现以下输出:

i drove to office everyday in my car
i drive to downtown daily in my car

但是我得到的输出是

car

如果我跳过该synonyms函数,那么我的输出将没有问题,并且将分成单个单词。我试图了解我在synonyms函数中做错了什么。另外,请告知是否有更好的解决方案。


问题答案:

我会利用Pandas / NumPy索引。由于您的同义词映射是多对一的,因此您可以使用该Word列重新编制索引

sd = sd.applymap(str.strip).applymap(str.lower).set_index('Word').Synonyms
print(sd)



Word
drove          drive
office      downtown
everyday       daily
day            daily
Name: Synonyms, dtype: object

然后,您可以轻松地将标记列表与其各自的同义词对齐。

words = nltk.word_tokenize(u'i drove to office everyday in my car')
sentence = sd[words].reset_index()
print(sentence)



       Word  Synonyms
0         i       NaN
1     drove     drive
2        to       NaN
3    office  downtown
4  everyday     daily
5        in       NaN
6        my       NaN
7       car       NaN

现在,仍然可以使用的令牌Synonyms,回溯到Word。这可以通过以下方式实现

sentence = sentence.Synonyms.fillna(sentence.Word)
print(sentence.values)



[u'i' 'drive' u'to' 'downtown' 'daily' u'in' u'my' u'car']


 类似资料:
  • 我有一个空单元格的数据框,并希望用NaN替换这些空单元格。之前在这个论坛上提出的解决方案有效,但前提是单元格包含一个空间: 当单元格为空时,此代码不起作用。有人建议用熊猫代码来代替空细胞吗?

  • 问题内容: 我正在尝试学习熊猫,但请对以下内容感到困惑。我想用行平均值替换NaN是一个数据框。因此,类似的东西应该可以工作,但是由于某种原因,它对我来说是失败的。我是否想念任何东西,我做错了什么?是因为其未执行; 但是这样的事情看起来很好 问题答案: 如评论所述,fillna的axis参数为NotImplemented。 注意:这在这里很重要,因为您不想用第n行平均值填写第n列。 现在,您需要遍历

  • 问题内容: 我有很多行的python pandas数据框。从这些行中,我想切出并且仅使用“ body”列中包含单词“ ball”的行。为此,我可以这样做: 问题是,我希望它不区分大小写,这意味着如果出现Ball或bAll一词,我也希望它们。进行不区分大小写的搜索的一种方法是将字符串转换为小写,然后以这种方式搜索。我想知道如何去做。我试过了 但这是行不通的。我不确定是否应该在此等性质上使用lambd

  • 问题内容: 我有两个具有以下列名称的数据框: 我想通过加入(左)on获得以下列的数据框: 如果我要连接的列不是索引,我无法弄清楚该怎么做。最简单的方法是什么?谢谢! 问题答案: 您可以按以下方式使用left_on和right_on选项: 从问题中我不能确定您是否只想合并密钥是否位于左侧数据框中。如果是这种情况,则以下将执行此操作(以上内容实际上会进行多对多合并)

  • 问题内容: 我想知道是否有某种方式将所有DataFrame负数替换为零? 问题答案: 如果所有列都是数字列,则可以使用布尔索引: 对于更一般的情况,此答案显示了private方法: 使用类型,布尔索引似乎可以在单独的列上工作,但不能在整个数据帧上工作。因此,您可以执行以下操作: 更新: 与整个DataFrame上的作品进行比较:

  • 问题内容: 我想查看数据框内特定列中是否存在特定字符串。 我遇到了错误 ValueError:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。 问题答案: 将返回大小为布尔值的指标向量 因此,您可以使用 或者,如果您不在乎有多少条记录与您的查询匹配