Python:查找一个二元组的词汇
Python: Find vocabulary of a bigram
我有一个推文列表(标记化和预处理)。是这样的:
['AT_TOKEN',
'what',
'AT_TOKEN',
'said',
'END',
'AT_TOKEN',
'plus',
'you',
've',
'added',
'commercials',
'to',
'the',
'experience',
'tacky',
'END',
'AT_TOKEN',
'i',
'did',
'nt',
'today',
'must',
'mean',
'i',
'need',
'to',
'take',
'another',
'trip',
'END']
END 表示推文结束,新推文开始。
我想为这个列表找到二元词汇表,但我很难找到有效的方法。我已经想出如何为这样的 unigram 执行此操作:
unique_words = defaultdict(int)
for i in range(len(data)):
unique_words[data[i]] = 1
return list(unique_words.keys())
问题是我需要先将这个列表转换成双字母组,然后找到那个双字母组的词汇表。
谁能帮我解决这个问题?
对于单个单词,您只需要 set()
(没有 defaultdict
)
unique_words = list(set(data))
print(unique_words)
对于两个单词,您可以使用 for
-loop with data[i:i+2]
和 len(data)-1
(没有 defaultdict
)
all_bigrams = []
for i in range(len(data)-1):
all_bigrams.append( tuple(data[i:i+2]) )
unique_bigrams = list(set(all_bigrams))
print(unique_bigrams)
或直接使用 set()
而不使用 all_bigrams
unique_bigrams = set()
for i in range(len(data)-1):
unique_bigrams.add( tuple(data[i:i+2]) )
unique_bigrams = list(unique_bigrams)
print(unique_bigrams)
三个词相同,但 data[i:i+3]
和 len(data)-2
all_threewords = []
for i in range(len(data)-2):
all_threewords.append( tuple(data[i:i+3]) )
unique_threewords = list(set(all_threewords))
print(unique_threewords)
或直接使用 set()
而不使用 all_threewords
unique_threewords = set()
for i in range(len(data)-2):
unique_threewords.add( tuple(data[i:i+3]) )
unique_threewords = list(unique_threewords)
print(unique_threewords)
完整的工作示例
data = ['AT_TOKEN',
'what',
'AT_TOKEN',
'said',
'END',
'AT_TOKEN',
'plus',
'you',
've',
'added',
'commercials',
'to',
'the',
'experience',
'tacky',
'END',
'AT_TOKEN',
'i',
'did',
'nt',
'today',
'must',
'mean',
'i',
'need',
'to',
'take',
'another',
'trip',
'END']
# ---
unique_words = list(set(data))
print(unique_words)
# ---
all_bigrams = []
for i in range(len(data)-1):
all_bigrams.append( tuple(data[i:i+2]) )
unique_bigrams = list(set(all_bigrams))
print(unique_bigrams)
# ---
unique_bigrams = set()
for i in range(len(data)-1):
unique_bigrams.add( tuple(data[i:i+2]) )
unique_bigrams = list(unique_bigrams)
print(unique_bigrams)
# ---
all_threewords = []
for i in range(len(data)-2):
all_threewords.append( tuple(data[i:i+3]) )
unique_threewords = list(set(all_threewords))
print(unique_threewords)
# ---
unique_threewords = set()
for i in range(len(data)-2):
unique_threewords.add( tuple(data[i:i+3]) )
unique_threewords = list(unique_threewords)
print(unique_threewords)
但我不知道您是否需要像 ('END', 'AT_TOKEN')
这样的配对,或者任何带有 'END'
或 'AT_TOKEN'
的配对。
需要先转换为子列表
data = [
['AT_TOKEN', 'what'],
['AT_TOKEN', 'said', 'END'],
['AT_TOKEN', 'plus', 'you', 've', 'added',
'commercials', 'to', 'the', 'experience',
'tacky', 'END'],
['AT_TOKEN', 'i', 'did', 'nt', 'today',
'must', 'mean', 'i', 'need', 'to', 'take',
'another', 'trip', 'END']
]
然后分别处理每个子列表。
补充 furas 的回答。如果你在 Python 3.10 上,你可以利用 collections.Counter
和 itertools.pairwise
来非常有效地计算双字母组:
from collections import Counter
from itertools import pairwise
# c = Counter(zip(data, data[1:])) on Python < 3.10
c = Counter(pairwise(data))
print(c)
输出:
Counter({('END', 'AT_TOKEN'): 2, ('AT_TOKEN', 'what'): 1, ('what', 'AT_TOKEN'): 1, ('AT_TOKEN', 'said'): 1, ('said', 'END'): 1, ...
Counter
就像字典一样工作,但使用一些有用的方法对其进行了扩展。参见 https://docs.python.org/3/library/collections.html#collections.Counter
我有一个推文列表(标记化和预处理)。是这样的:
['AT_TOKEN',
'what',
'AT_TOKEN',
'said',
'END',
'AT_TOKEN',
'plus',
'you',
've',
'added',
'commercials',
'to',
'the',
'experience',
'tacky',
'END',
'AT_TOKEN',
'i',
'did',
'nt',
'today',
'must',
'mean',
'i',
'need',
'to',
'take',
'another',
'trip',
'END']
END 表示推文结束,新推文开始。
我想为这个列表找到二元词汇表,但我很难找到有效的方法。我已经想出如何为这样的 unigram 执行此操作:
unique_words = defaultdict(int)
for i in range(len(data)):
unique_words[data[i]] = 1
return list(unique_words.keys())
问题是我需要先将这个列表转换成双字母组,然后找到那个双字母组的词汇表。
谁能帮我解决这个问题?
对于单个单词,您只需要 set()
(没有 defaultdict
)
unique_words = list(set(data))
print(unique_words)
对于两个单词,您可以使用 for
-loop with data[i:i+2]
和 len(data)-1
(没有 defaultdict
)
all_bigrams = []
for i in range(len(data)-1):
all_bigrams.append( tuple(data[i:i+2]) )
unique_bigrams = list(set(all_bigrams))
print(unique_bigrams)
或直接使用 set()
而不使用 all_bigrams
unique_bigrams = set()
for i in range(len(data)-1):
unique_bigrams.add( tuple(data[i:i+2]) )
unique_bigrams = list(unique_bigrams)
print(unique_bigrams)
三个词相同,但 data[i:i+3]
和 len(data)-2
all_threewords = []
for i in range(len(data)-2):
all_threewords.append( tuple(data[i:i+3]) )
unique_threewords = list(set(all_threewords))
print(unique_threewords)
或直接使用 set()
而不使用 all_threewords
unique_threewords = set()
for i in range(len(data)-2):
unique_threewords.add( tuple(data[i:i+3]) )
unique_threewords = list(unique_threewords)
print(unique_threewords)
完整的工作示例
data = ['AT_TOKEN',
'what',
'AT_TOKEN',
'said',
'END',
'AT_TOKEN',
'plus',
'you',
've',
'added',
'commercials',
'to',
'the',
'experience',
'tacky',
'END',
'AT_TOKEN',
'i',
'did',
'nt',
'today',
'must',
'mean',
'i',
'need',
'to',
'take',
'another',
'trip',
'END']
# ---
unique_words = list(set(data))
print(unique_words)
# ---
all_bigrams = []
for i in range(len(data)-1):
all_bigrams.append( tuple(data[i:i+2]) )
unique_bigrams = list(set(all_bigrams))
print(unique_bigrams)
# ---
unique_bigrams = set()
for i in range(len(data)-1):
unique_bigrams.add( tuple(data[i:i+2]) )
unique_bigrams = list(unique_bigrams)
print(unique_bigrams)
# ---
all_threewords = []
for i in range(len(data)-2):
all_threewords.append( tuple(data[i:i+3]) )
unique_threewords = list(set(all_threewords))
print(unique_threewords)
# ---
unique_threewords = set()
for i in range(len(data)-2):
unique_threewords.add( tuple(data[i:i+3]) )
unique_threewords = list(unique_threewords)
print(unique_threewords)
但我不知道您是否需要像 ('END', 'AT_TOKEN')
这样的配对,或者任何带有 'END'
或 'AT_TOKEN'
的配对。
需要先转换为子列表
data = [
['AT_TOKEN', 'what'],
['AT_TOKEN', 'said', 'END'],
['AT_TOKEN', 'plus', 'you', 've', 'added',
'commercials', 'to', 'the', 'experience',
'tacky', 'END'],
['AT_TOKEN', 'i', 'did', 'nt', 'today',
'must', 'mean', 'i', 'need', 'to', 'take',
'another', 'trip', 'END']
]
然后分别处理每个子列表。
补充 furas 的回答。如果你在 Python 3.10 上,你可以利用 collections.Counter
和 itertools.pairwise
来非常有效地计算双字母组:
from collections import Counter
from itertools import pairwise
# c = Counter(zip(data, data[1:])) on Python < 3.10
c = Counter(pairwise(data))
print(c)
输出:
Counter({('END', 'AT_TOKEN'): 2, ('AT_TOKEN', 'what'): 1, ('what', 'AT_TOKEN'): 1, ('AT_TOKEN', 'said'): 1, ('said', 'END'): 1, ...
Counter
就像字典一样工作,但使用一些有用的方法对其进行了扩展。参见 https://docs.python.org/3/library/collections.html#collections.Counter