我有一组乳胶格式的输入段落。我想从他们那里创造一袋文字。
采取一组看起来像这样的人:
"Some guy did something with \emph{ yikes } $ \epsilon $"
我想出一本字典:
{
"Some": 40,
...
"yikes": 10
"epsilon (or unicode for it)": 3
}
那就是我需要一个字典,其中键组是所有段落中的单词/符号/方程组(我为了简洁起见所有这些单词)以及它们在所有段落中出现的计数好。
从那里给出k-ordered-tuple的单词,我需要一个k-array用于每个段落,其中数组中的第i个元素表示该段落中第i个元组中单词的计数。
所以说(Some, dunk, yikes, epsilon)
会给我
[1, 0, 1, 1]
表示所述示例。
我已经尝试过使用词法分析器来获取令牌并直接处理令牌。这很难且容易出错,更不用说慢了。是否有更好的策略或工具可以做到这一点?
特殊字符需要考虑一些极端情况:
G\""odel => Gödel
例如,。我想保留这些。
另外,我想将所有方程式放在一起或将它们保持为一个单词。方程出现在$ ... $符号之间。
答案 0 :(得分:2)
如果我理解正确,您正尝试执行以下操作:
将句子分成单词:
s = "Some guy did something with \emph{ yikes } \epsilon"
words = s.split()
print words
输出:
['Some', 'guy', 'did', 'something', 'with', '\\emph{', 'yikes', '}', '\\epsilon']
计算出现次数:
from collections import Counter
dictionary = Counter(words)
print dictionary
输出:
Counter({'did': 1, '}': 1, '\\epsilon': 1, 'Some': 1, 'yikes': 1, 'something': 1, 'guy': 1, 'with': 1, '\\emph{': 1})
将单词及其对应的数字作为单独的列表进行访问:
print dictionary.keys()
print dictionary.values()
输出:
['did', '}', '\\epsilon', 'Some', 'yikes', 'something', 'guy', 'with', '\\emph{']
[1, 1, 1, 1, 1, 1, 1, 1, 1]
请注意,我还没有处理任何单词。您可能想要删除括号或反斜杠。但是这可以通过使用for循环遍历字典(或列表)并单独处理每个条目来轻松完成。
将LaTeX变音符号转换为unicode字符在某种程度上是一个全新的问题。关于此主题,有几个stackoverflow问题和答案。也许你只需要在初始字符串中找到/替换它们:
s = s.replace('\\"o', unichr(252))
(请注意,根据您的命令行编码,您可能看不到带有print s
的变音符号。但它们不会丢失,可以使用print repr(s)
显示。)
要保留方程式,您可以使用正则表达式而不是split
拆分字符串:
import re
print re.findall('\$.+\$|[\w]+', s)
输出:
['Some', 'guy', 'did', 'something', 'with', 'emph', 'yikes', '$ \\epsilon $']
有关类似示例和更详细的说明,请参阅my answer to another question。