我有一个说清单,10,000个字符串(A)。我也有一个单词矢量(V)。
我想要做的是修改A的每个字符串,只保留字符串中存在于V中的那些单词并删除其他单词。
例如,假设A的第一个元素是"one two three check test"
。 V是向量["one", "test", "nine"]
。因此,A的第一个元素的修改版本应该看起来像"one test"
。对于每一串A,需要重复整个过程。对于每次比较,V将保持相同。
我正在做类似跟随的事情(这可能有一些错误,但我只是想知道我是如何处理这个问题的。)
for i in range(len(A)):
a = []
text = nltk.word_tokenize(A[i])
for i in range(len(text)):
if text[i] in V:
a.append(text[i])
a = " ".join(a)
A['modified_string'][i] = a
以上方式非常缓慢且效率低下。我怎样才能快速有效地实现它?
答案 0 :(得分:0)
单个A [0]项目
$ awk -F"[: ]+" '{for(i=1;i<NF;i+=2){$i+=20000; printf "%s:%s ",$i,$(i+1)} print ""}' cs.txt
20002:1 20003:1 20004:2 20005:1 20007:2 20034:1 20037:3
20004:2 20006:1 20008:1 20023:1 20025:2 20030:1
答案 1 :(得分:0)
这是我的尝试:
>>> A = ["aba reer sdasd bab", "adb bab ergekj aba erger"]
>>> V = ["aba","bab"]
>>> map((lambda z: ' '.join(z)), map((lambda x: filter(lambda y: y in V, x.split())), A))
['aba bab', 'bab aba']
复杂性非常糟糕,但要改进它你必须给我们更多的细节,比如V与A的元素相比有多长,你想要在选择之后将这些单词按原始顺序等等。它可以使用集合可以更快地完成,但单词将不是原始顺序。
答案 2 :(得分:0)
了解
A = ["one two three check test", "one nine six seven", "one two six seven"]
A_modified = list()
V = ["one", "test", "nine"]
V_set = set(V)
for line in A:
text = set(line.split()) # or use NLTK, here I just wanted something that runs on all installs
A_modified.append(list(text.intersection(V_set)))
请注意line = list(text.intersection(V_set))
因不变性而无效
修改强>:
范围蔓延:-)您的原始问题不够具体,但如果您想保留订单以及非唯一元素,我会使用 list comprehension 执行此操作:
for line in A:
A_modified += [[word for word in line.split() if word in V]]
答案 3 :(得分:0)
集合似乎是适当的数据结构:
A = ["aba reer sdasd bab", "adb bab ergekj aba erger", "aba", "bab" ]
V = ["aba","bab"]
vset = set(V)
for i in A:
print tuple(set(i.split()).intersection(vset))