我们有一个给定的列表:
list_of_versions = ['apple II' ,'apple', 'apple 1' , 'HD APPLE','apple 3.5', 'adventures of apple' , 'apple III','orange 2' ,'300mhz apple', '300-orange II' , 'orange II HD' , 'orange II tvx', 'orange 2' , 'HD berry-vol 2', 'berry II', 'berry 2', 'berry VI', 'berry 1', 'berry II' ,'berry' ,'II Berry']
如何找到每个字符串的主要单词?例如:
word | main
--------------------------
apple II |apple
val/apple |apple
apple 1 |apple
HD APPLE |apple
apple 3.5 |apple
adventures of apple |apple
apple III |apple
300mhz apple |apple
orange 2 |orange
300-orange II |orange
orange II HD |orange
/orange/II-tvx |orange
orange 2 |orange
HD berry-vol 2 |berry
berry-II |berry
-berry-2 |berry
(berry) VI |berry
berry 1 |berry
berry II |berry
berry 2022 B8 |berry
II Berry-hd |berry
22 Berry II |berry
Berry 6.8.9 |berry
要点:
我无法创建包含三个主要单词(apple、orange、berry)的主要单词列表。因为列表将使用新的主要单词进行更新。所以我们永远不会知道什么是新词。
版本没有限制。在某些时候,我们可以看到像“apple XII”或“GB-HD berry 2.4”这样的东西,所以版本价值可以决定一切。(如果你想创建一个停用词列表)
很高兴(但不是强制性的)--> 添加另一个显示版本的列。IE:
word | main | version
-----------------------------------
apple II |apple | II
val/apple |apple | NULL
apple 1 |apple | 1
HD APPLE |apple | HD
apple 3.5 |apple | 3.5
apple III |apple | III
300mhz apple II |apple | II
orange 2 |orange | 2
300-orange II |orange | II
orange II HD |orange | II HD
/orange/II-tvx |orange | II tvx
orange 2 |orange | 2
HD berry-vol 2 |berry | 2 HD
berry-II |berry | II
-berry-2 |berry | 2
(berry) VI |berry | VI
berry 1 |berry | 1
berry II |berry | II
berry 2022 |berry | NULL
II Berry-hd |berry | II HD
22 Berry |berry | 22
Berry 6.8.9 |berry | 6.8.9
所有其他答案都省略了包含“冒险”一词的条目,因为它会引发搜索。您需要一个可以将“最长”与“最频繁”结合起来的启发式方法。
有帮助的一件事是,在每一行中找到最长的单词会大大提高 SNR。换句话说,它很好地过滤掉了不必要的单词,只需要一点帮助。如果您知道要查找多少个单词(在本例中为三个),则一切就绪:
from collections import Counter
common_long_words = [word.casefold() for word in (max(re.findall('\\w+', version), key=len) for version in list_of_versions)]
words = Counter(common_long_words).most_common(3)
拆分版本并找到感兴趣的单词并不是特别困难。关于版本的构成,您有几个选择,尤其是当主词嵌入短语中间时。这是一个简单的函数,它取整个余数:
def split_main(version, words):
for word in words:
i = version.find(word)
if i > 0:
return word, f'{version[:i]} {version[i + len(word)]}'
else:
raise ValueError(f'Version "{version}" does not contain any of the main words {{{", ".join(words)}}}')
result = {version: split_main(version, words) for version in list_of_versions}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句