from nltk import word_tokenize
list_1 = [a, b, c, d, e, f]
list_2 = [[aa, bb, cc], [dd, ee], [ff], [gg, hh, ii, jj], [kk, ll], [mm, nn, oo]]
text = 'The lazy aa moves along the hh'
text_token = word_tokenize(text)
for word in text:
if word in [j for i in list_2 for j in i]:
print(list_2.index(word))
else:
print(word)
ValueError: 'hh' is not in list
我正在尝试对大量法语文本进行文本分析。我已经尝试过使用NLTK Stemmer,它并没有阻止我正在分析的大量单词。
我不熟悉python或任何其他编码语言(我来自人文科学)所以我也不完全确定如何搜索我正在寻找的问题,如果这个问题多余或容易解决,我会道歉。
我试图通过查找具有各种语法形式的法语单词列表来解决这个问题。我已经将列表编译成两个单独的列表:第一个列表包含我希望其他人使用的单词的根,而第二个列表是第一个列表中的项目可以采用的变体表单。我已经做到了这两个列表彼此对应。例如,list_1[0]
将对应list_2[0]
中的字词。因此,list_2中有许多不同长度的嵌套列表。
当我搜索嵌套列表时,似乎出现了我的问题。我必须遍历text_token
以检查text_token
中是否存在list_2
中的任何字词。如果text_token
中存在list_2
,则会找到misc = list_2.index(word)
。找到misc
后,我想用搜索list_1[misc]
替换单词。但是,在确认list_2
中存在该单词后,我尝试print(list_2.index(word))
查看它是否有效,但我一直在接收ValueError: 'hh' is not in list
我不完全确定如何在嵌套列表之后循环已经这样做是为了避免这个错误,因为我假设当我第二次搜索定义时,它不会将嵌套列表视为多个项目。我试图通过在原始列表中检查后尝试另一个列表理解来避免这种情况,但最终会返回单个字母。我也尝试将这两个列表放入字典中,但我似乎无法弄清楚如何从.keys()
中获得.values()
。
答案 0 :(得分:0)
如果要获取主列表中子列表的索引,可以执行以下操作:
for word in text:
for index, sublist in enumerate(list_2):
if word in sublist:
print(index)
break
else:
print(word)
enumerate(list_2)
遍历list_2的元素,这些元素是您的子列表,并在每一步产生子列表的索引和子列表本身。
然后,我们检查该单词是否在其中一个子列表中。
break
打印出内部for
循环。else
循环的for
部分并打印该字词。答案 1 :(得分:0)
你真的只想要一张地图,即dict
。您可以使用以下字典理解*:
rootmap = {var:root for root, variants in zip(list1, list2) for var in variants}
然后你可以使用:
print(rootmap.get(word, word))
这使用.get
方法,如果找不到第一个参数,则将第二个值作为默认值。另外,dict
成员资格测试比检查列表更有效,它是一个恒定时间操作,而对于列表成员资格测试是线性操作。如果您在list2
中使用多次变量,则这一点变得更加重要。
*也可以使用for循环编写等价物:
rootmap = {}
for root, variants in zip(list1, list2): # iterate over your lists in parallel
for var in variants:
rootmap[var] = root
<强>买者强>:
详细了解documentation中dict
的内容。请注意,dict
将地图唯一键映射到值。